MT5 Kod Profil Oluşturucu Hakkında - sayfa 2

 
Ilyas :

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ı.

Üzgünüm ama bu net değil.

Profil oluşturucu özeti şunları söylüyor:

SymbolInfoTick () Toplam CPU: 209 (%0,83)

Kodun kendisi şöyle diyor:

SymbolInfoTick() Toplam CPU: 210 (%2,57)

SymbolInfoTick(), kodda yalnızca BİR KEZ oluşur. Bu farklı değerlerin ne olduğu tamamen belirsizdir. Tamam, 209'a 210, bunun o satırda birini "durdurduğu" için olduğunu söylediniz (benim için mantıklı değil, ama sanırım çok da önemli değil).

Ve nasıl olur%?

0 2021.07.10 11:52:19.032 MQL5 profil oluşturucu 25039 toplam ölçüm, 0/0 hata, ayrıştırılmış 99MB yığın belleği (92872/1073741824)

Yani 209 (%0,83) %100 = 25039 anlamına gelir. Tamam

Ama 210 (%2.57) % 100 = 8171 demektir?!? Toplam CPU için 8171 nedir?

 
Alain Verleyen :

Peki ya buna ( 1 numaralı gönderi )?

Gördüğünüz gibi SymbolInfoTick() kodun en ağır kısmı olarak gösteriliyor. Hangisi doğru değil. Bu, aşağıdaki gönderilerdeki ile aynı koddur (Bu, SymbolInfoTick'i Toplam CPU = 209 (%0,83) ile gösterir ki bu doğrudur), aradaki fark, SymbolInfoTick()'in Toplam CPU = 1 olduğu satırı yorumlamış olmamdır. (geçmiş veriler) bu küçük değişiklikle değişmedi, ancak profil oluşturucu sonuçları farklıydı.

Kontrol etmek isterseniz kodu özelden verebilirim.

О профилировщике кода MT5
О профилировщике кода MT5
  • 2021.07.09
  • www.mql5.com
Я начал использовать новый профайлер. В этом разделе мы могли бы централизовать информацию о том, как его правильно использовать...
 
Alain Verleyen :

Üzgünüm ama bu net değil.

Profil oluşturucu özeti şunları söylüyor:

SymbolInfoTick () Toplam CPU: 209 (%0,83)

Kodun kendisi şöyle diyor:

SymbolInfoTick() Toplam CPU: 210 (%2,57)

SymbolInfoTick(), kodda yalnızca BİR KEZ oluşur. Bu farklı değerlerin ne olduğu tamamen belirsizdir. Tamam, 209'a 210, bunun o satırda birini "durdurduğu" için olduğunu söylediniz (benim için mantıklı değil, ama sanırım çok da önemli değil).

Ve nasıl olur%?

0 2021.07.10 11:52:19.032 MQL5 profil oluşturucu 25039 toplam ölçüm, 0/0 hata, ayrıştırılmış 99MB yığın belleği (92872/1073741824)

Yani 209 (%0,83) %100 = 25039 anlamına gelir. Tamam

Ama 210 (%2.57) % 100 = 8171 demektir?!? Toplam CPU için 8171 nedir?

"Kod satırı" ve "işlev" istatistiklerini karşılaştırıyorsunuz

kod satırı var

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

Toplamda, bu satır istatistiklere 210 kez dahil edildi:

  • SymbolInfoTick'in çağrıldığı kod satırının 209 katı
  • 1 kez sanki ifadesi

Bir SymbolInfoTick işlevi var, bu işlev istatistiklere 209 kez dahil edildi.
Fonksiyon sadece bu kod satırından çağrılır, bu yüzden muhtemelen sayaçlarla karıştırdınız.


Rakamlara gelince:
Yani 209 (%0,83) %100 = 25039 anlamına gelir. Tamam

değil, sayılar sadece benzer: 209 / 0.83 * 100 = 25180


Ama 210 (%2.57) % 100 = 8171 demektir?!? Toplam CPU için 8171 nedir?

Doğru, 25039 ölçümden 8171'i SymbolInfoTick çağrısıyla kod satırına düştü.

 

Alain Verleyen :

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, ne kadar faydalı, anlamıyorum.


Açık konuşayım, test sadece MQL kodunun yürütülmesi değil + profil oluşturucu, istatistik alarak yürütmeyi biraz yavaşlatır.


Aynı zamanda raporda %74,71 MQL kodu ile ilgili bir rakamdır ve genel olarak test etmemektedir.

 

Merhaba @İlyas!

Teşekkür ederim. Cevaplarınıza göre her şeyi tekrar kontrol edeceğim ve sizi güncel tutacağım.

 
Ilyas :
...

Rakamlara gelince:

değil, sayılar sadece benzer: 209 / 0.83 * 100 = 25180


Doğru, 25039 ölçümden 8171'i SymbolInfoTick çağrısıyla kod satırına düştü.

bütün sayıları yanlış yazmışım

Gerçekten de 209, 0,83'e yuvarlanan 25039'un %0,83469'udur.


8171 ölçüm, SymbolInfoTick çağrısına sahip satırın 210 kez yürütüldüğü program yürütme dalına düştü, yani %2,57

 
Ilyas :

tüm sayıları yanlış yazmışım

Gerçekten de 209, 0,83'e yuvarlanan 25039'un %0,83469'udur.


8171 ölçüm, SymbolInfoTick çağrısına sahip satırın 210 kez yürütüldüğü program yürütme dalına düştü, yani %2,57

OnTimer()'dan yürütülüyor, yani neden 8171 olduğu tam olarak belli değil mi? OnTimer() Total CPU 29683 gösterdiğinde.
 
Alain Verleyen :
OnTimer()'dan yürütülüyor, yani neden 8171 olduğu tam olarak belli değil mi? OnTimer() Total CPU 29683 gösterdiğinde.

Lütfen kodu sağlayın, sayaçların çalışmasını iki kez kontrol edeceğim.

 
Ilyas :

Lütfen kodu sağlayın, sayaçların çalışmasını iki kez kontrol edeceğim.

Vakit buldukça tek başıma yapacağım. Teşekkür ederim.
 
Ilyas :

İlyas, çözmeme yardım et.

1. Neden boş bir işlevi çağırmak Self CPU'nun %34.5'ini kaplayabilir? Aynı zamanda, iç kısımları Toplam CPU'nun %38,16'sı tarafından yürütülen onu takip eden fonksiyonun çağrısı raporda hiç görüntülenmiyor mu?


İşlev kodu:



2. Aynı örnek ikinci sorunu gösteriyor: TimeCurrent() içeren satır, yalnızca işlev içinde değil, aynı zamanda genel olarak program içinde makul olmayan bir şekilde uzun zaman alıyor:

CheckTimeSeries() gövdesini yorumlamadan önce, yükün büyük kısmı TimeCurrent() satırındaydı.

İşlev gerçekten bu kadar ağır mı? Onu ne ile değiştirmeli? Veya nasıl ekonomik hale getirilebilir (bir program yürütme döngüsü içinde önbelleğe alma)?

Mümkün olan her yerde ekonomik hesaplamalar yapıyorum, hesaplamaları inceltiyorum (bar başına bir, X saniyede bir, Y ms'de bir vb.). Ancak, hesaplama yapmanın gerekli olup olmadığı kontrolün kendisinin çok kaynak yoğun olduğu ortaya çıktı.


Yardımın için teşekkürler.