2016-05-09 21 views
6

Performansım kritik olduğu için başvurumu hızlandırmaya çalışıyorum ... yani her milisaniye buradan daha iyi olabilir. Bunu yapmak için, diğer bazı yöntemleri çağıran bir yöntem var ve bu diğer yöntemlerin her biri Stopwatch zamanlayıcı ve Console.WriteLine çağrıları ile sarılır. Yani .: Ben kodu çalıştırır Stopwatch ve Console.WriteLine satırları herConsole.WriteLine kodumu hızlandırıyor mu?

private void SomeMainMethod() 
{ 
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
    sw.Start(); 
    SomeMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

    sw.Reset(); 
    sw.Start(); 
    SomeOtherMethod(); 
    sw.Stop(); 
    Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

    //... 
} 

sorundur yaklaşık 20ms (değil 50) ihtiyacım olanı için bir çok şey var ki yavaş.

Bunun nedenini bilen var mı?

DÜZENLEME: sınıf SomeMainMethod yöntemi ve diğerleri ayrıca, yukarıda benzer bir Stopwatch ve Console.WriteLine aramaları sarılır.

SomeMainMethod ve çağırdığı yöntemler, tümü tek iş parçacığı olan bir konsol test yatağından çağrılan bir Sınıf Kitaplığının parçası olan bir sınıfın bir parçasıdır.

Daha fazla bilgi için: Uygulama, x86 .NET 4.6.1 sürüm modunda optimizasyonlar etkinken çalışıyor. Ben de bunu 2013 dışında görsel stüdyosunda çalıştırıyorum.

+1

Bu garip ses garip geliyor .. Fark ettim ki hız gibi değişiklikler fark ettim – BugFinder

+1

Eğer Kronometreyi kullanmıyorsanız, aynı yolla saati ölçemezsiniz. Bunu açıkladın mı? – stuartd

+1

@stuartd ama kronometreyi kaldırarak ve daha yavaş *, * daha yavaş * göstererek bunu söylüyor? Yani daha az kod – BugFinder

cevap

2

Yanıtsız çok benzer bir question okuduktan sonra sorunu bulmuş olabilirim.

Gerçekten büyük bir tahmindir: yorum bölümünde, bir kullanıcı (ForguesR) şu yorumu yapmıştır Eğer WriteLine senkronize edilir çünkü iplik daha işlemci zamanını alır IO yazma ve böylece diğer konuları engelliyor belki.

NOT: Bu gerçekten durumda olsaydı ben şu sevmeye SomeMainMethod değiştirdiğim için çok

yüzden kontrol etmek istedim Genellikle iplik öncelikleri ile uğraşmak tavsiye edilmez, bu sadece bir oldu teoriyi test etmek için geçici çözüm. Ne yaptığınızı bildiğinizden% 100 emin değilseniz, bunu üretim kodunda yapmaya şiddetle tavsiye ederim. O zaman muhtemelen ondan uzak durun. Console ve Stopwatch çizgiler dışarı yorumladı zaman bu benim kodunu değiştirmek yaptıktan sonra

private void SomeMainMethod() 
{ 
    System.Threading.ThreadPriority tp = System.Threading.ThreadPriority.Normal; 
    try 
    { 
     tp = System.Threading.Thread.CurrentThread.Priority; 

     System.Threading.Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Highest; 

     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     sw.Start(); 
     SomeMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeMethod = {0}ms", sw.ElapsedMilliseconds); 

     sw.Reset(); 
     sw.Start(); 
     SomeOtherMethod(); 
     sw.Stop(); 
     Console.WriteLine("Time for SomeOtherMethod= {0}ms", sw.ElapsedMilliseconds); 

     //... 
    } 
    finally 
    { 
     System.Threading.Thread.CurrentThread.Priority = tp; 
    } 
} 

şimdi sürekli daha hızlı (~ 10ms) çalıştırır. Bu yüzden yorumunun muhtemelen en azından benim durumumda olduğuna inanıyorum.

+0

İlgilenmiyorum, ne olursa olsun yüzlerce kez SomeMethod gerçekleştirecektik. Benim tahminime göre, CPU ile uğraşmak suçluyu suçluyor (Console.Write tarafından iyileşmiş gibi görünüyor). Yüksek Performans modunda mısınız? Dengeli modun bir saniye sürmesi “dönecek” - ve aynı zamanda tam turbo hızından da utangaç olacaktır. Ve 10ms'in sizin için önemli bir zaman olduğunu söylüyorsunuz, ancak kodun daha yavaş bir bilgisayarda çalıştırılması durumunda 10ms kolayca tanıtılacak. – Patrick

+0

@Patrick PC'm çok kötüyse, kod asla daha kötü bir şekilde çalıştırılmamalıdır. Ve kodu yeniden başlatmadan çok kez çalıştırdım – TheLethalCoder

İlgili konular