Ошибки, баги, вопросы - страница 655

 
Urain:

Спасибо за ссылочку, тогда в догонку такой вопрос: можно ли этим кодом тестировать производительность видяхи?

Не. Сначала нужно пару мульёнов объектов на страницу налепить. А потом уже loop(10000){ ChartRedraw(); } 

:)

 
MetaDriver:

Не. Сначала нужно пару мульёнов объектов на страницу налепить. А потом уже loop(10000){ ChartRedraw(); } 

:)

Ну пару мульёнов это уже перебор но вот со 100 тысяч вполне можно потестировать.

#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);
  }
//+------------------------------------------------------------------+

Так годится? можно ли это назвать "объективный тест видеокарты на пригодность для МТ5" ?

Или может быть нужно чтоб объекты ещё и меняли свои значения?

 
Urain:

Ну пару мульёнов это уже перебор но вот со 100 тысяч вполне можно потестировать.

Так годится? можно ли это назвать "объективный тест видеокарты на пригодность для МТ5" ?

чего пишет-то? :)  у меня

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

 
MetaDriver:

чего пишет-то? у меня

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


Давай попробуем с перерисовкой части объектов, и с указанием проца и видяхи, если разработчики не забракуют то можно создать ветку и все желающие выложат свои данные. Вот код с перерисовкой части объектов.

#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);
  }
//+------------------------------------------------------------------+

вот переписал ещё принты чтоб было видно на каких настройках.

Упс внутренние счётчики нужно на j поменять.

 

Пишет:

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:

Давай попробуем с перерисовкой части объектов, и с указанием проца и видяхи, если разработчики не забракуют то можно создать ветку и все желающие выложат свои данные. Вот код с перерисовкой части объектов.

Указанный тест больше тестирует скорострельность асинхронной очереди коммуникации с объектами (функции ObjectSetXXXX), а не видеосистему.
 
Renat:
Указанный тест больше тестирует скорострельность асинхронной очереди коммуникации с объектами (функции ObjectSetXXXX), а не видеосистему.

Я не утверждаю, но может вы не заметили что перед началом теста было замерено время цилка изменения объектов, с последующим вычетом кратного времени из общего.

   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)

Поправьте если я ошибаюсь.

ЗЫ едиснвенно я не делаю скидку на if(i%2==0) но не думаю что эта проверка существенно изменит показатели, нам ведь нужна относительная цифра на разных видяхах.

ЗЫ кстати подобные замеры получаются и без перерисовки, да же чуть больше что наверно говорит о том что при частом использовании функции ObjectSetXXXX её работа как то ускоряется, и вычет времени немного переоценивается.

 
Urain:

Пишет:

Теперь так:

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))


Но это на пустом экране. А когда вот на таком (512 линий на верхнем индикаторе и столько же на нижнем):


тогда вот так

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

Причём индюк сам по себе ГПУ в это время не грузит (расчёт на нулевом баре на ЦПУ), грузит чисто терминальная отрисовка всего этого безобразия.
 
Urain:

Я не утверждаю, но может вы не заметили что перед началом теста было замерено время цилка изменения объектов, с последующим вычетом кратного времени из общего.

Да, я сразу не заметил, что есть операция коррекции.

Но все равно моя поправка полностью корректна. Скорострельность асинхронной очереди (а это реально очередь) напрямую зависит от режима работы с ней.

Вначале Вы замерили скорость очереди за запись без внешних раздражителей и операций чтения из нее. Фактически это произошло мгновенно (reso=0 ms, проверьте сами). Но потом в тестах Вы начали использовать не только запись, но и чтение через ChartRedraw, что начало приводить к блокировке очереди на вычитку и наложения всех операций.

Фактически это тест 1 000 000 изменений среди 1 000 объектов из существующего набора в 100 000 объектов. Назвать это тестом видео при использовании ObjectXXXx функций никак нельзя.

 
Renat:

Да, я сразу не заметил, что есть операция коррекции.

Но все равно моя поправка полностью корректна. Скорострельность асинхронной очереди (а это реально очередь) напрямую зависит от режима работы с ней.

Вначале Вы замерили скорость очереди за запись без внешних раздражителей и операций чтения из нее. Фактически это произошло мгновенно (reso=0 ms, проверьте сами). Но потом в тестах Вы начали использовать не только запись, но и чтение через ChartRedraw, что начало приводить к блокировке очереди на вычитку и наложения всех операций.

Фактически это тест 1 000 000 изменений среди 1 000 объектов из существующего набора в 100 000 объектов. Назвать это тестом видео при использовании ObjectXXXx функций никак нельзя.

А если сначало замерить полный набор перерисовок без ChartRedraw а потом с ней, и сделать вычет, это будет корректным?

Кстати тема довольно актуальна, могли бы и написать какой нить тестик, вам то со знанием внутренней структуры mql проще.

#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);
  }
//+------------------------------------------------------------------+
Причина обращения: