Re: byte[] resizen? (vergleich der Methoden)

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Thomas Scheidegger [MVP] (spam.netmaster_at_swissonline.ch)
Date: 01/20/05


Date: Thu, 20 Jan 2005 12:58:55 +0100


> ich habe mir deine Aussage noch angesehen und möchte gerne wissen wie du das
> untermauerst.
> [MethodImpl(MethodImplOptions.InternalCall)]
> public static extern void BlockCopy(Array src, int srcOffset, Array dst, int
> dstOffset, int count);
> sollten diese Methoden nicht gleich effizient sein?

ich hab den konkreten Performance - Unterschied nicht gemessen,
   (dürfte nicht sehr gross sein)
aber BlockCopy ist spezifisch für 'primitive type' - Arrays optimiert :

Wenn ich etwa den Rotor/SSCLI-Source anschaue
    http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/clr/vm/comutilnative_8cpp-source.html
  Buffer::BlockCopy
dann werden dort nur die Array-Grössen überprüft,
dann mittels einer native m_memmove die Daten im Speicher 1:1 kopiert.
    http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/clr/vm/comsystem_8cpp-source.html

Die Array.Copy ist viel universeller,
kann auch Element für Element kopieren und dabei ggf auch boxing/unboxing
oder Type-widening machen.
Daher gibt es wohl etwas Overhead.
Siehe Rotor, SystemNative::ArrayCopy
   http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/clr/vm/comsystem_8cpp-source.html
Der eigentliche Kopiervorgang geschieht (falls identische Value-Type Array-Typen)
dann auch per native m_memmove.

Rotor SSCLI:
   http://msdn.microsoft.com/net/sscli/
wobei nicht 100% mit der .NET 1.1 Runtime vergleichbar...

-- 
 Thomas Scheidegger - MVP .NET - 'NETMaster'
 http://www.cetus-links.org/oo_dotnet.html - http://dnetmaster.net/