캔버스 대 레이블 - 페이지 13

 
Nikolai Semko :

음, 그럼 완전히 정상입니다.
내 gif에서도 하나의 캔버스는 패널이며, 자주 다시 그릴 필요가 없고 새 막대가 도착하는 순간을 포착할 필요가 없기 때문에 최소한의 리소스를 소모합니다.

감독자! 모든 것이 날아간다!

그리고 저속에서는 공백 없이 업데이트됩니다.
 
Dmitry Fedoseev :
올바른 파일을 찾았습니다. 어디에서, 어떤 숫자로, 어디서, 언제 보아야 하는지 명확하지 않지만, 이것이 없어도 하나의 레이블 대신 캔버스만 사용하는 것이 아니라 캔버스가 훨씬 느리다는 것을 육안으로 확인할 수 있습니다. , 그러나 레이블 묶음 대신 하나의 캔버스.

CanvasVsLabels.mq5 전문가를 시작하고 디스플레이 유형 outType 을 선택하고 limit_fps를 활성화하고 nIterations 설정하며 기본적으로 10000과 같습니다. 이 정도면 충분하며 변경할 수 없습니다. 그러면 결과는 여기에 제시된 것과 유사합니다: https://www.mql5.com/ru/forum/364640/page11#comment_21301589 .

이제 결과에 대해. 최소 지연 , 중간 지연최대 지연 은 각각 패스당 최소 지연, 평균 지연 및 최대 지연입니다. Total 은 모든 nIterations 패스의 총 시간입니다.

다시 한 번, 나는 비교 결과 의 표를 제공합니다

캔버스 무제한 fps 캔버스 제한 fps 레이블 무제한 fps 레이블 제한 fps
최소 지연(µs) 1530 하나 십팔 0
중간 지연(µs) 7674 4086 48 7
최대 지연(µs) 11967 11093 785 286
총계(μs) 77727510 29452299 39648984 27439654


마찬가지로 Expert Advisor가 이를 위해 설계되었기 때문에 테스터에서 측정을 수행할 수 있습니다. 하지만 아직 실행하지 않았습니다. 여유 있을 때 할게요. 앞으로 다양한 BitmabLabels의 디스플레이를 실험해 볼 계획입니다.

 

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

캔버스 대 레이블

fxsaber , 2021.03.13 19:26

ZY 나에게만 그런 결과가?

fxsaber :

15~20% 먹습니다. 분명히, 브레이크 비디오 카드.

ResourceReadImage가 매우 느린 것으로 나타났습니다. 그것을 제거했습니다-무부하가있었습니다.

 

다시 한 번 비교표를 히스토그램과 함께 게시합니다.

캔버스 무제한 fps 캔버스 제한 fps 레이블 무제한 fps 레이블 제한 fps
최소 지연(µs) 1530 하나 십팔 0
중간 지연(µs) 7674 4086 48 7
최대 지연(µs) 11967 11093 785 286
총계(μs) 77727510 29452299 39648984 27439654


패스당 평균 지연 비교

중간 지연

어떤 이유로 총 작업 시간 (Total)과 비교할 수없는 것으로 판명되었습니다 ...

총 실행 시간 비교

총

측정 결과에 따르면 FPS가 제한된 캔버스 기반 디스플레이(Canvas 무제한 FPS)가 FPS 가 제한된 레이블 기반 디스플레이 (Labels 무제한 FPS) 보다 성능이 약간 느린 것으로 나타났습니다. 그러나 일반적으로 둘 다 부하가 높은 프로세스의 정보를 표시하는 데 적합합니다.

측정을 수행하기 위해 전문가를 시작하는 방법

입력 매개변수

  1. Canvas 또는 Labels 드롭다운에서 outType 선택
  2. limit_fps 활성화 또는 비활성화
  3. 우리는 선택을 확인합니다
  4. 차트에서 측정을 시작하려면 시작 버튼을 누르십시오.

측정 시작

같은 방법으로 전문가는 시각적 테스터에서 측정을 수행할 수 있습니다. 테스터 설정의 날짜 범위만 nIterations 입력 매개변수의 값보다 적은 막대가 기록에 없는 방식으로 설정해야 합니다.

자세한 정보와 출처는 차트 표시 라이브러리에 대한 설명에서 찾을 수 있습니다. https://www.mql5.com/en/code/33898

측정을 위해 특별히 수정된 라이브러리: https://www.mql5.com/ru/code/download/33898/chartdisplay.mqh

측정을 위한 범용 전문가: https://www.mql5.com/en/code/download/33898/canvasvslabels.mq5

자세한 내용은 KB를 참조하십시오. https://www.mql5.com/ru/code/33898


이 주제의 첫 번째 게시물에 새로운 Expert Advisor의 도움으로 더 정확한 측정을 추가하고 싶습니다. 현재 있는 측정값이 정확하지 않기 때문입니다. 그러나 불행히도 첫 번째 메시지는 더 이상 편집할 수 없습니다. 나는 중재자들에게 시작 부분에 더 정확한 측정값을 추가할 것을 요청하며, 현재 거기에 있는 측정값은 관련이 없는 것으로 발행되어야 합니다.

Дисплей с оптимизацией для вывода текста в чарт по типу консоли
Дисплей с оптимизацией для вывода текста в чарт по типу консоли
  • www.mql5.com
Данная библиотека позволяет создавать дисплеи для удобного вывода текстовой информации в чарт с наиболее оптимальной скоростью
 
fxsaber :

ResourceReadImage가 매우 느린 것으로 나타났습니다. 그것을 제거했습니다-무부하가있었습니다.

진지하게?
나를 위한 서프라이즈.
같은 크기의 일반 uint 배열을 복사하는 것보다 얼마나 느립니까?
 
Mihail Matkovskij :

CanvasVsLabels.mq5 전문가 실행 중...

의미는 어떻습니까? 지금은 코드를 파헤치고 싶지 않습니다. 이러한 측정항목은 어떻게 계산됩니까? 이것이 테스터에서 테스트하는 방법이라면 실행에 소요된 총 시간을 측정해야 하며 코드의 개별 섹션 작업은 측정하지 않아야 합니다. 최후의 수단으로 init를 계산하지 마십시오. 이제 측정이 없으면 캔버스가 더 느리게 작동한다는 것이 분명합니다. 비정상인지는 모르겠지만...

 
Nikolai Semko :
진지하게?
나를 위한 서프라이즈.
같은 크기의 일반 uint 배열을 복사하는 것보다 얼마나 느립니까?

호출 시 - 0 없이 약 15% 부하가 발생했습니다.

 
Dmitry Fedoseev :

의미는 어떻습니까? 지금은 코드를 파헤치고 싶지 않습니다. 이러한 측정항목은 어떻게 계산됩니까? 이것이 테스터에서 테스트하는 방법이라면 실행에 소요된 총 시간만 측정해야 하며 코드의 개별 섹션 작업은 측정하지 않아야 합니다. 최후의 수단으로 init를 계산하지 마십시오. 이제 측정이 없으면 캔버스가 더 느리게 작동한다는 것이 분명합니다. 비정상인지는 모르겠지만...

코드를 파헤치고 싶지 않습니다. 그리고 한마디 하고 싶은 마음도 없습니다. :) 나는 당신에게 설명하는 방법을 정말로 모릅니다. 내가 어떻게 모든 코드를 작성했는지 처음부터 끝까지 말하려면 ... 전체 기사가 될 것입니다. :)

그리고 전문가가 측정하는 방법에 대해 전혀 이해할 수 있는 것은 없습니다.

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void run() {
   MqlRates rates[];
   int digits = ( int ) SymbolInfoInteger ( _Symbol , SYMBOL_DIGITS );
   ulong start, min, mid, max;
   ulong last, delay; 
   static ulong totalDelays = 0 ;
   static int nTick = 0 ;
   ulong first;
   if (!triggerBtn.State())
     return ;
  start = GetMicrosecondCount ();
  min = INT_MAX ; mid = 0 ; max = 0 ;
   if ( CopyRates ( NULL , PERIOD_CURRENT , 0 , nIterations, rates) != nIterations) {
    triggerBtn.State( false );
    triggerBtn.setText( "Start" );
     Print ( "Not enough quotes!" );
     Comment ( "Not enough quotes!" );
     return ;
  }
   for ( int i = nIterations - 1 ; i >= 0 && triggerBtn.State(); i--) {
    first = GetMicrosecondCount ();
    
    display.push();
    display.setText(concatenate(i));
    display.update();
    
    last = GetMicrosecondCount ();
    delay = last - first;
     if (delay < min)
      min = delay;
     if (delay > max)
      max = delay;
    nTick++;
    totalDelays += delay;
    mid = totalDelays / nTick;
     Comment ( "Min delay: " + ( string )min + " μs\n"
             "Mid delay: " + ( string )mid + " μs\n"
             "Max delay: " + ( string )max + " μs\n"
             "Total: " + ( string )( GetMicrosecondCount () - start) + " μs" + " \n"
             "Completed: " + ( string )( int )( 100.0 / nIterations * (nIterations - i)) + "%" );
  }
  
   printf ( "Min delay: %d μs" , min);
   printf ( "Mid delay: %d μs" , mid);
   printf ( "Max delay: %d μs" , max);
   printf ( "Total: %d μs" , GetMicrosecondCount () - start);
  triggerBtn.State( false );
  triggerBtn.setText( "Start" );
   ChartRedraw ();
}
Total은 루프의 끝에서 계산되고 최소, 중간 및 최대는 display.push, display.setText 및 display.update 이후 루프 본문에서 계산됩니다. 복잡한 것은 없습니다. 앉아서 모든 것을 잘 살펴보면 Canvas 및 Labels의 소스 코드까지 얻을 수 있습니다. 그건 그렇고, 거기에는 복잡한 것도 없습니다. Canvas에서 Bezier 곡선 등을 그리는 방법을 제외하고는.
 
Dmitry Fedoseev :

이제 측정이 없으면 캔버스가 더 느리게 작동한다는 것이 분명합니다. 비정상인지는 모르겠지만...

동시에 Canvas가 느린 입력 매개 변수를 말해야 합니다. limit_fps: false이면 "점쟁이에게 가지 마세요"가 분명합니다... :)

 
fxsaber :

ResourceReadImage가 매우 느린 것으로 나타났습니다. 그것을 제거했습니다-무부하가있었습니다.

컴파일 중에 저장된 리소스에서 읽는 경우 이 작업을 한 번 수행해야 합니다.

리소스는 컴파일 중에 압축됩니다.

사유: