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

  • We've moved!

    We've moved!

    7 Ocak 2008
  • HuskyStarcraft

    HuskyStarcra

    4 HAZİRAN 2009
  • Maschine Tutorials

    Maschine Tut

    15 ŞUBAT 2011