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

  • Dopelives

    Dopelives

    30 Temmuz 2009
  • sghaff1

    sghaff1

    23 Mart 2009
  • ThePhestor

    ThePhestor

    22 Mart 2011