MT5 hatası (2345 derlemesi) uzun süredir profil oluşturucunun neden başladığını ve çalıştığını anlayamadı, ancak sonuçlar hiçbir yerde görüntülenmiyor. Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.
Sergey Dzyublik : MT5 hatası (2345 derlemesi) uzun süredir profil oluşturucunun neden başladığını ve çalıştığını anlayamadı, ancak sonuçlar hiçbir yerde görüntülenmiyor. Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.
Profil oluşturucu tüm göstergeler için çalışmaz (optimizasyon olmadan). Forumda iki kez yazdım, kodu LAN'daki geliştiricilere attım - cevap yok.
MT5'te profil oluşturucu ile çalıştı (2345 yapı), Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.
#include <stl_vector.mqh>
// TickCounts: 850
vector< int >::move test_vector_move_return_assign_by_index( int n){
vector< int > v(n);
for ( int i = 0 ; i < n; i++){
v[i].UNREF = i;
}
return v;
};
// TickCounts: 1450
vector< int >::move test_vector_move_return_push_back( int n){
vector< int > v;
// lazy implementation
v.reserve(n);
for ( int i = 0 ; i < n; i++){
v.push_back(i);
}
return v;
};
voidOnStart ()
{
for ( int i = 0 ; i < 20000 ; i++){
vector< int > v_int_move = test_vector_move_return_assign_by_index( 1000 );
}
for ( int i = 0 ; i < 20000 ; i++){
vector< int > v_int_move = test_vector_move_return_push_back( 1000 );
}
}
Sonuç olarak, MT5 profil oluşturucu ile pratik deneyim elde edildi ve çalışmasında bir takım kusurlar bulundu. Geliştiricilerin bu bilgilerle ilgilenip ilgilenmediği açık olmadığından ve hataları yerelleştirmek için saatlerce zaman harcamak istenmediğinden, yalnızca bulunan sorunlar hakkında kısa bilgiler verilecektir:
1) Farklı algoritmaların hızlarını karşılaştırmanın bir yolu yoktur. Bu nedenle, hem optimizasyon etkinleştirilmiş hem de etkinleştirilmemiş olarak diğerlerinden üç kat daha hızlı olan bir algoritma, profil oluşturucudaki en yavaş olabilir. Görünüşe göre, profil oluşturucu tarafında algoritmaların yürütme süresini etkileyen bir tür ek yük var, bu durumda profil oluşturucudaki algoritmaların hızını karşılaştırmanın bir anlamı yok.
2) Ekrandaki histogram araç ipuçlarında Yanlış Sayım değeri. Profil oluşturucu, fonksiyonun beklendiği gibi 20K değil 80K kez çalıştırıldığını yazar, benzer şekilde farklı satırlar için fonksiyonun içinde bazen, bazı satırlar için üç kez, diğerleri için iki kez Count fazlalığı vardır.
3) Ekrandaki histogram araç ipuçlarında Yanlış Zaman değeri. Profil oluşturucunun, algoritmanın zamanın% 99,90'ına girdiğini gösterdiği durumlar vardır, ancak gerçekte 20K'da yalnızca bir kez geçtiği ortaya çıktı.
Dün Veri Kataloğu'nu açtıktan sonra Göstergeler klasörünün Uzmanlar klasörüne nasıl taşındığını fark etmedim. Sonra MT5'i kapattım ve bugün açtım, göstergeler Navigator'dan da hiçbir şey olmamış gibi kullanılabilir. Ancak, Veri Kataloğu'nu tekrar açarsanız, orada Göstergeler boş bir klasör belirir ve içine zaten bir gösterge atarsanız. O zaman artık Gezgin'de görünmeyecektir. Göstergeler klasörünü MQL5\Indicators'a geri döndürmek sorunu çözer.
MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?
#define K 1000#define M ( 1000 * K)
#define SpeedTest(test_count,msg,EX) { uint mss= GetTickCount (); ulong count=test_count; for ( ulong ii= 0 ;ii<count&&! _StopFlag ;ii++){EX;} \
printf ( "%-60s: loops=%i ms=%u" ,msg,count, GetTickCount ()-mss);}
class A{
public :
int data;
};
struct B{
int data;
};
template < typename T>
void test1( constint test_count, constint array_size){
SpeedTest(
test_count, "Test Class ArrayResize all" ,
{
T class_array[];
for ( int i = 1 ; i <= array_size; i++){
ArrayResize (class_array, array_size);
}
}
)
};
template < typename T>
void test2( constint test_count, constint array_size){
SpeedTest(
test_count, "Test Class ArrayResize one by one with reserved memory" ,
{
T class_array[];
ArrayResize (class_array, 1 , array_size - 1 );
for ( int i = 2 ; i <= array_size; i++){
ArrayResize (class_array, i);
}
}
)
};
voidOnStart ()
{
constint test_count = 5 *K;
constint array_size = 5 *K;
test1< int >(test_count, array_size); // Avg time: 100
test2< int >(test_count, array_size); // Avg time: 190
test1< int >(test_count, array_size);
test2< int >(test_count, array_size);
test1< int >(test_count, array_size);
test2< int >(test_count, array_size);
test1< int >(test_count, array_size);
test2< int >(test_count, array_size);
printf ( "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" );
test1<A>(test_count, array_size); // Avg time: 810
test2<A>(test_count, array_size); // Avg time: 1460
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
test1<A>(test_count, array_size);
test2<A>(test_count, array_size);
printf ( "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" );
test1<B>(test_count, array_size); // Avg time: 110
test2<B>(test_count, array_size); // Avg time: 770
test1<B>(test_count, array_size);
test2<B>(test_count, array_size);
test1<B>(test_count, array_size);
test2<B>(test_count, array_size);
test1<B>(test_count, array_size);
test2<B>(test_count, array_size);
}
Lütfen ArrayResize kullanarak dahili rezervasyon algoritmasını iyileştirmeyi düşünün.
Örneğin, sınıflar için, yapıcıyı çağırmanın yanı sıra, bir tür "listelerde dahili kayıt" gerçekleştirdiklerini varsayabilirsiniz. ArrayResize kullanarak rezervasyonun bir parçası olarak, doğrudan bellek ayırmaya ek olarak, süreci optimize etmeyi deneyebilirsiniz: - oluşturulan komşu bir öğeden veri alın (örneğin, sanal işlevler tablosuna bir işaretçi); - henüz oluşturulmamış sınıfların "iç kaydı" için avans veya alan ayırma;
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Если ArrayResize() применена к статическому массиву, таймсерии или индикаторному буферу, то размер массива остается прежним – такие массивы не могут быть...
Sergey Dzyublik : MT5'te profil oluşturucu ile çalıştı (2345 yapı), Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.
...
Ne yazık ki, bu uzun süreli profil oluşturucu herhangi bir önemli proje için işe yaramaz. Bunu zaten bildirmeye çalıştım, ancak geliştiricilerden hiçbir ilgi yoktu.
MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?
Karşılaştırmak isterseniz şöyle olmalı:
voidtest1 ( constint test_count, constint array_size){
SpeedTest(
test_count,"Test Class ArrayResize all",
{
T class_array[];
for ( int i = 0 ; i < array_size; i++){
ArrayResize (class_array, i );
}
}
)
Benim açımdan, ne karşılaştırılmalıydı. Diziye kaç elemanın yerleştirileceğini biliyorum ve hepsini bir kerede oluşturmak yerine, oluşturulmamış olanlar için bellek ayırıyorum. Sorun şu ki, eğer bellek ayırırsam ve dizi öğelerini birer birer oluşturursam, o zaman her şeyi bir kerede oluşturmaktan çok daha fazla zaman alır. Yani yapılar için - 7 kat daha yavaş. Ve veri türleri için sınıf ve int iki kat daha yavaştır.
Bu çok büyük bir fark, bana öyle geliyor ki, istenirse geliştiriciler ortadan kaldırabilir.
Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.
MT5 hatası (2345 derlemesi) uzun süredir profil oluşturucunun neden başladığını ve çalıştığını anlayamadı, ancak sonuçlar hiçbir yerde görüntülenmiyor.
Komut dosyası projesi için profil oluşturucunun sonucu yalnızca optimizasyonun kapalı olduğu durumlarda gösterdiği, optimizasyon açıksa her şeyin başlayacağı, çalışacağı, ancak sonuçsuz olduğu ortaya çıktı.
Profil oluşturucu tüm göstergeler için çalışmaz (optimizasyon olmadan). Forumda iki kez yazdım, kodu LAN'daki geliştiricilere attım - cevap yok.
Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.
Sonuç olarak, MT5 profil oluşturucu ile pratik deneyim elde edildi ve çalışmasında bir takım kusurlar bulundu.
Geliştiricilerin bu bilgilerle ilgilenip ilgilenmediği açık olmadığından ve hataları yerelleştirmek için saatlerce zaman harcamak istenmediğinden, yalnızca bulunan sorunlar hakkında kısa bilgiler verilecektir:
1) Farklı algoritmaların hızlarını karşılaştırmanın bir yolu yoktur.
Bu nedenle, hem optimizasyon etkinleştirilmiş hem de etkinleştirilmemiş olarak diğerlerinden üç kat daha hızlı olan bir algoritma, profil oluşturucudaki en yavaş olabilir.
Görünüşe göre, profil oluşturucu tarafında algoritmaların yürütme süresini etkileyen bir tür ek yük var, bu durumda profil oluşturucudaki algoritmaların hızını karşılaştırmanın bir anlamı yok.
2) Ekrandaki histogram araç ipuçlarında Yanlış Sayım değeri.
Profil oluşturucu, fonksiyonun beklendiği gibi 20K değil 80K kez çalıştırıldığını yazar, benzer şekilde farklı satırlar için fonksiyonun içinde bazen, bazı satırlar için üç kez, diğerleri için iki kez Count fazlalığı vardır.
3) Ekrandaki histogram araç ipuçlarında Yanlış Zaman değeri.
Profil oluşturucunun, algoritmanın zamanın% 99,90'ına girdiğini gösterdiği durumlar vardır, ancak gerçekte 20K'da yalnızca bir kez geçtiği ortaya çıktı.
Bu bir hata değil, bir not!
mt 5 yapı 2340.
Dün Veri Kataloğu'nu açtıktan sonra Göstergeler klasörünün Uzmanlar klasörüne nasıl taşındığını fark etmedim. Sonra MT5'i kapattım ve bugün açtım, göstergeler Navigator'dan da hiçbir şey olmamış gibi kullanılabilir. Ancak, Veri Kataloğu'nu tekrar açarsanız, orada Göstergeler boş bir klasör belirir ve içine zaten bir gösterge atarsanız. O zaman artık Gezgin'de görünmeyecektir. Göstergeler klasörünü MQL5\Indicators'a geri döndürmek sorunu çözer.
MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?
Lütfen ArrayResize kullanarak dahili rezervasyon algoritmasını iyileştirmeyi düşünün.
Örneğin, sınıflar için, yapıcıyı çağırmanın yanı sıra, bir tür "listelerde dahili kayıt" gerçekleştirdiklerini varsayabilirsiniz.
ArrayResize kullanarak rezervasyonun bir parçası olarak, doğrudan bellek ayırmaya ek olarak, süreci optimize etmeyi deneyebilirsiniz:
- oluşturulan komşu bir öğeden veri alın (örneğin, sanal işlevler tablosuna bir işaretçi);
- henüz oluşturulmamış sınıfların "iç kaydı" için avans veya alan ayırma;
MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?
Bu bile yardımcı olmuyor.
Biraz saçmalık. Fren ivmesi yerine.
ZY Bu garip, Documentation zero'dan bir örneğin yürütülmesinin sonucu.
MT5'te profil oluşturucu ile çalıştı (2345 yapı),
Kabaca konuşursak, sonuçta aynı sonucu veren iki algoritmanın neden farklı hızlarda yürütüldüğüyle ilgilendim , optimizasyon modunda 1,7 kat düşüş.
...
MT5 (derleme 2347) ArrayResize kullanarak diziye bir öğe eklerken, bunlar için bellek önceden ayrılmışsa neden bu kadar büyük bir ek yük?
Karşılaştırmak isterseniz şöyle olmalı:
Karşılaştırmak isterseniz şöyle olmalı:
Benim açımdan, ne karşılaştırılmalıydı.
Diziye kaç elemanın yerleştirileceğini biliyorum ve hepsini bir kerede oluşturmak yerine, oluşturulmamış olanlar için bellek ayırıyorum.
Sorun şu ki, eğer bellek ayırırsam ve dizi öğelerini birer birer oluşturursam, o zaman her şeyi bir kerede oluşturmaktan çok daha fazla zaman alır.
Yani yapılar için - 7 kat daha yavaş.
Ve veri türleri için sınıf ve int iki kat daha yavaştır.
Bu çok büyük bir fark, bana öyle geliyor ki, istenirse geliştiriciler ortadan kaldırabilir.