Varolan diziye yeni bir öğe eklemenin en hızlı yolu nedir?Bir Diziye Öğe eklemenin en hızlı yolu
Dim arr As Integer() = {1, 2, 3}
Dim newItem As Integer = 4
(Zaten öğelerin dinamik listesi ile çalışırken oldukça kullanması gerektiğini biliyorum bir List
, ArrayList
veya benzeri IEnumerables
. Eğer diziler kullanan eski koduna takılıp Ama ne yapmalı?)
:
' A) converting to List, add item and convert back
Dim list As List(Of Integer)(arr)
list.Add(newItem)
arr = list.ToArray()
' --> duration for adding 100.000 items: 33270 msec
' B) redim array and add item
ReDim Preserve arr(arr.Length)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 9237 msec
' C) using Array.Resize
Array.Resize(arr, arr.Length + 1)
arr(arr.Length - 1) = newItem
' --> duration for adding 100.000 items: 1 msec
' --> duration for adding 100.000.000 items: 1168 msec
A) bir öğe bütün dizinin iki dönüşüm eklenen her zaman yapılır beri çok yavaş görünüyor. B) daha hızlı görünüyor ama hala dizi ReDim Preserve
sırasında bir kez kopyalanır. C) bu noktada en hızlı gibi görünüyor. Daha iyi bir şey var mı? Daha fazla bilgi için
çalışır değil, sana mango ile elma karşılaştırma olduğunu düşünüyorum: kimse ilk alternatif kullanmak ister. Bir listenin avantajlarından biri, yeni öğeleri ne kadar hızlı ekleyebileceğinizdir (diziye dönüştürme işlemini yapmazsanız, öğeyi ekleyin, diğer alternatiflerden daha hızlı olduğunu görürsünüz): Sadece hızlı bir şekilde öğe eklemekle ilgilenir, bir liste kullanır (hiç bir diziye güvenmeyin). Ayrıca liste, öğelerin, dizilerin izin verdiğinden daha fazla denetlenmesini/endekslenmesini sağlar. AMA bundan başka, saf performansta (örneğin döngüler içinde), çok daha kötüler ... – varocarbas
Özet: en iyi durumlarda dizileri ve listeleri kullanın. VB.NET'in yeniden boyutlandırmaya izin vermesine rağmen, bu bir dizinin geçmesi beklenen bir şey değildir: diziler, sabit boyutlu koşullar altında en iyi performansı sunar, sadece kendi öğeleri içinde tekrar tekrar tekrar ortaya çıkar. Diğer taraftan, listeler daha az yinelemeli bir tedavi içindir: daha az sayıda eleman, boyutlarda düzenli değişiklikler, elemanlara erişmek için fantezi sorgular, vb. Tüm bunlar dizilerin çok iyi olmadığı fonksiyonlardır. Böylece, sabit büyüklükteki koşullar altında performans için Diziler; Koşulları değiştirmek için listeler. – varocarbas
PS: Listeler daha az bellek verimli. – varocarbas