SORU
23 Mart 2012, Cuma


Neden AddRange daha hızlı foreach döngü kullanmak daha iyidir?

var fillData = new List<int>();
for (var i = 0; i < 100000; i  )
{
     fillData.Add(i);
}

var stopwatch1 = new Stopwatch();
stopwatch1.Start();
var autoFill = new List<int>();
autoFill.AddRange(fillData);
stopwatch1.Stop();

var stopwatch2 = new Stopwatch();
stopwatch2.Start();
var manualFill = new List<int>();
foreach (var i in fillData)
{
    manualFill.Add(i);
}
stopwatch2.Stop();

Aldığım zaman4stopwach1 stopwach2, stopwatch1 sonuçları stopwatch2 den her zaman daha düşük bir değere sahiptir. O addrange Her zaman daha hızlı foreach daha demektir. Nedenini bilen var mı?

CEVAP
23 Mart 2012, Cuma


Eğer Add, kullanıyorsanız gerektiği gibi iç dizi yavaş yavaş (iki katına), 10 varsayılan başlangıç boyutu (IIRC) yeniden boyutlandırma. Eğer kullanıyorsanız:

var manualFill = new List<int>(fillData.Count);

Radikal (/ veri kopyalamak artık yeniden boyutlandırır) değişecek bekliyorum.

Reflektör, AddRange Bu, DAHİLİ olarak iki katına büyüyen yerine yapar:

ICollection<T> is2 = collection as ICollection<T>;
if (is2 != null)
{
    int count = is2.Count;
    if (count > 0)
    {
        this.EnsureCapacity(this._size   count);
        // ^^^ this the key bit, and prevents slow growth when possible ^^^

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008
  • trickycharms

    trickycharms

    6 Aralık 2013