uzmanlar için soru #define - sayfa 7

 
Alexandr Andreev :

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

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

Evet, bunu özledim. Mesajımı düzeltti.

 
Valeriy Yastremskiy :

Rastgele bir sonuç. Derlerken, dizi boyutu değerine sahip bir bellek hücresine erişim dağıtılır ve dizi boyutu, dizi oluşturulduğunda, dizi dinamik olsa bile önceden bir bellek hücresine alınır ve yerleştirilir. dizi boyutu ve değişkenin değeri 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)

İnanın bana, ortalama bir öğrenci genellikle FIVT'dir - artı ile birlikte sadece sıfırdır), çünkü. deneyim sıfırdır ve deneyimsiz bilgi çabucak hiçbir yere gitmez (unutulur) ve örnekleri çok tuhaftır, öğrenci bunların nerede ve nasıl kullanılabileceğini anlamadan yıllar geçer. Bu, deneyimli bir programcı ile karşılaştırıldığında.

 
Alexandr Andreev :

İnanın bana, ortalama bir öğrenci genellikle FIVT'dir - artı ile birlikte sadece sıfırdır), çünkü. deneyim sıfırdır ve deneyimsiz bilgi çabucak hiçbir yere gitmez (unutulur) ve örnekleri çok tuhaftır, öğrenci bunların nerede ve nasıl kullanılabileceğini anlamadan yıllar geçer. Bu, deneyimli bir programcı ile karşılaştırıldığında.

Bu temiz. Derleyici yapmayı neden öğreneceğimiz belli değil. Kendi dilinizi nasıl oluşturacağınızı öğretmek gibi. dilin bir sınıf olduğu açıktır, ancak her kuş a priori uçamaz. Yukarıda belirtildiği gibi, Hatalar, Hatalar, Sorular ayrıca hareket halindeyken derlemeyi optimize etme sorunuyla da ilgilidir.

 

Konu genellikle tanımlarla ilgilidir, döngülerle ilgili değildir))

Örneğin, kullanıcı tanımlı işlevler gibi kod tanımlamanın mantıklı olup olmadığı benim için hala net değil.
Kodun yürütülebilir dosyada daha hızlı yürütülmesi umuduyla.
Yoksa bir yanılsama mı? Değiştirme yalnızca bir derleme öncesi eylem olduğundan ve yalnızca derlemeyi hızlandırmak mantıklıdır.

 
Roman :

Konu genellikle tanımlarla ilgilidir, döngülerle ilgili değildir))

Örneğin, kullanıcı tanımlı işlevler gibi kod tanımlamanın mantıklı olup olmadığı benim için hala net değil.
Kodun yürütülebilir dosyada daha hızlı yürütülmesi umuduyla.
Yoksa bir yanılsama mı? Değiştirme yalnızca bir derleme öncesi eylem olduğundan ve yalnızca derlemeyi hızlandırmak mantıklıdır.

Genişletilmiş formuna karşı 3 harici fonksiyonun kullanıldığı bir örneği attım. Onlar. hızlanma olmayacak

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

uzmanlar için soru #define

Alexander Andreev , 2020.11.02 19:49

 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
Внешние функции, определенные в другом модуле, должны быть явно описаны. Описание включает в себя тип возвращаемого значения, имя функции и набор входных параметров с их типами. Отсутствие такого описания может привести к ошибкам при компиляции, компоновке или выполнении программы. При описании внешнего объекта используйте ключевое слово С...
 
Alexandr Andreev :

Genişletilmiş formuna karşı 3 harici fonksiyonun kullanıldığı bir örneği attım. Onlar. hızlanma olmayacak


Açık. O zaman fxsaber'a merhaba. Her şeyi tanımlamanın hayranıyım.


Alexandr Andreev :

bana aksini kanıtla

ve sonra benim testimde bir nedenden dolayı aynılar

ArraySize() ve değişkene gelince. Her neyse, bu konuya dönelim.
İşte değiştirdiğim test. Döngü PI sayısını sayar.
İlk örnekte, döngü koşulunda ArraySize() kullanılmıştır.
İkinci örnekte, num_steps değişkeni kullanılmıştır.
Bir fark var.

ArraySize() işlevi

 void OnStart ()
{
     int arr[];
     int num_steps = ArrayResize (arr, 1000000000 );

     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     ulong t = GetMicrosecondCount ();
    
     for ( int i = 0 ; i< ArraySize (arr) ; i++)
    {
       x = (i + . 5 ) * step;
       sum = sum + 4.0 / ( 1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount () - t;
   
   printf ( "The value of PI is %1.12f " , pi);
   PrintFormat ( "Total time to calculate PI was %5.3f ms\n" , t / 1000.0 );
}

Üç komut dosyası çalışır.

 2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  Total time to calculate PI was 4049.179 ms
2020.11 . 02 23 : 56 : 51.556 TestScript (USDJPY,M1)  
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  Total time to calculate PI was 4183.364 ms
2020.11 . 02 23 : 56 : 57.928 TestScript (USDJPY,M1)  
2020.11 . 02 23 : 57 : 03.884 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 02 23 : 57 : 03.884 TestScript (USDJPY,M1)  Total time to calculate PI was 4034.098 ms
        


Değişken num_steps

 void OnStart ()
{
     int arr[];
     int num_steps = ArrayResize (arr, 1000000000 );

     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     ulong t = GetMicrosecondCount ();
    
     for ( int i = 0 ; i< num_steps ; i++)
    {
        x = (i + . 5 ) * step;
        sum = sum + 4.0 / ( 1.0 + x * x);
    }
    
    pi = sum*step;
        
    t = GetMicrosecondCount () - t;
   
   printf ( "The value of PI is %1.12f " , pi);
   PrintFormat ( "Total time to calculate PI was %5.3f ms\n" , t / 1000.0 );
}

Üç komut dosyası çalışır.

 2020.11 . 03 00 : 08 : 09.269 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 09.271 TestScript (USDJPY,M1)  Total time to calculate PI was 3955.325 ms
2020.11 . 03 00 : 08 : 09.271 TestScript (USDJPY,M1)  
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  Total time to calculate PI was 3950.568 ms
2020.11 . 03 00 : 08 : 15.578 TestScript (USDJPY,M1)  
2020.11 . 03 00 : 08 : 22.469 TestScript (USDJPY,M1)  The value of PI is 3.141592653590 
2020.11 . 03 00 : 08 : 22.469 TestScript (USDJPY,M1)  Total time to calculate PI was 3927.110 ms
        
 
Roman :

Açık. O zaman fxsaber'a merhaba. Her şeyi tanımlamanın hayranıyım.

ArraySize() ve değişkene gelince. Her neyse, bu konuya dönelim.
İşte değiştirdiğim test. Döngü PI sayısını sayar.
İlk örnekte, döngü koşulunda ArraySize() kullanılmıştır.
İkinci örnekte, num_steps değişkeni
kullanılmıştır.
Bir fark var.

ArraySize() işlevi

Üç komut dosyası çalışır.


Değişken num_steps

Üç komut dosyası çalışır.

Bu tür hesaplamalarda net bir fark yoktur. Hepsini tek bir koda koydum ve sonuçlar farklı, ilk seçeneğin kazandığı yer

)) µl'deki herhangi bir dizi, çoğu dilde olduğu gibi dizinin mevcut boyutundan sorumlu olan bir değişkene sahiptir.

ArraySize işlevi , derleyiciye bu değişkenin değerini döndürmesini söyler, yani. bu işlev yerine doğrudan bu değişkeni değiştirir. mikrolitre cinsinden diziler referanslara eşit olamaz, bu durumda işaretçi açıkça bu değişkene, doğrudan bellekteki kroket adresine açıktır. Teknik olarak, tüm bu testler iki ortak değişkeni karşılaştırma girişimidir. Bu, fonksiyonların genişletilmesinin özelliğidir, benim örneğimde, 3'ü doğrudan döngünün gövdesinde bulunan 0 fonksiyonu bağışlayan 4 fonksiyon, yani. 40000000000 işlev çağrılarının hiçbiri ile karşılaştırması yoktur. Ve farkedilemeyecek kadar küçük bir örtük fark görüyoruz - çünkü. bir yürütülebilir dosyaya kod koyuyor... aynı şeyi karşılaştırıyoruz.

ve tüm bu hesaplamalar - ne kadar karmaşıklarsa, o kadar az anlam ifade ederler.

Bir durumda yüzlerce fonksiyonun çağrılacağı, fonksiyonlar içinde fonksiyonların çağrılacağı bir örnek vermek daha kolay... Ve diğerinde, tüm bunlar genişletilmiş formda - ve hiçbir fark olmayacak. T, k. ArraySize(mas)==mas[]. boy

Документация по MQL5: Операции с массивами / ArraySize
Документация по MQL5: Операции с массивами / ArraySize
  • www.mql5.com
"Нулевое измерение = Размер массива / (Первое измерение * Второе измерение * Третье измерение)"
 

Bazı nedenlerden dolayı pi ile bir örnek olmasına rağmen, bu hala tamamen rastgele bir aşırı kilo olmasına rağmen, aşırı kilo sıklığı (baskı) açısından hala bir fark var .....

ve değişken ile değişkeni açıkça karşılaştırmaya çalışılmasa da 1 milyar ihracat başına 1 ms'ye eşittir, bu nedenle yayılma daha da büyümüştür))


 
Alexandr Andreev :

Bu tür hesaplamalarda net bir fark yoktur. Hepsini tek bir koda koydum ve sonuçlar farklı, ilk seçeneğin kazandığı yer

)) µl'deki herhangi bir dizi, çoğu dilde olduğu gibi dizinin mevcut boyutundan sorumlu olan bir değişkene sahiptir.

ArraySize işlevi , derleyiciye bu değişkenin değerini döndürmesini söyler, yani. bu işlev yerine doğrudan bu değişkeni değiştirir. mikrolitre cinsinden diziler referanslara eşit olamaz, bu durumda işaretçi açıkça bu değişkene, doğrudan bellekteki kroket adresine açıktır. Teknik olarak, tüm bu testler iki ortak değişkeni karşılaştırma girişimidir. Bu, fonksiyonların genişletilmesinin özelliğidir, benim örneğimde, 3'ü doğrudan döngünün gövdesinde bulunan 0 fonksiyonu bağışlayan 4 fonksiyon, yani. 40000000000 işlev çağrılarının hiçbiri ile karşılaştırması yoktur. Ve farkedilemeyecek kadar küçük bir örtük fark görüyoruz - çünkü. bir yürütülebilir dosyaya kod koyuyor... aynı şeyi karşılaştırıyoruz .

ve tüm bu hesaplamalar - ne kadar karmaşıklarsa, o kadar az anlam ifade ederler.

Bir durumda yüzlerce fonksiyonun çağrılacağı, fonksiyonlar içinde fonksiyonların çağrılacağı bir örnek vermek daha kolay... Ve diğerinde, tüm bunlar genişletilmiş formda - ve hiçbir fark olmayacak. T, k. ArraySize(mas)==mas[]. boy

Döngünün gövdesinde ne yapıldığı önemli değildir. Bu sadece test için bir yük.
Örnekler, bir çağrıyı bir döngü koşulundaki bir işlev veya değişkenle karşılaştırır.

Montajcı konusunda uzman değilim, ancak montajcı talimatları açısından bunların aynı şey olmadığını düşünüyorum.
Ve sınıfa da sarılırsa, o zaman aynı şey değil.

İşlevin, bir bellek hücresinden bir değer almak için fazladan bir talimatı vardır, yani işlev, bir değer için bellek hücresine erişir ve ancak o zaman sonucu döndürür.
Değişken zaten bu değere sahiptir, değişken bir yere gitmez, hemen sonucu döndürür.

 
Roman :

Döngünün gövdesinde ne yapıldığı önemli değildir. Bu sadece test için bir yük.
Örnekler, bir çağrıyı bir döngü koşulundaki bir işlev veya değişkenle karşılaştırır.

Montajcı konusunda uzman değilim, ancak montajcı talimatları açısından bunların aynı şey olmadığını düşünüyorum.
Ve sınıfa da sarılırsa, o zaman aynı şey değil.

İşlevin, bir bellek hücresinden bir değer almak için fazladan bir talimatı vardır, yani işlev, bir değer için bellek hücresine erişir ve ancak o zaman sonucu döndürür.
Değişken zaten bu değere sahiptir, değişken bir yere gitmez, hemen sonucu döndürür.

) iyi, bu şekilde çalışmıyor)

 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   int mas[];
   int mas1[ 300 ];
   int mas2[ 300 ];
   int mas3[ 300 ];
   int mas4[ 300 ];
   int mas5[ 300 ];
   int mas6[ 300 ];
   int z= 300 ;
   int size= 100000000 ;
   ArrayResize (mas,size);
   ulong r= 0 ;
   ulong r1= 0 ;
   ulong r2= 0 ;
   int random;
   ulong max= 100 ; 
   int t= 0 ;
   int tr= 0 ; 
   MathSrand ( 10 );
     int num_steps= ArraySize (mas);
     double x, pi, sum= 0.0 ;
     double step = 1.0 /( double )num_steps;
    
     int v=size;
     ulong t1 = GetMicrosecondCount ();
     
    
   // for(ulong z=0; z<max; z++)
     {
       for ( ulong i= 0 ; i< ArraySize (mas); i++)
        { 
        r2+= ArraySize (mas);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2+= ArraySize (mas2);
        r2+= ArraySize (mas3);
        r2+= ArraySize (mas4);
        r2+= ArraySize (mas5);
        r2+= ArraySize (mas6);
        r2+= ArraySize (mas1);
        r2=r2/ 10 ;
        }

     }  
   ulong t2= GetMicrosecondCount ();
   //for(ulong z=0; z<max; z++)
     {
       for ( ulong i= 0 ; i<v; i++)
        { 
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1+=z;
        r1=r1/ 10 ;
        }
     }
   
   int pi2 = sum*step;
   ulong t3= GetMicrosecondCount ();
   Print (t2-t1, "  " ,t3-t2, " " ,r, " " ,r1, " " ,r2, " " ,pi, " " ,pi2);
// Templ();
  }

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

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

Neredeyse her koşuda lider değişir

bu bölüm en uzun