Clone() i ToArray() są składniowo miłe, bo nie trzeba wstępnie przydzielić tablicy docelowej, ale pod względem wydajności, Array.Copy() to najszybsza metoda (patrz poniżej zastrzeżenie).
Powód, dla którego Array.Copy() jest tak szybki, nie alokuje żadnej pamięci. Jeśli jednak chcesz, aby twoje tablice były kopiowane do nowego regionu pamięci za każdym razem, to Array.Copy() nie jest już najszybszą metodą.
Oto moje WYNIKI:
Copy: 0 ms
Copy (with allocation): 449 ms
Clone: 323 ms
ToArray: 344 ms
A oto kod użyłem:
const int arrayLength = 100000;
const int numberCopies = 1000;
var a = new int[arrayLength];
var b = new int[arrayLength];
var stopwatch = new Stopwatch();
for (var i = 0; i < numberCopies; i++) {
Array.Copy(a, b, arrayLength);
}
Console.WriteLine($"Copy: {stopwatch.ElapsedMilliseconds} ms");
stopwatch.Restart();
for (var i = 0; i < numberCopies; i++) {
var c = new int[arrayLength];
Array.Copy(a, c, arrayLength);
}
Console.WriteLine($"Copy (with allocation): {stopwatch.ElapsedMilliseconds} ms");
stopwatch.Restart();
for (var i = 0; i < numberCopies; i++) {
b = (int[]) a.Clone();
}
Console.WriteLine($"Clone: {stopwatch.ElapsedMilliseconds} ms");
stopwatch.Restart();
for (var i = 0; i < numberCopies; i++) {
b = a.ToArray();
}
Console.WriteLine($"ToArray: {stopwatch.ElapsedMilliseconds} ms");
Nie można po prostu użyć 'Array.Copy'? –
powinien być sposobem na skopiowanie całej pamięci bezpośrednio ... w C++ http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-ofements-from-anar- –
http: // stackoverflow.com/questions/5655553/whats-the-najbardziej-skuteczny-way-to-copy-elements-of-ac-ostro-wielowymiarowych-arr –