MT5 Kod Profil Oluşturucu Hakkında

 

Yeni profil oluşturucuyu kullanmaya başladım. Bu bölümde, nasıl doğru kullanılacağına dair bilgileri merkezileştirebiliriz.

Başlangıç olarak, döndürülen verilerle ilgili garip şeyler hakkında birkaç sorum var.   profil oluşturucu .

EA'nın geçmiş verilerinde kullanılan profil oluşturma raporu:

2021.07.08 15:43:06.269   MQL5 profiler   139098  total measurements, 0/0 errors, 320 mb of stack memory analyzed (92848/1073741824)

2021.07.08 15:43:06.269   MQL5 profil oluşturucu   982065 toplam işlev çerçevesi bulundu (279627 mql5 kodu, 122460 yerleşik,   571051 diğer , 8927 sistem)

Sonuçlar (Çağrıya Göre Fonksiyonlar):

S1. Rapor 139098 ölçüm diyor ama OnTick() Toplam CPU 150026, bu nasıl mümkün olabilir? (ancak CopyHistoryData 80087 %57,58 olarak doğru olarak %100 = 139098 anlamına gelir).

S2. Rapor, 571.051 diğer "özelliklere" atıfta bulunuyor. Ne mql, ne yerleşik ne de sistem işlevi değilse bu işlevler nelerdir?

S3. CopyHistoryData, farklı toplam CPU'ya sahip 3 işlev çağrısı (CopyHigh, CopyLow, CopyTime) ile 80087 Toplam CPU'yu gösterir, ca. Ancak, bu işlevler için yerel CPU aynıdır ve toplam CPU'ya (çağrı yığını) eşittir. Bu yanlış veri gibi görünüyor, çünkü CopyHistoryData için 80087'de (yığınlarda) 3 işlevin toplamı 62.161 (44286 + 9448 + 8427), nasıl olabilir, 62.161 çağrıda bu 3 işlevde 80.087 duraklama buluyor? İmkansız, tek açıklama bu sayının CopyHistoryData için genel olması ve bu nedenle işe yaramaz olmasıdır. Bir şey mi kaçırıyorum?

 

Backtest şu şekilde çalışır:

2021.07.10 08:00:37.101 çekirdek 01 EURUSD, H1: 230861 kene, 998 çubuk üretildi. Ortam 0:00:00.144'te eşitlenir. Test 0:03:09.367'de geçti (0:00:00.515 onay ön işleme dahil).

GetMicrosecondCount() kullanarak SymbolInfoTick()'in yürütme süresini ölçmek için kod ekledim.

       ulong start= GetMicrosecondCount ();

       //--- Get tick information
       if (! SymbolInfoTick (symbol,tick))
         return ( false );

      BENCH += GetMicrosecondCount ()-start;

Sonuç:

2021.07.10 08:00:37.101 çekirdek 01 2021.05.30 23:59:59 Toplam = 1209572 Bitti = 661874 mikrosaniyede 836973

Böylece SymbolInfoTick(), 3 dakika 9 saniyelik geçmiş verilerde toplam 661 milisaniye aldı. Ancak profil oluşturucu, ölçümlerin %74,71'ini kullandığını gösteriyor. Bu ne kadar doğru ya da faydalı, anlamıyorum.

 

Garip verilere başka bir örnek.

Global istatistiklere göre SymbolInfoTick(), 209 kez çağrı yığınında bulundu. Ama kodun içinde 210 yazıyor.İyi doğruluk.

Küresel istatistiklere göre, örnek SymbolInfoTick'e 209 kez ulaşıyor (toplam örnek sayısının %0,83'ü). TAMAM. Şimdi koddaki veriler ona 1 kez ulaştığını söylüyor (şimdi %1,49, yani başka bir toplama dönerseniz hangisi?). Hesaplamadan sonra 1'in %1,49 olması toplamın (%100) 67 olduğu anlamına gelir. Yani %1,49 bu durumda ana fonksiyon olan OnTimer()'ı ifade eder. Ama nasıl orada 1 ve küresel istatistiklerde 209 olabilir?

Bir hata olmasa bile, nasıl hızlı bir şekilde faydalı olabilir (bence bir profil oluşturucu ne olmalıdır)?

 

Bir diğeri

Bu, daha önce gösterildiği gibi SymbolInfoTick() öğesinin üzerindeki kod satırıdır. Yani newTick = false gibi bir atama 5 kez "seçildi"! SymbolInfoTick'i () aradıktan sonra 5 kez daha ( %1 - %1,49)? Şaka bir yana?

 
Bu muhtemelen bir hatadır, servis masasına başvurun.
 

Ne olduğunu ve farkın ne olduğunu sorun:

  • örnekleme tabanlı profil oluşturma (şu anda sahip olduğumuz gibi, Visual Studio C ++ ve diğerlerine benzer)
  • kod enstrümantasyonuna dayalı profil oluşturma (daha önce yaptığımız gibi)

 
Renat Fatkhullin :

Ne olduğunu ve farkın ne olduğunu sorun:

  • örnekleme tabanlı profil oluşturma (şu anda sahip olduğumuz gibi, Visual Studio C ++ ve diğerlerine benzer)
  • kod enstrümantasyonuna dayalı profil oluşturma (daha önce yaptığımız gibi)

Fark açıktır.

Sorun, pratikte tutarsız veriler ve hatalarla kullanmaktır.

 
Alain Verleyen :

Garip verilere başka bir örnek.

Global istatistiklere göre SymbolInfoTick(), 209 kez çağrı yığınında bulundu. Ama kodun içinde 210 yazıyor.İyi doğruluk.

Küresel istatistiklere göre, örnek SymbolInfoTick'e 209 kez ulaşıyor (toplam örnek sayısının %0,83'ü). TAMAM. Şimdi koddaki veriler ona 1 kez ulaştığını söylüyor (şimdi %1,49, yani başka bir toplama dönerseniz hangisi?). Hesaplamadan sonra 1'in %1,49 olması toplamın (%100) 67 olduğu anlamına gelir. Yani %1,49 bu durumda ana fonksiyon olan OnTimer()'ı ifade eder. Ama nasıl orada 1 ve küresel istatistiklerde 209 olabilir?

Bir hata olmasa bile, nasıl hızlı bir şekilde faydalı olabilir (bence bir profil oluşturucu ne olmalıdır)?

Ekran görüntüsü, SymbolInfoTick işlevine değil, çağrı dizisine ilişkin istatistikleri gösterir.

Toplamda, bu hat SymbolInfoTick'i aramadan önce veya hemen sonra hatta "stop" olduğunda tam 210 kez ve SymbolInfoTick'ten dönüş hattı olarak 209 kez yakalandı.

 
Alain Verleyen :

Bir diğeri

Bu, daha önce gösterildiği gibi SymbolInfoTick() öğesinin üzerindeki kod satırıdır. Yani newTick = false gibi bir atama 5 kez "seçildi"! SymbolInfoTick () çağrıldıktan sonra 5 kez daha ( %1 - %1,49)? Şaka bir yana?

Yazılanları pek anlamadım.

Bu ekran görüntüsünü şu şekilde okumalısınız: satır 5 kez "durdu", toplam yükten %0.06'sı, satırın ait olduğu işlevin kodu için - %7.46


 

"Self CPU" sayacı, hat kodunun bu hattın bulunduğu fonksiyonun hızı üzerindeki etkisini gösterir.
Önemli, hatta çağrılan fonksiyonun zamanı bu sayaç tarafından dikkate alınmıyor, belki bu doğru değil, düşüneceğiz


"Toplam CPU" sayacı, hat kodunun tüm program üzerindeki etkisini gösterir ve bu sayaç, hatta çağrılan fonksiyonları dikkate alır.

 
Ilyas :

Yazılanları pek anlamadım.

Bu ekran görüntüsünü şu şekilde okumalısınız: satır 5 kez "durdu", toplam yükten %0.06'sı, satırın ait olduğu işlevin kodu için - %7.46


Evet biliyorum. (Önceki tonum için özür dilerim, biraz sinirlendim).

Sorun şurada:

      newTickф  = false ;                     // Total CPU : 5 (0.06%)    Self CPU : 5 (7.46%)

Hoşçakal

       if (! SymbolInfoTick (symbolф,tickф))     // Total CPU : 210 (2.57%)  Self CPU : 1 (1.49%)

Genel işlemci iyi.

Ancak Self CPU söz konusu olduğunda, "newTick=false" değerinin 5 olması ve SymbolInfoTick () gibi bir işlev çağrısının yalnızca 1 olması nasıl mümkün olabilir? Bana mantıklı gelmiyor.