VB.NET 2010 ile hesaplamalı yoğun bir program yazıyorum ve hızı optimize etmek istiyorum. İşlemin sınıf düzeyi değişkenine atanması durumunda AndAlso
ve OrElse
operatörlerinin anormal derecede yavaş olduğunu görüyorum. Örneğin, ifadeleriAndAlso OrElse anormal derecede yavaş olabilir
a = _b AndAlso _c
_a = a
, derlenmiş exe
_a = _b AndAlso _c
yaklaşık 80 makine devir alır tek deyimi aralarında yaklaşık 6 makine döngülerini alırken. Burada _a
, _b
ve _c
Özel Boolean değişkenleri Form1
'dır ve söz konusu ifadeler, örneğinin bir örneğidir, bunların a
yerel bir Boole değişkenidir.
Tek deyimin neden bu kadar uzun sürdüğünü bulamıyorum.
Instruction Explanation Stack
00: ldarg.0 Push Me (ref to current inst of Form1) Me
01: ldarg.0 Push Me Me, Me
02: ldfld bool Form1::_b Pop Me, read _b and push it _b, Me
07: brfalse.s 11 Pop _b; if false, branch to 11 Me
09: ldarg.0 (_b true) Push Me Me, Me
0a: ldfld bool Form1::_c (_b true) Pop Me, read _c and push it _c, Me
0f: brtrue.s 14 (_b true) Pop _c; if true, branch to 14 Me
11: ldc.i4.0 (_b, _c not both true) Push result 0 result, Me
12: br.s 15 Jump unconditionally to 15 result, Me
-----
14: ldc.i4.1 (_b, _c both true) Push result 1 result, Me
15: stfld bool Form1::_a Pop result and Me; write result to _a (empty)
1a:
kimse deyimi _a = _b AndAlso _c
80 makine döngülerini yerine öngörülen 5 ya da öylesine alır neden aydınlatabilir: Ben iyi görünüyor CIL kod düzeyine NetReflector aşağı kullanarak gezindiğini?
Windows XP'yi .NET 4.0 ve Visual Studio Express 2010 ile kullanıyorum. Zamanları, temelde bir StopView nesnesini kullanan ve 1000'den fazla yineleme içeren bir For-Next döngüsünü zamanlamak için kullandığım, açıkça kirli bir pasaj ile ölçtüm. Söz konusu kodu ve boş bir For-Next döngüsü ile karşılaştırmak; Birkaç döngüyü boşa harcayan ve işlemcinin durmasını engelleyen her iki döngüye de yararsız bir talimat içerir. Ham ama amaçlarım için yeterince iyi.
Bu yorum bazılarına kapalı görünüyorsa üzgünüm, ancak hesaplama hızını ve çevrim sürelerini aralıyor olsaydım - genel olarak VB.NET veya .NET kullanmıyordum. – TyCobb
belki de daha fazla kod gönderirseniz, verimliliği artırmak için başka öneriler sunabiliriz. – Jeremy
Sadece AND kullanmayı denediniz mi? Özellikle Boole değişkeniyle çalıştığınız için. –