mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 53

 
많은 문자열을 빠르게 추가하는 방법(예: 문자열로 거래 보고서 생성)
 class SUM_STRING
{
protected :
   uchar Data[];
    
public :
  SUM_STRING( const int Reserve = 0 )
  {
    :: ArrayResize ( this .Data, 1 , Reserve);
  }

   void operator +=( const string Str )
  {
    :: StringToCharArray (Str, this .Data, :: ArraySize ( this .Data) - 1 );
  }
  
   const string Get( void ) const
  {
     return (:: CharArrayToString ( this .Data));
  }
};

// Классическое складывание
ulong SumString1( string TmpStr, const int Amount )
{
   const ulong StartTime = GetMicrosecondCount ();

   string Str = "" ;

   for ( int i = 0 ; i < Amount; i++)
    Str += TmpStr;

   return ( GetMicrosecondCount () - StartTime);
}

// Быстрое складывание
ulong SumString2( string TmpStr, const int Amount )
{
   const ulong StartTime = GetMicrosecondCount ();

  SUM_STRING SumStr(Amount * StringLen (TmpStr) + 1 );

   for ( int i = 0 ; i < Amount; i++)
    SumStr += TmpStr;

   const string Str = SumStr.Get();

   return ( GetMicrosecondCount () - StartTime);
}

// #property script_show_inputs

input int inLen = 400 ;     // Длина строки, которую будем добавлять
input int inAmount = 1 e4; // Сколько раз будем складывать

// Как быстро сложить много строк (например, сгенерировать торговый отчет в string)
void OnStart ()
{  
   string Str;
  
   StringInit (Str, inLen, 1 );
  
   Print (SumString1(Str, inAmount)); // Время классического решения
   Print (SumString2(Str, inAmount)); // Время альтернативного решения
   Print (SumString2(Str, inAmount)); // Почему эта строка всегда выполняется заметно быстрее, чем предыдущая?
}

결과

 2748404
12678
10388

250배 더 빠르고 이것이 한계가 아닙니다!


Threat Red는 설명할 수 없는 사실을 표시했습니다.

 
fxsaber :
많은 문자열을 빠르게 추가하는 방법(예: 문자열로 거래 보고서 생성)

결과

250배 더 빠르고 이것이 한계가 아닙니다!


Threat Red는 설명할 수 없는 사실을 표시했습니다.

메모리 풀의 기능은 처음 SumString2가 메모리 풀로 호출될 때 시스템의 메모리로 "포화"되고 다음에 시스템에서 메모리가 더 이상 요청되지 않을 때입니다.

SumString1을 수정하는 것이 좋습니다.

 ulong SumString1( string TmpStr, const int Amount )
{
   const ulong StartTime = GetMicrosecondCount ();

   string Str;
   StringInit (Str,Amount * StringLen (TmpStr) + 1 );            << обеспечим строке приёмный буфер

   for ( int i = 0 ; i < Amount; i++)
    Str += TmpStr;

   return ( GetMicrosecondCount () - StartTime);
}
 
일리아스 :

메모리 풀의 기능은 처음 SumString2가 메모리 풀로 호출될 때 시스템의 메모리로 "포화"되고 다음에 시스템에서 메모리가 더 이상 요청되지 않을 때입니다.

SumString1을 수정하는 것이 좋습니다.

고맙습니다! 적어도 어떻게 든 도움말에서 수신 버퍼의 개념을 반영할 수 있습니까? 현재 StringBufferLen 만 있으며 이에 대한 설명은 명확하지 않습니다.

 
fxsaber :

고맙습니다! 적어도 어떻게 든 도움말에서 수신 버퍼의 개념을 반영할 수 있습니까? 이제 설명에서 명확하지 않은 StringBufferLen만 있습니다.

Duc는 분명한 것 같습니다. 우리는 문자열에 할당된 메모리에 대해 이야기하고 있습니다. Ilya는 "시스템의 메모리 포화"에 대해 어떻게 든 혼란스럽게 설명합니다.)

그건 그렇고 로컬 변수 가 이전에 할당된 메모리를 사용하는 기능에 대해서도 몰랐습니다. 따라서 우리가 일회성 무거운 계산에 대해 이야기하지 않는 한 자신의 최적화를 펜싱하는 데 많은 의미가 없다는 것이 밝혀졌습니다. 이 메모리를 해제하는 문제도 불분명합니다. 프로그램 실행 중에 해제됩니까 아니면 초기화 해제 중에만 해제됩니까?

 
알렉세이 나보이코프 :

Duc는 분명한 것 같습니다. 우리는 문자열에 할당된 메모리에 대해 이야기하고 있습니다. Ilya는 "시스템의 메모리 포화"에 대해 어떻게 든 혼란스럽게 설명합니다.)

물론 일리야가 코드를 가져온 것은 분명하다. 불행히도 도움말에는 이에 대한 언급이 없습니다.

그건 그렇고 로컬 변수 가 이전에 할당된 메모리를 사용하는 기능에 대해서도 몰랐습니다. 따라서 우리가 일회성 무거운 계산에 대해 이야기하지 않는 한 자신의 최적화를 펜싱하는 데 많은 의미가 없다는 것이 밝혀졌습니다.

방금 문자열을 형성하는 데 몇 초가 걸리는 경우가 발생했습니다. 그리고 최적화 후 - 밀리초. 그러나 Ilya의 옵션은 물론 가장 빠릅니다. 도움말이 완벽했다면 물론 울타리를 치지 않았을 것입니다.

 
fxsaber :

물론 일리야가 코드를 가져온 것은 분명하다. 불행히도 도움말에는 이에 대한 언급이 없습니다.

방금 문자열을 형성하는 데 몇 초가 걸리는 경우가 발생했습니다. 그리고 최적화 후 - 밀리초. 그러나 Ilya의 옵션은 물론 가장 빠릅니다. 도움말이 완벽했다면 물론 울타리를 치지 않았을 것입니다.

글쎄요, StringInit 은 오래전부터 알려졌던 것 같습니다. 저도 대용량으로 항상 사용하고 있습니다. 추가할 라인의 정확한 길이를 모르는 경우 대략적인

 

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

라이브러리: TesterBenchmark

fxsaber , 2017.08.15 19:31

ZY2 각 팩의 첫 번째 패스에서 1648년의 이 브레이크는 무엇입니까? 1643년 에는

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

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2017.08.15 17:16

에이전트 작업 배치의 첫 번째 패스(예: 단일 테스터 실행 중)에서 Expert Advisor 시작과 첫 번째 NewTick 이벤트 사이의 시간은 몇 초가 걸릴 수 있습니다. 팩의 다음 패스에서 이 시간은 0입니다.

마치 1648년에 테스터가 즉시 NewTick 이벤트를 발생시키는 것처럼. 물론 잘못된 것입니다.
 

테스터에서 IsStopped()는 항상 0을 반환합니다( false 아님). 따라서 실제 생활에서 와 같이 이 플래그와 ExpertRemove()의 상호 작용에 의존하는 것은 테스터에서 잘못된 것입니다.

 
StringInit (Str);
Str = NULL ;

첫 번째 라인은 동일한 결과를 가진 두 번째 라인보다 빠릅니다.

 

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

라이브러리: TesterBenchmark

fxsaber , 2017.09.05 09:36

PositionSelect를 PositionGetTicket으로 대체하면 백테스트 속도가 7% 향상됩니다!

그리고 이것은 네팅 계정에 있습니다!