Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Schnelles kopieren eines Byte[]
Sascha M.
myCSharp.de - Member



Dabei seit:
Beiträge: 145
Herkunft: Nordhessen

Themenstarter:

Schnelles kopieren eines Byte[]

beantworten | zitieren | melden

Hi,

was ist Eurer Meinung die schnellste Möglichkeit ein byte[] in ein anderes zu kopieren? Im Moment verwende ich Buffer.BlockCopy. Es kann auch ruhig unsafe oder ein API Aufruf sein. Das ist nicht so wichtig. Performance ist das einzig wichtige Kriterium.

Gruß
Sascha
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5989
Herkunft: Leipzig

beantworten | zitieren | melden

Hi Sascha,

suchst du die Array.CopyTo Methode?

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
Sascha M.
myCSharp.de - Member



Dabei seit:
Beiträge: 145
Herkunft: Nordhessen

Themenstarter:

beantworten | zitieren | melden

Hi,

habe ich schon getestet. Performance ist etwa schlechter als mit Buffer.BlockCopy.
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

    [Jede Menge Sicherheitschecks...]
    if (count > 0) {
        // Call our faster version of memmove, not the CRT one.
        m_memmove(dst->GetDataPtr() + dstOffset, src->GetDataPtr() + srcOffset, count);
    }

[Deutlich mehr Abfragen und Sicherheitschecks]
if (r == AssignWillWork)
        {
            src = (BYTE*)gc.pSrc->GetDataPtr();
            dst = (BYTE*)gc.pDst->GetDataPtr();
            size = gc.pSrc->GetMethodTable()->GetComponentSize();
            g_IBCLogger.LogMethodTableAccess(gc.pSrc->GetMethodTable());
            m_memmove(dst + ((m_iDstIndex - destLB) * size), src + ((m_iSrcIndex - srcLB) * size), m_iLength * size);
            if (gc.pDst->GetMethodTable()->ContainsPointers())
            {
                GCHeap::GetGCHeap()->SetCardsAfterBulkCopy( (Object**) (dst + (m_iDstIndex * size)), m_iLength * size);
            }        
        }

Beide methoden benutzen "Reflection" (wenn auch in der nativen=schnelleren Variante), um zu prüfen, ob die Operation gültig ist.

Ich denke RtlMoveMemory könnte schneller sein, weil die ganzen Abfragen zur Laufzeit wegfallen.

Ansonsten gibts an platformunabängigen sachen noch cpblk, welches aber äußerst umständlich zu benutzen ist, oder man kann was eigenes mit unsafe schreiben, was dann aber tendenziell eher langsamer ist.

Fazit: Buffer.BlockCopy ist bequem und relativ schnell, ansonsten probier mal RtlMoveMemory.

Dennoch interressiert es mich, ob es nicht einen besseren weg gäbe dein Ziel zu erreichen, als massenweise Bytearrays umzokopieren. Dazu musst du aber mal den Anwendungsfall nennen!
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Floste am .
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers
Sascha M.
myCSharp.de - Member



Dabei seit:
Beiträge: 145
Herkunft: Nordhessen

Themenstarter:

beantworten | zitieren | melden

Der Anwendungsfall sieht so, dass ich eine gepackte Datei habe. Genauer gesagt, sind Blöcke darin gepackt und die muss ich zur Laufzeit entpacken. Ich muss z.B. Block 10 -12 entpacken und vom entpackten Block 10 ab Byte x bis Block 12 Byte y zurückgeben.

Gruß
Sascha
private Nachricht | Beiträge des Benutzers
weismat
myCSharp.de - Member



Dabei seit:
Beiträge: 878
Herkunft: Frankfurt am Main

beantworten | zitieren | melden

Ich denke, Du musst schauen, dass Deine Funktionen ueberall mit den gleichen Parametern wie Buffer.Copy arbeiten -d.h. immer byte[], offset und Nutzlaenge benutzen, so dass Du immer mit dem relevanten Ausschnitt arbeitest, ohne jemals zu kopieren...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von weismat am .
private Nachricht | Beiträge des Benutzers
Floste
myCSharp.de - Member

Avatar #avatar-2376.jpg


Dabei seit:
Beiträge: 1158
Herkunft: Norddeutschland

beantworten | zitieren | melden

Wenn die Daten an einem stück liegen ist das sicherleich die beste möglichkeit, aber wenn (wovon ich ausgegangen bin) die daten in mehreren häppchen fragmentiert sind, dann wird das sehr schnell sehr unhandlich.
Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!
private Nachricht | Beiträge des Benutzers