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

 

토론은 여기에서 시작되었습니다: 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 );
  }
//+---------------------------------------------------------------------------------------------------------------------------+
파일:
 

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

 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
 
예, 이미 비디오 드라이버의 효율성에 달려 있습니다.
 
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에서 수행되었습니다.

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

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

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

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

 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)
 
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의 차이점을 간단히 설명해 주시겠습니까?

 

모든 사람은 매우 다른 결과를 얻습니다. 내 테스트는 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

 

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

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

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

 
세 번째 테스트에서 내 차트만 단단히 고정됩니까?