오류, 버그, 질문 - 페이지 655

 
Urain :

링크 주셔서 감사합니다. 그런 다음 이러한 질문을 추구합니다. 이 코드로 vidyahi의 성능을 테스트할 수 있습니까?

아니다. 먼저 페이지에 여러 개체를 고정해야 합니다. 그런 다음 loop(10000){ ChartRedraw() ; }

:)

 
MetaDriver :

아니다. 먼저 페이지에 여러 개체를 고정해야 합니다. 그런 다음 loop(10000){ ChartRedraw(); }

:)

글쎄, 두 개의 멀리언은 이미 너무 많지만 100,000으로 테스트하는 것이 가능합니다.

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

글쎄, 두 개의 멀리언은 이미 너무 많지만 100,000으로 테스트하는 것이 가능합니다.

충분히 좋은가요? 이것은 "MT5에 대한 적합성을 위한 비디오 카드의 객관적인 테스트"라고 할 수 있습니까?

그는 무엇을 씁니까? :) 나는 가지고있다

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

 
MetaDriver :

그는 무엇을 씁니까? 나는 가지고있다

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


일부 개체를 다시 그리고 프로세서와 비디오를 표시해 보겠습니다. 개발자가 거부하지 않으면 분기를 만들 수 있고 모든 사람이 데이터를 게시할 수 있습니다. 다음은 일부 개체를 다시 그리는 코드입니다.

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

틀 렸으면 고쳐줘.

ZY edinvenno 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.

게다가 칠면조 자체는 이 시점에서 GPU를 로드하지 않고(CPU의 0 막대에서 계산) 이 모든 불명예의 순전히 터미널 렌더링을 로드합니다.
 
Urain :

나는 승인하지 않지만 아마도 당신은 테스트가 시작되기 전에 객체 변경 주기의 시간이 측정되었다는 것을 눈치채지 못했을 것입니다.

예, 수정 작업이 있다는 것을 즉시 알아차리지 못했습니다.

그러나 여전히 내 수정은 완전히 정확합니다. 비동기 큐(실제로 큐임)의 실행 속도는 작업 모드에 직접적으로 의존합니다.

먼저 외부 자극 없이 쓰기 및 읽기 작업을 수행하는 대기열의 속도를 측정했습니다. 실제로, 즉시 발생했습니다(reso=0ms, 직접 확인). 그러나 테스트에서 쓰기뿐만 아니라 ChartRedraw 를 통한 읽기도 사용하기 시작하여 모든 작업을 읽고 겹치기 위한 대기열을 차단하기 시작했습니다.

사실 이것은 100,000개의 기존 개체 집합에서 1,000개의 개체 중 1,000,000개의 변경 사항에 대한 테스트입니다. ObjectXXXx 기능을 사용할 때는 비디오 테스트라고 할 수 없습니다.

 
Renat :

예, 수정 작업이 있다는 것을 즉시 알아차리지 못했습니다.

그러나 여전히 내 수정은 완전히 정확합니다. 비동기 큐(실제로 큐임)의 실행 속도는 작업 모드에 직접적으로 의존합니다.

먼저 외부 자극 없이 쓰기 및 읽기 작업을 수행하는 대기열의 속도를 측정했습니다. 실제로, 즉시 발생했습니다(reso=0ms, 직접 확인). 그러나 테스트에서 쓰기뿐만 아니라 모든 작업을 읽고 겹치기 위한 대기열을 차단하기 시작한 ChartRedraw를 통한 읽기도 사용하기 시작했습니다.

사실 이것은 100,000개의 기존 개체 집합에서 1,000개의 개체 중 1,000,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);
  }
//+------------------------------------------------------------------+