Hatalar, hatalar, sorular - sayfa 655

 
Urain :

Bağlantı için teşekkürler, o zaman böyle bir sorunun peşinde: Videonun performansını bu kodla test etmek mümkün mü?

Değil. İlk önce sayfaya birkaç tane birden fazla nesne yapıştırmanız gerekir. Ve sonra döngü(10000){ ChartRedraw() ; }

:)

 
MetaDriver :

Değil. İlk önce sayfaya birkaç tane birden fazla nesne yapıştırmanız gerekir. Ve sonra loop(10000){ ChartRedraw(); }

:)

Eh, bir çift mulyon zaten çok fazla, ancak 100 bin ile test etmek oldukça mümkün.

 #property script_show_inputs
input uint Count= 1000 ;
input uint CountObj= 100000 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   long ChId= ChartID (); 
   for ( int i= 0 ;i<CountObj;i++)
     {
      ObjHLine(ChId,i, 1 .+(i/( double )CountObj));
     }
   uint st= GetTickCount ();
   for ( uint i= 0 ; i<Count; i++) ChartRedraw ();
   Alert ( "Count ChartRedraw()=" ,Count, " time=" , GetTickCount ()-st, " mk.c." );
   ObjectsDeleteAll (ChId, 0 , OBJ_HLINE );
  }
//+------------------------------------------------------------------+
void ObjHLine( ulong chart_id, string name, double price)
  {   
   ENUM_OBJECT   type= OBJ_HLINE ; // тип объекта  
   int           nwin= 0 ;                   // индекс окна   
//---
   if ( ObjectFind (chart_id,name)< 0 )
       ObjectCreate (chart_id,name,type,nwin, 0 , 0 , 0 , 0 );
   ObjectSetInteger (chart_id,name, OBJPROP_COLOR , clrGreen );
   ObjectSetDouble (chart_id,name, OBJPROP_PRICE ,price);
  }
//+------------------------------------------------------------------+

yeterince iyi mi? buna "MT5'e uygunluk açısından bir video kartının nesnel bir testi" denebilir mi?

Veya nesnelerin de değerlerini değiştirmesi gerekli olabilir mi?

 
Urain :

Eh, bir çift mulyon zaten çok fazla, ancak 100 bin ile test etmek oldukça mümkün.

yeterince iyi mi? buna "MT5'e uygunluk açısından bir video kartının nesnel bir testi" denebilir mi?

ne yazıyor? :) Sahibim

2012.02.27 19:04:09 CardTest(Urain) (EURUSD,H1) Count ChartRedraw()=1000 anda=26224 ms

 
MetaDriver :

ne yazıyor? Sahibim

2012.02.27 19:04:09 CardTest(Urain) (EURUSD,H1) Count ChartRedraw()=1000 anda=26224 ms


Bazı nesneleri yeniden çizmeyi ve işlemci ve videoyu belirtmeyi deneyelim, geliştiriciler reddetmezse, o zaman bir dal oluşturabiliriz ve herkes verilerini gönderir. İşte bazı nesneleri yeniden çizen kod.

 #property script_show_inputs
input uint Count= 1000 ;
input uint CountObj= 100000 ;
input uint CountObjRedrawt= 1000 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   long ChId= ChartID ();
   uint sto,eno,reso;

   for ( int i= 0 ;i<CountObj;i++)
     {
      ObjHLine(ChId,i, 1 .+(i/( double )CountObj));
     }
   sto= GetTickCount ();
   for ( int i= 0 ;i<CountObjRedrawt;i++)
       ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1 .+((i+ 1 )/( double )CountObj));
   eno= GetTickCount ();
   reso=eno-sto;

    uint st= GetTickCount ();
   for ( uint i= 0 ; i<Count; i++)
     {
       if (i% 2 == 0 )
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1 .+((i+ 2 )/( double )CountObj));
        }
       else
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1 .+((i+ 1 )/( double )CountObj));
        }
       ChartRedraw ();
     }
   Alert ( "ChartRedraw() Count=" ,Count, " CountObj=" ,CountObj, " CountObjRedrawt=" ,CountObjRedrawt, " time=" , GetTickCount ()-st-(reso*Count), " mk.c." );
   ObjectsDeleteAll (ChId, 0 , OBJ_HLINE );
  }
//+------------------------------------------------------------------+
void ObjHLine( ulong chart_id, string name, double price)
  {
   ENUM_OBJECT   type= OBJ_HLINE ; // тип объекта  
   int           nwin= 0 ;                   // индекс окна   
//---
   if ( ObjectFind (chart_id,name)< 0 )
       ObjectCreate (chart_id,name,type,nwin, 0 , 0 , 0 , 0 );
   ObjectSetInteger (chart_id,name, OBJPROP_COLOR , clrGreen );
   ObjectSetDouble (chart_id,name, OBJPROP_PRICE ,price);
  }
//+------------------------------------------------------------------+

Burada daha fazla baskıyı yeniden yazdım, böylece hangi ayarlarda görebilirsiniz.

Hata, dahili sayaçların j olarak değiştirilmesi gerekiyor.

 

yazar:

Test VideoCart (EURUSD,M15)     ChartRedraw () Count= 1000 CountObj= 100000 CountObjRedrawt= 1000 time= 24859 mk.c.
Проц P4 3 Гц, RAM 3 Гб
Видяха NVIDIA Corporation GeForce GT 430 with OpenCL 1.1 ( 2 units, 1400 MHz, 1023 Mb, version 295.73 )
 
Urain :

Bazı nesneleri yeniden çizmeyi ve işlemci ve videoyu belirtmeyi deneyelim, geliştiriciler reddetmezse, o zaman bir dal oluşturabiliriz ve herkes verilerini gönderir. İşte bazı nesneleri yeniden çizen kod.

Belirtilen test, video sistemi yerine nesnelerle (ObjectSetXXXX işlevleri) eşzamansız iletişim kuyruğunun ateşleme hızını test eder.
 
Renat :
Belirtilen test, video sistemi yerine nesnelerle (ObjectSetXXXX işlevleri) eşzamansız iletişim kuyruğunun ateşleme hızını test eder.

Onaylamıyorum, ancak belki de testin başlamasından önce, nesne değiştirme döngüsünün zamanının ölçüldüğünü ve ardından zamanın bir katının toplamdan düşüldüğünü fark etmediniz.

   sto= GetTickCount ();
   for ( int i= 0 ;i<CountObjRedrawt;i++)
       ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1 .+((i+ 1 )/( double )CountObj));
   eno= GetTickCount ();
   reso=eno-sto;
...
   " time=" , GetTickCount ()-st-(reso*Count)

Yanlışsam düzelt.

ZY edinvenno if (i% 2 == 0) için pay ayırmıyorum ama bu kontrolün göstergeleri önemli ölçüde değiştireceğini düşünmüyorum çünkü farklı videolarda göreceli bir rakama ihtiyacımız var.

Bu arada, bu tür ölçümler yeniden çizmeden ve hatta biraz daha fazla elde edilir; bu, muhtemelen ObjectSetXXXX işlevinin sık kullanımıyla çalışmasının bir şekilde hızlandırıldığını ve zaman çıkarma işleminin biraz fazla tahmin edildiğini gösterir.

 
Urain :

yazar:

Şimdi böyle:

2012.02.27 19:37:44    gpu_Test (Urain) (EURUSD,M30)    ChartRedraw() Count=1000 CountObj=100000 CountObjRedrawt=1000 time=22792 mk.c.

CPU: AuthenticAMD AMD Phenom(tm) II X6 1100T Processor with OpenCL 1.1 (6 units, 3840 MHz, 16345 Mb, version 2.0)
GPU: Advanced Micro Devices, Inc. Cayman with OpenCL 1.1 (20 units, 750 MHz, 1024 Mb, version CAL 1.4.1664 (VM))


Ama boş ekranda. Ve bunun üzerindeyken (üst göstergede 512 satır ve altta aynı sayı):


o zaman böyle

2012.02.27 19:47:53    gpu_Test (Urain) (EURUSD,M1)    ChartRedraw() Count=1000 CountObj=100000 CountObjRedrawt=1000 time=123022 mk.c.

Üstelik, hindi kendisi şu anda GPU'yu yüklemez (CPU üzerindeki sıfır çubuğunda hesaplama), tüm bu rezaletin tamamen terminal oluşturmasını yükler.
 
Urain :

Onaylamıyorum, ancak belki de testin başlamasından önce, nesne değiştirme döngüsünün zamanının ölçüldüğünü ve ardından zamanın bir katının toplamdan düşüldüğünü fark etmediniz.

Evet, bir düzeltme operasyonu olduğunu hemen fark etmedim.

Ama yine de düzeltmem tamamen doğru. Eşzamansız bir sıranın ateş hızı (ve bu gerçekten bir sıradır) doğrudan onunla çalışma moduna bağlıdır.

İlk olarak, harici uyaranlar olmadan yazma kuyruğunun hızını ölçtünüz ve ondan işlemleri okudunuz. Aslında anında oldu (reso=0 ms, kendiniz kontrol edin). Ancak daha sonra testlerde yalnızca yazmayı değil, aynı zamanda tüm işlemleri okumak ve üst üste bindirmek için sırayı engellemeye başlayan ChartRedraw aracılığıyla okumayı da kullanmaya başladınız.

Aslında bu, mevcut 100.000 nesne kümesinden 1.000 nesne arasında 1.000.000 değişikliğin bir testidir. ObjectXXXx işlevlerini kullanırken buna video testi diyemezsiniz.

 
Renat :

Evet, bir düzeltme operasyonu olduğunu hemen fark etmedim.

Ama yine de düzeltmem tamamen doğru. Eşzamansız bir sıranın ateş hızı (ve bu gerçekten bir sıradır) doğrudan onunla çalışma moduna bağlıdır.

İlk olarak, harici uyaranlar olmadan yazma kuyruğunun hızını ölçtünüz ve ondan işlemleri okudunuz. Aslında anında oldu (reso=0 ms, kendiniz kontrol edin). Ancak daha sonra testlerde yalnızca yazmayı değil, aynı zamanda tüm işlemleri okumak ve üst üste bindirmek için sırayı engellemeye başlayan ChartRedraw aracılığıyla okumayı da kullanmaya başladınız.

Aslında bu, mevcut 100.000 nesne kümesinden 1.000 nesne arasında 1.000.000 değişikliğin bir testidir. ObjectXXXx işlevlerini kullanırken buna video testi diyemezsiniz.

Ve önce tüm yeniden çizim setini ChartRedraw olmadan ve sonra onunla ölçerseniz ve bir kesinti yaparsanız, bu doğru olacak mı?

Bu arada konu oldukça alakalı, bir test dizisi yazabilirsiniz, mql'nin iç yapısını bilmek sizin için daha kolay.

 #property script_show_inputs
input uint Count= 1000 ;
input uint CountObj= 100000 ;
input uint CountObjRedrawt= 1000 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
   long ChId= ChartID ();
   uint sto,eno,reso;

   for ( int i= 0 ;i<CountObj;i++)
     {
      ObjHLine(ChId,i, 1 .+(i/( double )CountObj));
     }
   sto= GetTickCount (); // замерим время вычета
   for ( uint i= 0 ; i<Count; i++)
     {
       if (i% 2 == 0 )
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1.2 +((i+ 2 )/( double )CountObj));
        }
       else
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1.2 +((i+ 1 )/( double )CountObj));
        }      
     }
   for ( int i= 0 ;i<CountObj;i++) // вернём всё в исходное состояние
     {
       ObjectSetDouble (ChId,i, OBJPROP_PRICE , 1 .+(i/( double )CountObj));
     }     
   eno= GetTickCount ();
   reso=eno-sto;
   
   uint st= GetTickCount ();
   for ( uint i= 0 ; i<Count; i++)
     {
       if (i% 2 == 0 )
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1.2 +((i+ 2 )/( double )CountObj));
        }
       else
        {
         for ( int j= 0 ;j<CountObjRedrawt;j++)
             ObjectSetDouble (ChId, rand ()%CountObj, OBJPROP_PRICE , 1.2 +((i+ 1 )/( double )CountObj));
        }
       ChartRedraw ();
     }
   Alert ( "ChartRedraw() Count=" ,Count, " CountObj=" ,CountObj, " CountObjRedrawt=" ,CountObjRedrawt, " time=" , GetTickCount ()-st-reso, " mk.c." );
   ObjectsDeleteAll (ChId, 0 , OBJ_HLINE );
  }
//+------------------------------------------------------------------+
void ObjHLine( ulong chart_id, string name, double price)
  {
   ENUM_OBJECT   type= OBJ_HLINE ; // тип объекта  
   int           nwin= 0 ;                   // индекс окна   
//---
   if ( ObjectFind (chart_id,name)< 0 )
       ObjectCreate (chart_id,name,type,nwin, 0 , 0 , 0 , 0 );
   ObjectSetInteger (chart_id,name, OBJPROP_COLOR , clrGreen );
   ObjectSetDouble (chart_id,name, OBJPROP_PRICE ,price);
  }
//+------------------------------------------------------------------+