Değişkenleri bir döngünün arkasında mı yoksa bir döngünün içinde mi bildiriyorsunuz? - sayfa 5

 
pivalexander :

Kodu mantıksal bloklara ayırmayı ve içlerinde ihtiyaç duydukları değişkenleri bildirmeyi ve çoğuna yalnızca bir blokta, çok aşağıda bir yerde ihtiyaç duyulan bir dizi değişkeni işlevin başında çitlememeyi tercih ederim.

Yalnızca bir yerde gerekli olan değişkenler için, evet, özellikle blok küçük olduğunda, bunları bloğun kendisinden önce bildirmek mantıklıdır. Ancak, blok yeterince büyükse ve başka bir yerde değişkenlere ihtiyaç duyuluyorsa, işlevleri baştan tanımlamayı tercih ederim. Burada hala sağduyudan ilerlemeniz gerekiyor.

 
pivalexander :

Boş bir döngü gövdesiyle yürütmenin sonucu çok farklıdır, çok daha hızlı çalışır

Test1, время выполнения: 0.548275 сек.
Test2, Время выполнения: 0.313978 сек.

Mikrosaniye cinsinden neyi ölçüyorsunuz? .... Testinizin gerçeğe uygun olduğundan emin misiniz?

;)

ayrıca şu şekilde test etti:

 #define N 8

#define   test(M,S,EX, res) {                             \
uint mss= GetTickCount ();                                 \
ulong nn=( ulong ) pow ( 10 ,M);                               \
for ( ulong tst= 0 ;tst<nn && ! _StopFlag ;tst++) \
{ EX;  res }                                             \
printf ( "%s: loops=%i ms=%u" ,S,nn, GetTickCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string result;
   string s1;  test(N, "1. s1=" ,s1=( string )tst, result = s1; );
   string s2;  test(N, "2. s2=" ,s2=( string )tst, result = s2;);
   string s3;  test(N, "3. s3=" ,s3=( string )tst, result = s3;);
   string s4;  test(N, "4. s4=" ,s4=( string )tst, result = s4;);
   string s5;  test(N, "5. s5=" ,s5=( string )tst, result = s5;);

   test(N, "1. q=" , string q=( string )tst, result = q; );
   test(N, "2. w=" , string w=( string )tst, result = w;);
   test(N, "3. e=" , string e=( string )tst, result = e;);
   test(N, "4. r=" , string r=( string )tst, result = r;);
   test(N, "5. t=" , string t=( string )tst, result = t;);
  }

2019.08.18 12:14:20.765 Hız Testi (EURUSD,H1) 1. s1=: döngüler=100000000 ms=8156

2019.08.18 12:14:29.127 Hız Testi (EURUSD,H1) 2. s2=: döngüler=100000000 ms=8359

2019.08.18 12:14:37.353 Hız Testi (EURUSD,H1) 3. s3=: döngüler=100000000 ms=8235

2019.08.18 12:14:45.464 Hız Testi (EURUSD,H1) 4. s4=: döngüler=100000000 ms=8109

2019.08.18 12:14:53.557 Hız Testi (EURUSD,H1) 5.s5=:döngüler=100000000ms=8094

2019.08.18 12:15:01.46 Hız Testi (EURUSD,H1) 1. q=: döngüler=100000000 ms=7890

2019.08.18 12:15:09.159 Hız Testi (EURUSD,H1) 2. w=: döngüler=100000000 ms=7703

2019.08.18 12:15:16.903 Hız Testi (EURUSD,H1) 3. e=: döngüler=100000000 ms=7750

2019.08.18 12:15:24.716 Hız Testi (EURUSD,H1) 4.r=: döngüler=100000000ms=7813

2019.08.18 12:15:32.661 Hız Testi (EURUSD,H1) 5.t=: döngüler=100000000ms=7937

 
Igor Makanu :

Mikrosaniye cinsinden neyi ölçüyorsunuz? .... Testinizin gerçeğe uygun olduğundan emin misiniz?

   ulong   time_finish = GetMicrosecondCount ();
   ulong   res = time_finish - time_start;

yani ölçüyorum

 
pivalexander :

yani ölçüyorum

Bunların hepsi anlaşılabilir, ancak en az birkaç saniye ölçmeniz gerekiyor

Windows gerçek zamanlı bir sistem değil, değil mi? ve arka plan görevleri de Windows'tan kaynak gerektirir, işte sistem zamanlayıcı ve arka plan işlemlerinin belirli bir hata düzeyindeki testleriniz

IMHO, en az 5 saniyelik bir test zaten en azından bazı güvenilir bilgiler

 
Igor Makanu :

Bunların hepsi anlaşılabilir, ancak ölçmek için en az birkaç saniyeye ihtiyacınız var

Windows gerçek zamanlı bir sistem değil, değil mi? ve arka plan görevleri de Windows'tan kaynak gerektirir, işte sistem zamanlayıcı ve arka plan işlemlerinin belirli bir hata düzeyindeki testleriniz

IMHO, en az 5 saniyelik bir test zaten en azından bazı güvenilir bilgiler

Birkaç saniye ölçüm yaptım sonuç aynı, sonucu buraya yazmak için neden bu kadar bekleyelim?

 

Genel olarak, aynı testi yapmaya karar verdim, ancak% 100 doğru, böylece hiçbir şey kesin olarak kesilmedi.İşte böyle bir seçenek.

 void OnStart ()
{
   int count= ( int ) 10 e6;

  { 
     uint t= GetTickCount ();
     int sum= 0 ;
        
     for ( int i= 0 ; i<count; i++)
    {
       string st = ( string )i;
       sum += st[ rand ()% 10 ];
    }
     Print ( "Test1, время выполнения: " , GetTickCount ()-t, " ms,  sum=" ,sum);
  }
  
  {
     uint t = GetTickCount ();
     int sum= 0 ;
     string st = "" ;
     for ( int i= 0 ; i<count; i++)
    {
       st = ( string )i;
       sum += st[ rand ()% 10 ];
    }
     Print ( "Test2, время выполнения: " , GetTickCount ()-t, " ms,  sum=" ,sum);
  }
}

Optimizasyon olmadan modda, ikinci seçenek gerçekten daha hızlıdır. Ancak optimizasyon ile bunun tersi doğrudur. Ve bir nedenden dolayı ikinci seçenek, optimizasyondan öncekinden daha yavaş olur)

 
pivalexander :

Birkaç saniye ölçüm yaptım sonuç aynı, sonucu buraya yazmak için neden bu kadar bekleyelim?

ve aynı testin birkaç kez çalıştırılması gerekir, çünkü bir sonraki testte yüksek bir önbelleğe alma işlemi olasılığı vardır, bu nedenle küçük farklarla 2 özdeş testin farklı şekilde gerçekleştirileceği ortaya çıkabilir - aynı testin yürütülmesinde farkı görmüyorsunuz, değil mi?

bu senin işin, yukarıda yazdığım gibi kimseye güvenmiyorum, Windows'a, işlemciye ve kendime bile ;)


Alexey Navoykov :

Genel olarak, aynı testi yapmaya karar verdim, ancak% 100 doğru, böylece hiçbir şey kesin olarak kesilmedi.İşte böyle bir seçenek.

Optimizasyon olmadan modda, ikinci seçenek gerçekten daha hızlıdır. Ancak optimizasyon ile bunun tersi doğrudur. Ve bir nedenden dolayı ikinci seçenek, optimizasyondan öncekinden daha yavaş olur)

bir gerçek değil, srand() yok, Rand() derleyicisinin çok iyi optimize ettiğini yazdım;)

ve komut dosyasının metnini en az 2 kez kopyalayın - böylece derleyicinin bir şey seçip seçmediğini görebilirsiniz;)

 
pivalexander :

Ve işte bellek ve işlemci, optimizasyondan bahsediyoruz, sen bir kitap teorisyenisin)

Akıl yürütmenizin parantezlerinin ötesine geçerseniz ve derleyicinin nasıl çalıştığını ve optimizasyonunun nasıl çalıştığını anlarsanız, herhangi bir derleyicinin sırasıyla kod yürütme döngü sayısını azaltmayı ve tutarsız bellek erişimini en aza indirmeyi amaçladığı sizin için netleşecektir. herhangi bir derleyicinin optimizasyonunun sonucu, eğer varsa, dibile testleri olmadan sizin tarafınızdan önceden bilinecektir. 2 + 2 = 4'ü belirlemek için testler kullanmak gibi...

Ve kitap teorisyeni hakkında... Bu teorisyen EC1020 ve ZX Spectrum'dan başlayarak 87'den beri yazıyor, kendine ait birden fazla derleyici yazdı ve şirketinde 600'den fazla programcı tuttu...

 
Aleksandr Matveev :

Akıl yürütmenizin parantezlerinin ötesine geçerseniz ve derleyicinin nasıl çalıştığını ve optimizasyonunun nasıl çalıştığını anlarsanız, herhangi bir derleyicinin sırasıyla kod yürütme döngü sayısını azaltmayı ve tutarsız bellek erişimini en aza indirmeyi amaçladığı sizin için netleşecektir. herhangi bir derleyicinin optimizasyonunun sonucu, eğer varsa, dibile testleri olmadan sizin tarafınızdan önceden bilinecektir. 2 + 2 = 4 olduğunu belirlemek için testler kullanmak gibi...

Ve kitap teorisyeni hakkında... Bu teorisyen EC1020 ve ZX Spectrum'dan başlayarak 87'den beri yazıyor, kendine ait birden fazla derleyici yazdı ve şirketinde 600'den fazla programcı tuttu...

Kitapları kurcalıyorsunuz, kendinizi övüyorsunuz, ama özünde hiçbir şey söylemediler, sadece çalıların etrafındaki teori, okuyun, sizin için netleşecek ... bellek ve işlemci, işlemci ve bellek, güç hakkında yazın tedarik, orada da kullanılıyor

 
Ancak bir dizenin küçük bir dahili arabelleğe sahip olabileceğini ve küçük dizelerle verilerin tamamen oraya gidebileceğini biliyor muydunuz? Önemsiz vakaların çoğunda hızlanma için konuşmak için. malloc()'u yakalamakla uğraşırken, dize yaklaşık 15 karakterden kısaysa, malloc'un hiç seğirmediğini fark ettim. Testleriniz nasıl...