uzmanlar için soru #define - sayfa 6

 
Igor Makanu :

döngünün gövdesindeki dizilerin boyutunu değiştirirseniz, anında optimizasyon artık çalışmaz

bu yüzden kodu değiştirin:

)))) sadece boyut değişkeninizin değerini değiştirmeye kendinizi kaptırırsınız, bu da ArraySIze kullanan nominal ilk yöntemin kazanacağı anlamına gelir

 
Alexandr Andreev :

IMHO'ya karşı hiçbir şey söyleyemem.

Çok büyük tekrarlarda, zafer birinci ve ikinci yöntemlerde rastgele oldu ... büyük olasılıkla mevcut anda işlemcinin önbelleğine ve toplam yüke bağlı hale geldi.

Soru döngüyle ilgili değildi - ancak işlevin açılmasıyla ilgiliydi. Tıpkı bir örnek olarak ArraySize

Bu iyidir) Yüksek seviyeli bir dilin mükemmelliği, uygun bir notasyon uygun olmadığı kadar ucuz olduğunda, ancak başlangıçta ucuz olduğunda kendini gösterir. Bunun her zaman böyle olmaması üzücü ve yeni gelenler için yardım konusunda yardım da her zaman değil ..... soru olmazdı)))

 
Igor Makanu :

döngünün gövdesindeki dizilerin boyutunu değiştirirseniz, anında optimizasyon artık çalışmaz

bu yüzden kodu değiştirin:


aşmaz

çalışma zamanı optimizasyonu önde olacak

bu kadar basit makine komutlarını profil oluşturucu olmadan test edemezsiniz, genel olarak bir döngüde istediğinizi yazabilirsiniz, isteğe bağlı olarak, test cihazında test edin, hız bunun için önemlidir

Bu döngüyle ilgili değildi, ama derleyicinin işlevi nasıl açtığıyla ilgiliydi ..... oh iyi, genel olarak.

senden ayrılacağım

 
Alexandr Andreev :

)))) sadece boyut değişkeninizin değerini değiştirmeye kendinizi kaptırırsınız, bu da ArraySIze kullanan nominal ilk yöntemin kazanacağı anlamına gelir

Yukarıda ekledim - bu kadar basit bir kod sadece ölçümlerle test edilmez, birçok faktör vardır - kodun boyutu küçüktür - hepsi işlemci önbelleğine sığar, kod işlemcide paralel mikro talimatlara iyi bölünmeli işlemci boru hattında, yani. kayıtlar, veri önceden getirme ile hızlı bir şekilde yüklenecektir

peki, belki Rand() da bir yerde iyi önbelleğe almaya başladı


genel olarak, burada hata ayıklayıcı olmadan nasıl test edeceğimi bilmiyorum - en azından orada talimatların yürütme süresini döngüler halinde görebilirsiniz

 
Alexandr Andreev :

bana aksini kanıtla

ve sonra benim testimde bir nedenden dolayı aynılar

Mesajımı değiştirdim.
Görünüşe göre, tam tersine , ArraySize artık cnt değişkeninden daha hızlı yerine getiriyor.
Eskiden durum tam tersiydi. Muhtemelen artış cnt-- etkiler, döngünün gövdesi farklıdır ve muhtemelen yük için başka bir şeyin icat edilmesi gerekir.

 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000000 );  
   
   ulong t = GetMicrosecondCount ();
   
   for ( int i= 0 ; i < ArraySize (arr) ; i++) 
   {
       ArrayResize (arr, sz--); //какая то нагрузка
   }   
   
   t = GetMicrosecondCount () - t;
   
   PrintFormat ( "Total time: %.3f ms" , t / 1000.0 );
}
 2020.11 . 02 21 : 33 : 22.863 TestScript (USDJPY,M1)  Total time: 451.200 ms


 void OnStart ()
{
   int arr[];
   int sz = ArrayResize (arr, 100000000 );  
   int cnt = ArraySize (arr);
   
   ulong t = GetMicrosecondCount ();
   
   for ( int i= 0 ; i < cnt ; i++) 
   {
       ArrayResize (arr, sz--);
      cnt--;
   }
      
   t = GetMicrosecondCount () - t;
   
   PrintFormat ( "Total time: %.3f ms" , t / 1000.0 );
}
 2020.11 . 02 21 : 56 : 26.591 TestScript (USDJPY,M1)  Total time: 531.872 ms
 
Roman :

Garip bir şey.
Döngü koşulunda ArraySize (arr) kullanmak , cnt değişkenini kullanmaktan daha az zaman gösterir.
Eskiden tam tersi oluyordu. Bu bir hata olabilir mi? Ve olmamalı.

Kodunuzda hiçbir şeyi karıştırmadınız, sizin için değer kim olacak?

 cnt

ilk seçenekte olduğu gibi değiştirin

 
void OnStart ()
  {
   int mas[];
   int size= 1000000 ;
   ArrayResize (mas,size);
   ulong r= 0 ;
   ulong r1= 0 ;
   ulong r2= 0 ;
   int random;
   ulong max= 100 ;
   uint t1= GetTickCount ();
   int t= 0 ;
   int tr= 0 ; 
   MathSrand ( 10 );
   for ( ulong z= 0 ; z<max; z++)
     {
       for ( ulong i= 0 ; i< ArraySize (mas); Funk(i))
        { 
         FunkRand(r1); 
         Funk(r); // мы сюда написали вызов еще одной функции чтобы усложить ситуацию
        }
     }
   tr=r;
   uint t2= GetTickCount ();
   for ( ulong z= 0 ; z<max; z++)
     {
     int v=size;
       for ( ulong i= 0 ; i<v; i++)
        { 
         r2+= rand ();
         r--;
        }

     }

   uint t3= GetTickCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r, " " ,r1, " " ,r2, " " ,t1, " " ,tr);
// Templ();
  }

//+------------------------------------------------------------------+
//|                                           
  
void Funk( ulong &a){a++;}
void FunkRand( ulong &a){a+= rand ();}

//+------------------------------------------------------------------+

500r için soru (doğrulama olmadan), hangi yöntem daha hızlıdır. üst yöntemde kaç tane harici işlevin çağrıldığını görün

Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 

bir test seçeneği olarak - ayrıca her teste yalnızca kendi dizilerinizi de kaydırabilirsiniz - benim örneğimde arr1, arr2 ..

onlar. tst1_arr1[],tst1_arr2[] .... ve tst2_arr1[],tst2_arr2[] olacak


daha dürüst bir test olacak

Ben çıkıyorum, çok dikkat dağıtıcı - IMHO, uygun, kullan

 
Igor Makanu :

genel olarak, burada hata ayıklayıcı olmadan nasıl test edeceğimi bilmiyorum - en azından orada talimatların yürütme süresini döngüler halinde görebilirsiniz

Evet, hiçbir yerde hata ayıklayıcı olmadan. Ve oradaki vuruşlarda ...

 
Roman :

Garip bir şey.
Döngü koşulunda ArraySize (arr) kullanmak , cnt değişkenini kullanmaktan daha az zaman gösterir.
Eskiden tam tersi oluyordu. Bu bir hata olabilir mi? Ve olmamalı.

Rastgele bir sonuç. Derleme yapılırken , dizi boyutu değeri olan bellek hücresine erişim açılır ve dizinin boyutu, dizi oluşturulduğunda, dizi dinamik olsa bile önceden elde edilir ve bellek hücresine yerleştirilir, ve dizi boyutuna ve değişken değerine sahip hücreler erişim zamanında aynı olacaktır.

Pekala, ifadeye bakılırsa, 3-4 bilgisayar bilimi dersinde derleyicilerin ne yaptığı ... genel olarak, yeterince gerekli bir personel seviyesinin MCL ortamında çok gergin olmama izin vermeyeceğini umuyorum)