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

 
Renat Fatkhullin :

Standart dağıtımdan herhangi bir kod alın, profilini çıkarın ve ona göre sorular sorun, lütfen. Bu, durumu tekrarlanabilir bir şekilde değerlendirmenize ve doğru cevaplar vermenize olanak tanır.

Aksi takdirde, kodunuzun küçük parçalarının profil oluşturucu raporlarından sorumlu olması iyi değildir. Tüm kodunuzu tamamen farklı bir karışık ve satır içi temsile dönüştüren devasa bir optimize edici işi var.

Üreme olmadan kesin cevapların olmayacağını anlıyorum.

Standart kodların profilini çıkarmam pek olası değil, ancak tekrarlanabilir parçalar vermeye çalışacağım.

 
Andrey Khatimlianskii :

Cevaplar için teşekkürler!

1) Basit kodda yeniden oluşturmam pek mümkün değil, evet. Ve tüm proje vermeye hazır değil.

2) Bu özel durumda, katılıyorum.

Ancak aynı veya benzer denetimi kullanan başka birçok sınıf vardır ve TimeCurrent veya GetTickCount vazgeçilmezdir.
Aynı değeri birkaç kez istememek için çağrılarını nasıl optimize edebilirim?

Ve TimeCurrent gerçekten çok ağır hesaplamaların (her 1 veya 5 dakikada bir yapılmasına rağmen) arka planında fark edilebilecek kadar ağır mı?
Yoksa yine yanlış mı anladım ve Toplam CPU'nun %38.16'sı / Self CPU'nun %26.07'si if kontrolünün kendisi tarafından mı işgal edildi ( TimeCurrent işlevine yapılan çağrı hariç)? Ama o zaman bu neden böyle?


1) Bu kadar açgözlü bir açma braketinin neden anlaşılmasına yardımcı olmaz. Nasıl yorumlanır?

2) SelfCPU hakkında artık açık, teşekkürler. Bu, çağrılan işlevleri hesaba katmadan işlev kodundaki bir yüktür.

Bu aynı zamanda iTime ile hattın düşük SelfCPU'sunu da açıklıyor - çok nadiren ulaşıldı, nadiren çağrıldı.

Ama neden bu kadar büyük bir TotalCPU var? Yoksa tüm programdaki tüm iTime'ın (ve diğer CopyXXX işlevlerinin) yükünü gösteriyor mu?

  1. Parantez açma - bunu genellikle birkaç yerleştirme talimatını ve özellikle yerel değişkenlerin başlatılmasını kapsayan bir fonksiyon önsözü olarak düşünün.
    Fonksiyonun yerel değişkenlerinin hacmine dikkat etmeye değer, çağrılanların satır içi olması nedeniyle hacmin artabileceğini hesaba katmanız gerekir.
    İşlev yerel olanlar için 4 Kb'den fazla tüketiyorsa, yığın belleği sağlamak için bir yardımcı işlev işlevi çağrılır - bu, yerelin katı gerçeğidir ve bundan kurtulamazsınız.

  2. SelfCPU çağrıları dikkate almamalıdır, aksi takdirde TotalCPU'yu kopyalar ve çağrılan işlevlerin zamanına göre kendi talimatlarının zamanı bulanıklaşır.
    Bir satır için TotalCPU, yalnızca o satırın "zamanı"dır
 
Alain Verleyen :

Her zaman %100 olması gerekmez mi? Veya @global_initializations ve @global_deinitializations da göz önüne alındığında biraz daha az.

%102'den fazla var ...(Geçmiş verilere göre 3003 oluşturun).

Eski profil oluşturucuya göre, makale daha fazlasının olabileceğini belirtti.

Profil oluşturma bize önemli istatistikler verir: her bir işlevin kaç kez çağrıldığı, yürütülmesi için ne kadar zaman harcandığı. Yüzde istatistikleriyle biraz kafanız karışabilir. Burada, istatistiklerin işlevlerin iç içe geçmesini dikkate almadığını anlamanız gerekir, bu nedenle tüm yüzdelerin toplamı %100'den çok daha fazla olacaktır.

 
Vasiliy Pushkaryov :

Eski profil oluşturucuya göre, makale daha fazlasının olabileceğini belirtti.

Teşekkür ederim. Ancak, anladığım kadarıyla, yeni profil oluşturucuda işler farklı olmalı. Mazerete izin verilmez, hata hatadır.
 
Ilyas :
  1. Parantez açma - bunu genellikle birkaç yerleştirme talimatını ve özellikle yerel değişkenlerin başlatılmasını kapsayan bir fonksiyon önsözü olarak düşünün.
    Fonksiyonun yerel değişkenlerinin hacmine dikkat etmeye değer, çağrılanların satır içi olması nedeniyle hacmin artabileceğini hesaba katmanız gerekir.
    İşlev yerel olanlar için 4 Kb'den fazla tüketiyorsa, yığın belleği sağlamak için bir yardımcı işlev işlevi çağrılır - bu, yerelin katı gerçeğidir ve bundan kurtulamazsınız.

  2. SelfCPU çağrıları dikkate almamalıdır, aksi takdirde TotalCPU'yu kopyalar ve çağrılan işlevlerin zamanına göre kendi talimatlarının zamanı bulanıklaşır.
    Bir satır için TotalCPU, yalnızca o satırın "zamanı"dır

1) İşlev gövdesinde yalnızca bir çift değişken bildirildi (const bool benzetilmiş işlev parametresini saymaz).

2) Yani, işlemci 11 çalışma aracından biri için iTime( m_symbol, PERIOD_CURRENT, 0 ) aldığı zamanın %55'i ("m_CloseOnFirstTickOnly || m_OpenOnFirstTickOnly" koşulunun işe yaraması içindi)?

Yoksa "Çağrılara Göre İşlevler" modunu mu kastediyorsunuz (göstermedim)?


Daha detaylı konuşabilmek için bana anlaşılmaz gelen sonuçlarla tekrarlanabilir bir kod parçası yapmaya çalışacağım.

 

Basit bir örnek kullanarak profil oluşturucu verilerinin yorumlanmasına yardımcı olmanızı rica ediyorum.

 #include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer ( 1 );

void f()
{
   Sleep ( 1 );
}

void OnTimer ()
{
  _USAGE
  
  f();
   Sleep ( 2 );
}


Her şey çılgınca saçmalık gibi görünüyor.

  • Uyku(2) tamamen eksik.
  • Nedense KULLANIM, Uykudan (1) birkaç kat daha fazla hayatta kalır.


İçeri girmeye çalışıyorum ama henüz çıkmıyor.


ZY Uykunun değiştirilmesini denedi.

 void Sleep2( uint Interval )
{
   const ulong StartTime = GetMicrosecondCount ();
  
  Interval *= 1000 ;
  
   while ( GetMicrosecondCount () - StartTime < Interval)
    ;
}

#define Sleep Sleep2

Hepsi de anlaşılmaz profiler değerleri.

 
fxsaber # :

Basit bir örnek kullanarak profil oluşturucu verilerinin yorumlanmasına yardımcı olmanızı rica ediyorum.


Her şey çılgınca saçmalık gibi görünüyor.

  • Uyku(2) tamamen eksik.
  • Nedense KULLANIM, Uykudan (1) birkaç kat daha fazla hayatta kalır.

MT4'te aynı kod kesinlikle mantıklı sonuçlar üretir.


MT5'te neyi yanlış yapıyorum?

ZY MT4'ten bir profil oluşturucu ile MT5'in son yapısı b2595'tir (b2593 - Dahili derleyici hatası veriyorsa).

 
Ve neden yazdığınız kodun gerçekte yürütülen koda eşit olduğunu düşünüyorsunuz?

Ortaya çıkan kodun aşırı optimizasyonu ve karıştırılması hakkında kaç kez tekrarlanmalı? Satır içi önekler bunu açıkça gösterir.

Ek olarak, profil oluşturucuyu, örnekleme profili oluşturucunun istatistik toplamak için zamanının olmadığı böyle yetersiz bir kodda kullanmak mantıklı değildir.

Profil oluşturucu, acımasızca optimize edilmiş kodda istatistiksel olarak önemli maliyetli yerleri etkin bir şekilde arar ve satır satır kaynak kodu kılavuzu değildir.

Çünkü kodunuzun gerçek yürütülebilir dosyayla pek ilgisi yok.




 
Renat Fatkhullin profil oluşturucuyu, örnekleme profili oluşturucunun istatistik toplamak için zamanının olmadığı böyle yetersiz bir kodda kullanmak mantıklı değildir.

Profil oluşturucu, vahşice optimize edilmiş kodda istatistiksel olarak önemli maliyetli yerleri etkin bir şekilde arar ve kaynak koduna yönelik satır satır bir kılavuz değildir.

Çünkü kodunuzun gerçek yürütülebilir dosyayla pek ilgisi yok.

Bu kadar basit bir örnek yazmak zorunda kaldım çünkü Profil oluşturucunun değerlerini bir savaş danışmanında önemli bir kaynak koduyla açıklamak imkansızdı.

Yukarıda sorulan sorular. Nasıl Uyku (1)'e girebilir, ancak Uyku (2)'ye giremez. Hiçbir şeyi başlatmadığına veya izlemediğine eminim, ama hemen cevabınızı hemen yazdınız.

Optimizasyon devre dışı bırakıldığında aynı saçmalık verilir. Üstelik, eski profil oluşturucu, henüz yeni bir yaklaşımın olmadığı b2596'da zaten yatıyor. Araştırmak için zaman harcadım...

 

Akıllı optimize edicinin arka arkaya iki Uyku'yu bir araya getirdiğini varsaydım. Ancak testler bunun böyle olmadığını göstermiştir.

 #include <fxsaber\Usage\Usage.mqh> // https://www.mql5.com/ru/code/33875

const bool Init = EventSetMillisecondTimer ( 1 );

void f()
{
   Sleep ( 1 );
}

ulong Temp;

void OnTimer ()
{
  _USAGE
  
  f();
  
   Temp += GetMicrosecondCount () - Temp;
  
   Sleep ( 2 );
}

void OnDeinit ( const int )
{
   Print (Temp);
}

Uyku(2) görünmez.