차트의 개별 텍스트 레이블 및 비트맵 작업 성능 테스트

Renat Fatkhullin  

토론은 여기에서 시작되었습니다: https://www.mql5.com/en/forum/1111/page989#comment_480838

원래 진술은 다음과 같습니다. 비트맵은 텍스트 개체보다 몇 배/수십 배 느리게 작동합니다. 토론하고 테스트 소스를 확인한 후 그림이 정리되었고 비트맵이 분명히 더 빠르게 작동하는 것으로 나타났습니다.

테스트는 약한 비디오 카드 NVIDIA GeForce GT 640M에서 Windows 8 x64의 64비트 MetaTrader 5에서 수행되었습니다. 테스트 스크립트에서 얻은 결과(시간이 적을수록 좋음)는 다음과 같습니다.

2013.04.27 22:21:50	BenchmarkLabel (EURUSD,M15)	Тестирование завершено
2013.04.27 22:21:50	BenchmarkLabel (EURUSD,M15)	5. Время обновления текста и позиций у битмапа без прозрачности = 15007 ms
2013.04.27 22:21:35	BenchmarkLabel (EURUSD,M15)	4. Время обновления текста и позиций у битмапа с прозрачностью = 15257 ms
2013.04.27 22:21:20	BenchmarkLabel (EURUSD,M15)	3. Время обновления текста и позиций у меток со чтением = 16739 ms
2013.04.27 22:21:03	BenchmarkLabel (EURUSD,M15)	2. Время обновления текста и позиций у меток без чтения = 18845 ms
2013.04.27 22:20:44	BenchmarkLabel (EURUSD,M15)	1. Время обновления текста у меток без чтения = 21497 ms
2013.04.27 22:20:23	BenchmarkLabel (EURUSD,M15)	0. Время разогрева динамических очередей без визуализации = 124 ms
2013.04.27 22:20:23	BenchmarkLabel (EURUSD,M15)	Для корректного теста подберите размер окна 1024 x 768 пикселей, без индикаторов, не трогайте ничего, не сворачивайте и не закрывайте окна
2013.04.27 22:20:23	BenchmarkLabel (EURUSD,M15)	Разрешение чарта: 1020 x 761 пикселей

레이블 작업은 비트맵 작업보다 약 60% 느립니다.

다음은 누구나 다운로드하여 스스로 테스트하고 결과를 게시할 수 있는 테스트 스크립트입니다.

 #property script_show_inputs

//---
input int    inRefreshCount= 5000 ;
input int    inNumberOfLabels= 26 ;
input color inTextColor= clrRed ;

uint ExtCanvas[];
int   ExtBitmapWidth= 20 ;             // вычислится автоматически
int   ExtBitmapHeight= 20 ;             // вычислится автоматически
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {
//--- выведем разделитель для журнала и инициализируем рандом
   Print ( "" );
   MathSrand ( GetTickCount ());
//--- покажем разрешение чарта
   Print ( "Разрешение чарта: " , ChartGetInteger ( ChartID (), CHART_WIDTH_IN_PIXELS , 0 ), " x " , ChartGetInteger ( ChartID (), CHART_HEIGHT_IN_PIXELS , 0 ), " пикселей" );
   Print ( "Для корректного теста подберите размер окна 1024 x 768 пикселей, без индикаторов, не трогайте ничего, не сворачивайте и не закрывайте окна" );
//--- cоздание меток
   CreateLabels();
   ChartRedraw ( 0 );
//--- 0. холостой разогрев динамических очередей
   string name;
   uint    start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         name= "ObjectLabel#" + IntegerToString (j);
         ObjectSetString ( 0 ,name, OBJPROP_TEXT , IntegerToString ( MathRand ()));
        }
     }
   ChartRedraw ( 0 );
   Print ( "0. Время разогрева динамических очередей без визуализации = " , GetTickCount ()-start, " ms" );
//--- 1. замерим скорость обновление меток (текст)
   start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         name= "ObjectLabel#" + IntegerToString (j);
         ObjectSetString ( 0 ,name, OBJPROP_TEXT , IntegerToString ( MathRand ()));
        }
       ChartRedraw ( 0 );
     }
   Print ( "1. Время обновления текста у меток без чтения = " , GetTickCount ()-start, " ms" );
//--- 2. замерим скорость обновление меток (текст + смена позиций)
   start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         name= "ObjectLabel#" + IntegerToString (j);
         ObjectSetInteger ( 0 ,name, OBJPROP_XDISTANCE , 10 +j* 10 +(i& 3 ));
         ObjectSetInteger ( 0 ,name, OBJPROP_YDISTANCE , 10 +j* 10 +(i& 3 ));
         ObjectSetString ( 0 ,name, OBJPROP_TEXT , IntegerToString ( MathRand ()));
        }
       ChartRedraw ( 0 );
     }
   Print ( "2. Время обновления текста и позиций у меток без чтения = " , GetTickCount ()-start, " ms" );
//--- 3. замерим скорость обновление меток (текст + смена позиций) со чтением позиций
   start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         name= "ObjectLabel#" + IntegerToString (j);
         long pos= ObjectGetInteger ( 0 ,name, OBJPROP_XDISTANCE );
         ObjectSetInteger ( 0 ,name, OBJPROP_XDISTANCE , 10 +j* 10 +(i& 3 ));
         ObjectSetInteger ( 0 ,name, OBJPROP_YDISTANCE , 10 +j* 10 +(i& 3 ));
         ObjectSetString ( 0 ,name, OBJPROP_TEXT , IntegerToString ( MathRand ()));
        }
       ChartRedraw ( 0 );
     }
   Print ( "3. Время обновления текста и позиций у меток со чтением = " , GetTickCount ()-start, " ms" );
//--- переходим к тестам битмапа
   CreateBitmap();
   ChartRedraw ( 0 );
//--- 4. замерим скорость отрисовки меток в канвасе с прозрачностью
   uint    textclr= ColorToARGB (inTextColor);

   name= "ObjectBitmap" ;
   start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       ArrayInitialize (ExtCanvas, 0 );
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         TextOut ( IntegerToString ( MathRand ()), 10 +j* 10 +(i& 3 ), 10 +j* 10 +(i& 3 ), TA_LEFT | TA_TOP ,ExtCanvas,ExtBitmapWidth,ExtBitmapHeight,textclr, COLOR_FORMAT_ARGB_RAW );
        }
       ResourceCreate ( "::" +name,ExtCanvas,ExtBitmapWidth,ExtBitmapHeight, 0 , 0 ,ExtBitmapWidth, COLOR_FORMAT_ARGB_RAW );
       ChartRedraw ( 0 );
     }
   Print ( "4. Время обновления текста и позиций у битмапа с прозрачностью = " , GetTickCount ()-start, " ms" );
//--- 5. замерим скорость отрисовки меток в канвасе без прозрачности
   start= GetTickCount ();

   for ( int i= 0 ;i<inRefreshCount && ! IsStopped ();i++)
     {
       ArrayInitialize (ExtCanvas, ColorToARGB ( clrAqua ));
       for ( int j= 0 ;j<inNumberOfLabels;j++)
        {
         TextOut ( IntegerToString ( MathRand ()), 10 +j* 10 +(i& 3 ), 10 +j* 10 +(i& 3 ), TA_LEFT | TA_TOP ,ExtCanvas,ExtBitmapWidth,ExtBitmapHeight,textclr, COLOR_FORMAT_XRGB_NOALPHA );
        }
       ResourceCreate ( "::" +name,ExtCanvas,ExtBitmapWidth,ExtBitmapHeight, 0 , 0 ,ExtBitmapWidth, COLOR_FORMAT_XRGB_NOALPHA );
       ChartRedraw ( 0 );
     }
   Print ( "5. Время обновления текста и позиций у битмапа без прозрачности = " , GetTickCount ()-start, " ms" );
//--- удалим массив битмапа
   ArrayFree (ExtCanvas);
   Print ( "Тестирование завершено" );
  }
//+------------------------------------------------------------------+
//| Создадим объекты                                                 |
//+------------------------------------------------------------------+
void CreateLabels( void )
  {
//--- удалим все объекты с чарта
   ObjectsDeleteAll ( 0 );
//--- создадим метки
   string name;

   for ( int i= 0 ; i<inNumberOfLabels; i++)
     {
      name= "ObjectLabel#" + IntegerToString (i);
       if (ObjectCreate( 0 ,name, OBJ_LABEL , 0 , 0 , 0 ))
        {
         ObjectSetInteger ( 0 ,name, OBJPROP_CORNER , CORNER_LEFT_UPPER );
         ObjectSetInteger ( 0 ,name, OBJPROP_ANCHOR , ANCHOR_LEFT_UPPER );
         ObjectSetInteger ( 0 ,name, OBJPROP_XDISTANCE , 10 +i* 10 );
         ObjectSetInteger ( 0 ,name, OBJPROP_YDISTANCE , 10 +i* 10 );
         ObjectSetInteger ( 0 ,name, OBJPROP_COLOR ,inTextColor);
         ObjectSetInteger ( 0 ,name, OBJPROP_SELECTABLE , false );
         ObjectSetInteger ( 0 ,name, OBJPROP_FONTSIZE , 10 );
         ObjectSetString ( 0 ,name, OBJPROP_FONT , "Courier New" );
         ObjectSetString ( 0 ,name, OBJPROP_TEXT ,name);
        }
     }
//---
  }
//+------------------------------------------------------------------+
//| Создаем битмап                                                   |
//+------------------------------------------------------------------+
void CreateBitmap( void )
  {
   string name= "ObjectBitmap" ;
//--- удалим все объекты с чарта
   ObjectsDeleteAll ( 0 );
//--- выделим место под битмап, занулим его
   ExtBitmapWidth= 20 + 12 *inNumberOfLabels;
   ExtBitmapHeight= 20 + 10 *inNumberOfLabels;
   ArrayResize (ExtCanvas,ExtBitmapWidth*ExtBitmapHeight);
   ArrayInitialize (ExtCanvas, 0 );
//--- создадим битмап и привяжем ресурс
   ObjectCreate( 0 ,name, OBJ_BITMAP_LABEL , 0 , 0 , 0 );
   ObjectSetString ( 0 ,name, OBJPROP_BMPFILE , "::" +name);
//--- выставим размер текста
   TextSetFont ( "Arial" ,- 90 );
  }
//+---------------------------------------------------------------------------------------------------------------------------+
파일:
Anatoli Kazharski  

그건 그렇고, 투명도가 있고 투명도가 없으면 그렇게 큰 차이가 없습니다.

 2013.04 . 27 18 : 24 : 32      BenchmarkLabel__1 (USDCHF,H1)   Тестирование завершено
2013.04 . 27 18 : 24 : 32      BenchmarkLabel__1 (USDCHF,H1)   5 . Время обновления текста и позиций у битмапа без прозрачности = 13229 ms
2013.04 . 27 18 : 24 : 19      BenchmarkLabel__1 (USDCHF,H1)   4 . Время обновления текста и позиций у битмапа c прозрачностью = 13994 ms
2013.04 . 27 18 : 24 : 05      BenchmarkLabel__1 (USDCHF,H1)   3 . Время обновления текста и позиций у меток с чтением = 32229 ms
2013.04 . 27 18 : 23 : 33      BenchmarkLabel__1 (USDCHF,H1)   2 . Время обновления текста и позиций у меток без чтения = 10671 ms
2013.04 . 27 18 : 23 : 22      BenchmarkLabel__1 (USDCHF,H1)   1 . Время обновления текста у меток без чтения = 10733 ms
2013.04 . 27 18 : 23 : 11      BenchmarkLabel__1 (USDCHF,H1)   0 . Время разогрева динамических очередей без визуализации = 187 ms
Renat Fatkhullin  
예, 이미 비디오 드라이버의 효율성에 달려 있습니다.
[삭제]  
2013.04 . 27 20 : 09 : 37      BenchmarkObjects (EURUSD,M5)     5 . Время обновления текста и позиций у битмапа без прозрачности = 12558 ms
2013.04 . 27 20 : 09 : 24      BenchmarkObjects (EURUSD,M5)     4 . Время обновления текста и позиций у битмапа с прозрачностью = 12839 ms
2013.04 . 27 20 : 09 : 11      BenchmarkObjects (EURUSD,M5)     3 . Время обновления текста и позиций у меток с чтением = 2355 ms
2013.04 . 27 20 : 09 : 09      BenchmarkObjects (EURUSD,M5)     2 . Время обновления текста и позиций у меток без чтения = 10655 ms
2013.04 . 27 20 : 08 : 58      BenchmarkObjects (EURUSD,M5)     1 . Время обновления текста у меток без чтения = 10359 ms
2013.04 . 27 20 : 08 : 48      BenchmarkObjects (EURUSD,M5)     0 . Время разогрева динамических очередей без визуализации = 124 ms

일부 결과가 이상합니다. 우리는 코드를 볼 필요가 있습니다.

그러나 이전과 마찬가지로 레이블 작업 속도는 비트맵보다 빠릅니다.


테스트는 약한 비디오 카드 NVIDIA GeForce GT 330M에서 Windows 7 x64의 64비트 MetaTrader 5에서 수행되었습니다.

Renat Fatkhullin  
운영체제와 비디오 카드의 종류를 나타내는 결과를 10개 정도 수집해야 합니다.

표시기 없이 창을 전환하거나 창을 숨기지 않고 전체 화면에서 열린 하나의 열린 차트로 테스트해야 합니다.

이 작업은 렌더링에 직접적으로 의존하기 때문에 작은 창 크기에서 최소화, 최소화 또는 테스트하는 것은 허용되지 않습니다.

전환하지 않고 완전히 열린 창에서 테스트를 다시 수행하십시오.
Mykola Demko  
테스트는 규칙에 따라 수행되었습니다.

 2013.04 . 27 19 : 20 : 00      OpenCL  Device # 0 : GPU NVIDIA Corporation GeForce GT 430 with OpenCL 1.1 ( 2 units, 1400 MHz, 1023 Mb, version 296.10 , rating 159 )
2013.04 . 27 19 : 19 : 58      Terminal        MetaTrader 5 build 803 started (MetaQuotes Software Corp.)
WinXP SP3 x86 3 Гц RAM 3 Гб

2013.04 . 27 19 : 34 : 53      BenchmarkLabel__1 (EURUSD,H1)   Тестирование завершено
2013.04 . 27 19 : 34 : 53      BenchmarkLabel__1 (EURUSD,H1)   5 . Время обновления текста и позиций у битмапа с прозрачностью = 38672 ms
2013.04 . 27 19 : 34 : 14      BenchmarkLabel__1 (EURUSD,H1)   4 . Время обновления текста и позиций у битмапа с прозрачностью = 39140 ms
2013.04 . 27 19 : 33 : 35      BenchmarkLabel__1 (EURUSD,H1)   3 . Время обновления текста и позиций у меток со чтением = 128203 ms
2013.04 . 27 19 : 31 : 27      BenchmarkLabel__1 (EURUSD,H1)   2 . Время обновления текста и позиций у меток без чтения = 33000 ms
2013.04 . 27 19 : 30 : 54      BenchmarkLabel__1 (EURUSD,H1)   1 . Время обновления текста у меток без чтения = 31969 ms
2013.04 . 27 19 : 30 : 22      BenchmarkLabel__1 (EURUSD,H1)   0 . Время разогрева динамических очередей без визуализации = 281 ms
2013.04 . 27 19 : 30 : 21      BenchmarkLabel__1 (EURUSD,H1)
Renat Fatkhullin  
Point 5는 투명하게 읽어야 한다, 결론을 수정하는 것을 잊었다
[삭제]  

이전에는 빌드 794가 있었습니다. 다음은 803으로 테스트한 것입니다.

 2013.04 . 27 20 : 59 : 43      BenchmarkObjects (EURUSD,M1)     5 . Время обновления текста и позиций у битмапа без прозрачности = 5101 ms
2013.04 . 27 20 : 59 : 38      BenchmarkObjects (EURUSD,M1)     4 . Время обновления текста и позиций у битмапа с прозрачностью = 5195 ms
2013.04 . 27 20 : 59 : 33      BenchmarkObjects (EURUSD,M1)     3 . Время обновления текста и позиций у меток с чтением = 4103 ms
2013.04 . 27 20 : 59 : 29      BenchmarkObjects (EURUSD,M1)     2 . Время обновления текста и позиций у меток без чтения = 3557 ms
2013.04 . 27 20 : 59 : 25      BenchmarkObjects (EURUSD,M1)     1 . Время обновления текста у меток без чтения = 3338 ms
2013.04 . 27 20 : 59 : 22      BenchmarkObjects (EURUSD,M1)     0 . Время разогрева динамических очередей без визуализации = 109 ms

가능하다면 테스트 2와 3의 실질적인 의미를 알려주시겠습니까?

그리고 질문 하나 더. COLOR_FORMAT_ARGB_RAW와 COLOR_FORMAT_ARGB_NORMALIZE의 차이점을 간단히 설명해 주시겠습니까?

Anatoli Kazharski  

모든 사람은 매우 다른 결과를 얻습니다. 내 테스트는 Windows 7 x64NVIDIA GeForce 9600GT , MT5 빌드 803 에서 이루어졌습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

차트의 개별 텍스트 레이블 및 비트맵 작업 성능 테스트

톨64 , 2013.04.27 17:26

그건 그렇고, 투명도가 있고 투명도가 없으면 그렇게 큰 차이가 없습니다.

 2013.04 . 27 18 : 24 : 32      BenchmarkLabel__1 (USDCHF,H1)   Тестирование завершено
2013.04 . 27 18 : 24 : 32      BenchmarkLabel__1 (USDCHF,H1)   5 . Время обновления текста и позиций у битмапа без прозрачности = 13229 ms
2013.04 . 27 18 : 24 : 19      BenchmarkLabel__1 (USDCHF,H1)   4 . Время обновления текста и позиций у битмапа c прозрачностью = 13994 ms
2013.04 . 27 18 : 24 : 05      BenchmarkLabel__1 (USDCHF,H1)   3 . Время обновления текста и позиций у меток с чтением = 32229 ms
2013.04 . 27 18 : 23 : 33      BenchmarkLabel__1 (USDCHF,H1)   2 . Время обновления текста и позиций у меток без чтения = 10671 ms
2013.04 . 27 18 : 23 : 22      BenchmarkLabel__1 (USDCHF,H1)   1 . Время обновления текста у меток без чтения = 10733 ms
2013.04 . 27 18 : 23 : 11      BenchmarkLabel__1 (USDCHF,H1)   0 . Время разогрева динамических очередей без визуализации = 187 ms

Alexandr Bryzgalov  

처음으로 창을 전환할 때 2번의 테스트를 수행했습니다.

Win XP SP3 ), ATI 통합, MT5 빌드 787

그런데 MT5의 "정보"창이 열려있을 때 Alt + Tab 키를 통해 터미널 아이콘이 보이지 않는 것을 알았습니다.

[삭제]  
세 번째 테스트에서 내 차트만 단단히 고정됩니까?
사유: