Hatalar, hatalar, sorular - sayfa 2878

 
Igor Makanu :

optimize ederken hangi dönüştürme seçeneğinin daha hızlı çalışacağı

Bu, tüm geçiş için yalnızca bir kez arayacaktır. Bu nedenle, önemli değil.

 
fxsaber :

Bu, tüm geçiş için yalnızca bir kez arayacaktır. Bu nedenle, önemli değil.

yani evet ... ama bilgisayarı birkaç gün optimizasyon için çalıştıracağım, bir şekilde performansı ölçmek istiyorum ..... seçenek 1'in daha verimli olacağından şüphelensem de, hayır olmayacak dizilere 100500 kez kopyalama

 
Igor Makanu :

yani evet ... ama bilgisayarı birkaç gün optimizasyon için çalıştıracağım, bir şekilde performansı ölçmek istiyorum ..... seçenek 1'in daha verimli olacağından şüphelenmeme rağmen, hayır olmayacak dizilere 100500 kez kopyalama

union dizilere kopyalama yapmıyor, aynı bellek alanının farklı bir yorumu. bu nedenle büyük olasılıkla 2. seçenek daha hızlıdır, ancak yukarıda belirtildiği gibi önemli değil.
 
TheXpert :
union dizilere kopyalama yapmıyor, aynı bellek alanının farklı bir yorumu. bu nedenle büyük olasılıkla 2. seçenek daha hızlıdır, ancak yukarıda belirtildiği gibi önemli değil.
Sendika göründüğü kadar hızlı değil. Ne yazık ki.
İlkine bahse girerim.
 
Igor Makanu :

yani evet ... ama bilgisayarı birkaç gün optimizasyon için çalıştıracağım, bir şekilde performansı ölçmek istiyorum ..... seçenek 1'in daha verimli olacağından şüphelenmeme rağmen, hayır olmayacak dizilere 100500 kez kopyalama

hızı ölçmenin eski bir yolu var

modaya uygun

for (int i=0; i< 1000000; i++) {kodumuz1}....
for (int i=0; i< 1000000; i++) {kodumuz2}....

 
Nikolai Semko :
Sendika göründüğü kadar hızlı değil. İlkine bahse girerim.

Ben de ilk sıraya koydum! ikili operatörler, if operatöründen birkaç kat daha hızlıdır, ancak ikincisi buna sahip değildir.

 

kontrol:

#define   SpeedTest(count_x10,msg,EX)        { ulong mss= GetMicrosecondCount (); ulong count=( ulong ) pow ( 10 ,count_x10); for ( ulong _i= 0 ;_i<count&&! _StopFlag ;_i++){EX;} \
                                               printf ( "%s: loops=%llu ms=%llu" ,msg,count, GetMicrosecondCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong sum = 0 ;
   SpeedTest( 10 , "tst 1 : " ,
   {
       ushort in01A = ( ushort ) rand ();
       ushort in01B = ( ushort ) rand ();
       ushort in02A = ( ushort ) rand ();
       ushort in02B = ( ushort ) rand ();
       ushort in03A = ( ushort ) rand ();
       ushort in03B = ( ushort ) rand ();
       ushort in04A = ( ushort ) rand ();
       ushort in04B = ( ushort ) rand ();
       ushort in05A = ( ushort ) rand ();
       ushort in05B = ( ushort ) rand ();
       uint param[ 5 ];
      param[ 0 ] = ( uint )in01A << ( sizeof ( ushort ) * 8 ) | in01B;
      param[ 1 ] = ( uint )in02A << ( sizeof ( ushort ) * 8 ) | in02B;
      param[ 2 ] = ( uint )in03A << ( sizeof ( ushort ) * 8 ) | in03B;
      param[ 3 ] = ( uint )in04A << ( sizeof ( ushort ) * 8 ) | in04B;
      param[ 4 ] = ( uint )in05A << ( sizeof ( ushort ) * 8 ) | in05B;
       for ( int i = 0 ; i < 5 ; i++) sum += param[i];
   });
//--   
   sum = 0 ;
   union ushortTouint
   {
       uint param[ 5 ];
       ushort in[ 10 ];
   }U;
   SpeedTest( 10 , "tst 2 : " ,
   {
       ushort in00 = ( ushort ) rand ();
       ushort in01 = ( ushort ) rand ();
       ushort in02 = ( ushort ) rand ();
       ushort in03 = ( ushort ) rand ();
       ushort in04 = ( ushort ) rand ();
       ushort in05 = ( ushort ) rand ();
       ushort in06 = ( ushort ) rand ();
       ushort in07 = ( ushort ) rand ();
       ushort in08 = ( ushort ) rand ();
       ushort in09 = ( ushort ) rand ();
      ushortTouint u;
      u.in[ 0 ] = in00;
      u.in[ 1 ] = in01;
      u.in[ 2 ] = in02;
      u.in[ 3 ] = in03;
      u.in[ 4 ] = in04;
      u.in[ 5 ] = in05;
      u.in[ 6 ] = in06;
      u.in[ 7 ] = in07;
      u.in[ 8 ] = in08;
      u.in[ 9 ] = in09;
       for ( int i = 0 ; i < 5 ; i++) sum += u.param[i];
   });

}

2020.10.15 21:48:01.401 HızTst (EURUSD,H1) tst1 : : döngüler=10000000000 ms=10864370

2020.10.15 21:48:12.264 HızTst (EURUSD,H1) tst2 : : döngüler=10000000000 ms=10862287

önemli bir fark değil, testleri değiştirirseniz sonuçların tam tersi olması kuvvetle muhtemeldir.

genellikle kritik değildir.

 
Igor Makanu :

önemli bir fark değil, testleri değiştirirseniz sonuçların tam tersi olması kuvvetle muhtemeldir.

derleyicinin her iki durumda da aynı kodu oluşturma olasılığı yüksektir. bu durumda, subjektif olarak neyi sevdiğinizi seçin

 
Igor Makanu :

kontrol:

2020.10.15 21:48:01.401 HızTst (EURUSD,H1) tst1 : : döngüler=10000000000 ms=10864370

2020.10.15 21:48:12.264 HızTst (EURUSD,H1) tst2 : : döngüler=10000000000 ms=10862287

önemli bir fark değil, testleri değiştirirseniz sonuçların tam tersi olması kuvvetle muhtemeldir.

genellikle kritik değildir.

Rastgele sayılar oluşturma zamanının düzensiz olabileceğini ve birçok şeyin oluşturulan değişkenlerin hacmine bağlı olduğunu gösteren bir komut dosyası gibi)))

Ve bu kadar çok tekrarda ihtiyacımız olan kod beni 0 ms alıyor.

cevap hayır

veya kod iyileştirici gereksiz bir şeyi keser
 
Alexandr Andreev :

İşte rastgele sayılar üretme zamanının düzensiz olabileceğini gösteren bir komut dosyası

no rand() normal bir işlevdir, her zaman aynı şekilde çalışır

ancak işin hızını test ederken sabitlerle başlatırsanız, testler yürütüldüğünde "hızlandırılır" - kod optimizasyonu   çalışma zamanında MQL'de kötü çalışmıyor

genel olarak, bu bir kereden fazla kontrol edilir

Alexandr Andreev :

ve birçok şey oluşturulan değişkenlerin hacmine bağlıdır)))

Tabii ki, bellek tahsisi çalışma zamanı açısından pahalı, zaten kontrol ettim, dinamik olarak oluşturulan nesneleri (pointer new) ve sadece yerel kapsamdaki nesneleri test ettim, 100500 kez test ederken, zaman yeni + silmeye kadar ilerliyor

bir bütün olarak soru, değişkenler için küresel görünürlükteki test cihazında belleğin bir kez tahsis edilmesi ve her geçişte değil - ancak uint dizilerine ihtiyacım olması nedeniyle, böyle bir komut dosyasıyla test ettim ve yazdığım gibi değil ilk kez

Alexandr Andreev :

Ve bu kadar çok tekrarda ihtiyacımız olan kod beni 0 ms alıyor.

cevap hayır

veya kod iyileştirici gereksiz bir şeyi keser

benim senaryomla test ettin mi? - ya testin sonunu beklemedi ve iptal edildi ya da ulong taştı - makronun ilk parametresi 10^ sayısı



Andrey Trukhanoviç :

derleyicinin her iki durumda da aynı kodu oluşturma olasılığı yüksektir. bu durumda, subjektif olarak neyi sevdiğinizi seçin

evet, belki öyle

burada, genel olarak, soru neydi - talimat boru hattının optimizasyonu nedeniyle modern işlemcilerin bir döngüde birden fazla temel işlemi gerçekleştirebileceğini defalarca okudum .... çok fazla bla-bla-bla .. . ve mesele şu ki, işlemci öngörülemeyen sayıda döngü için aritmetik komutları yürütür.

ancak dallanma ve bellek ayırma işlemleri işlemci tarafından çok zayıf bir şekilde optimize edilmiştir, bu nedenle aritmetiği basitleştirmede optimizasyon aramayın, minimum dallarla mümkün olduğunca doğrusal kod yazmaya çalışın ve değişkenleri bildirmek ve değerler atamak daha iyidir komut hattı ve önbellek getirme tahmininin bu kodu optimize etmesini sağlayan hesaplamalardan hemen önce onlara


onlar. büyük olasılıkla, dizideki (adresleme) öğelerin değerlerinin seçimi de hız açısından kritik olmayacak - burada birliğe karşı bir vardiya kazancı olacağını düşündüm, hiçbir fark olmadığı ortaya çıktı Tümü

Neden: