2013-11-04 17 views
5

, ben Shlemiel the painter's algorithm benchmarking ile eğlenmeyi oldu. Boş bir dize ile başladım, 1000 boş alandan bir tane daha oluşturdum ve her seferinde ne kadar sürdüğünü zamanla düz eski verimsiz dizgi birleştirmeyi kullanarak diğerine eklemeye başladım.Bu artışa, dizgi birleştirme sırasında neden olan nedir? Yani merak ve boşta sıkıntıdan

string s1 = ""; 
string s2 = ""; 
while (s2.Length < 1000) 
{ 
    s2 += " "; 
} 

while (true) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    s1 += s2; 
    sw.Stop(); 

    Console.WriteLine(" {0}| {1}", s1.Length, sw.ElapsedMilliseconds); 
} 

Beklendiği gibi, daha uzun dize var, o kadar uzun (beklediğimden çok daha küçük etkisi oldu, ama bu başka bir gün için başka bir soru) bitiştirmek aldı. Ne şaşırtıcı oldu, ancak geçen sürede tutarlı ani oldu. Altıncı ayinlerin her biri, önceki beş birleştirmeden yaklaşık iki ila üç kez aldı.

Length  | Time (ms) 
----------------------- 
32250000 | 117 
32251000 | 44 
32252000 | 31 
32253000 | 30 
32254000 | 30 
32255000 | 32 
32256000 | 129 
32257000 | 35 
32258000 | 43 
32259000 | 34 
32260000 | 30 
32261000 | 29 
32262000 | 107 
32263000 | 47 
32264000 | 29 
32265000 | 30 
32266000 | 31 
32267000 | 29 
32268000 | 110 
32269000 | 46 
32270000 | 31 
32271000 | 30 
32272000 | 30 
32273000 | 30 
32274000 | 113 

Bu örnekler, dizenin büyük ölçüde artmaya başlamasından sonra ortaya çıkar, ancak desen başlangıçtan itibaren tutulur. Büyük ölçüde, ilk bin ya da öylesine numune, deseni farketmek için çok küçüktür, ancak 1.8k işaretinin etrafında tanınabilirdir.

İlk varsayımım, sahnelerin ardında, karakterlerin bir dolu ArrayList/vektör türü anlaşmada depolanmasıydı, bu tam dolu olduğunda boyutu ikiye katlıyordu, ancak daha fazla düşündüğümden, bu uygun değil - durum buysa, spike doğrusal olmak yerine üstel periyotlarda gelirdi.

Yani, kısacası: burda neler oluyor?

+0

Muhtemelen çöp toplama. Gerçekten ilgileniyorsanız bir profiler çalıştırmayı deneyin; Korkarım ki tahmin edemeyiz. – CodeCaster

+0

GC, her altıncı iterasyonda gerçekleşecek kadar tutarlı mıdır (tüm veri kümesi için tutarlı olduğu varsayılarak)? – Polynomial

cevap

3

dizeleri oluşturma ve bunları atarak çöp oluşturur. Belli bir miktar bellek kullandıktan sonra çöp koleksiyonları oluşur ve işleminizi duraklatır. Prosesinizde başka hiçbir şey olmadığından ve her zaman dizelerinizi aynı uzunlukta yaptığınız için, GC her zaman aynı anda olur (her 6 koşuda).

, sizin zamanlama bu etkiyi önlemek her kaçak zamanlayıcı başlamadan önce GC.Collect çağırın.

İlgili konular