错误、漏洞、问题 - 页 655

 
Urain:

谢谢你的链接,但只是一个后续问题:这个代码可以用来测试显卡性能吗?

没有。首先,你必须在每页添加几百万个对象。然后循环(10000){ChartRedraw(); }

:)

 
MetaDriver:

Nah.首先,你将不得不在每页添加几百万个对象。然后循环(10000){ ChartRedraw(); }

:)

几百万是太多了,但10万对于一个测试来说已经足够了。

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

是否可以称之为 "客观测试显卡对MT5的适用性"?

或者说,对象也应该改变它们的价值?

 
Urain:

几百万是太多了,但10万对于一个测试来说已经足够了。

是否可以称其为 "mt5的客观显卡测试"?

它说的是什么?:) 我有

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

 
MetaDriver:

它说什么? 我的。

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


让我们尝试重新绘制部分对象,并指定CPU和显卡。 如果开发人员不拒绝,那么我们可以创建一个分支,每个人都会发布他们的数据。下面是重绘部分对象的代码。

#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:

让我们尝试重新绘制部分对象,并指定CPU和显卡。 如果开发人员不拒绝,我们可以创建一个分支,所有愿意的人都会发布他们的数据。下面是重绘部分对象的代码。

这个测试更多的是测试与对象的异步通信队列的速度(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)

如果我说错了,请纠正我。

SZY 独一无二的是,我不考虑if(i%2==0),但我不认为这个测试会大大改变数字,我们需要不同视频上的相对数字。

HH顺便说一下,在没有重绘的情况下,也得到了类似的测量结果,甚至更多一点,这可能说明,当频繁使用ObjectSetXXXXX函数时,它的工作在某种程度上被加速了,时间的推导被稍微高估了。

 
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.

而指标本身在这个时候并不加载GPU(在CPU上的零条计算),它只加载所有这些混乱的终端渲染。
 
Urain:

我不是在宣称,但也许你没有注意到,在测试开始前,测量了改变物体的循环时间,随后从总数中减去了时间的倍数。

是的,我没有马上注意到有一个校正操作。

但我的纠正仍然是完全正确的。异步队列(其实就是一个队列)的速度直接取决于队列的运行模式。

首先,你测量了在没有外部刺激的情况下每次写入队列的速度,也没有从它那里读取操作。事实上,它是瞬时的(reso=0ms,自己检查)。但后来你开始在测试中不仅使用写操作,还通过ChartRedraw 使用读操作,这就开始阻塞了校对的队列,并使所有操作重叠。

事实上,这是对现有的100,000个对象中的1,000个对象的变化的测试。没有办法使用ObjectXXXx函数将其称为视频测试。

 
Renat:

是的,我没有马上注意到有一个校正操作。

但我的纠正仍然是完全正确的。异步队列(其实就是一个队列)的速度直接取决于处理它的模式。

首先,你测量了在没有外部刺激的情况下每次写入队列的速度,也没有从它那里读取操作。事实上,它是瞬时的(reso=0ms,自己检查)。但后来你开始在测试中不仅使用写操作,还通过ChartRedraw使用读操作,这就开始阻塞了校对的队列,并使所有操作重叠。

事实上,这是对现有的100,000个对象中的1,000个对象的变化的测试。这不能称为使用ObjectXXXx函数的视频测试。

而如果我们首先在没有ChartRedraw 的情况下测量全套重绘,然后在有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);
  }
//+------------------------------------------------------------------+