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

 
Igor Makanu :

최적화할 때 더 빠르게 작동하는 변환 옵션

이것은 전체 패스에 대해 한 번만 호출합니다. 따라서 중요하지 않습니다.

 
fxsaber :

이것은 전체 패스에 대해 한 번만 호출합니다. 따라서 중요하지 않습니다.

그래서 예 ...하지만 며칠 동안 최적화를 위해 컴퓨터를 실행할 것입니다. 어떤 식 으로든 성능을 측정하고 싶습니다 ..... 옵션 1이 더 효율적일 것이라고 생각하지만 배열에 100500번 복사

 
Igor Makanu :

그래서 예 ...하지만 며칠 동안 최적화를 위해 컴퓨터를 실행할 것입니다. 어떤 식 으로든 성능을 측정하고 싶습니다 ..... 옵션 1이 더 효율적일 것이라고 생각하지만 배열에 100500번 복사

Union은 배열에 복사하는 것이 아니라 동일한 메모리 영역에 대한 다른 해석입니다. 따라서 두 번째 옵션이 더 빠를 가능성이 높지만 위에서 언급했듯이 중요하지 않습니다.
 
TheXpert :
Union은 배열에 복사하는 것이 아니라 동일한 메모리 영역에 대한 다른 해석입니다. 따라서 두 번째 옵션이 더 빠를 가능성이 높지만 위에서 언급했듯이 중요하지 않습니다.
연합은 보이는 것만큼 빠르지 않습니다. 안타깝게도.
나는 첫 번째 것에 내기.
 
Igor Makanu :

그래서 예 ...하지만 며칠 동안 최적화를 위해 컴퓨터를 실행할 것입니다. 어떤 식 으로든 성능을 측정하고 싶습니다 ..... 옵션 1이 더 효율적일 것이라고 생각하지만 배열에 100500번 복사

속도를 측정하는 오래된 방법이 있습니다

스타일

for (int i=0; i< 1000000; i++) {우리 코드1}....
for (int i=0; i< 1000000; i++) {우리 코드2}....

 
Nikolai Semko :
연합은 보이는 것만큼 빠르지 않습니다. 나는 첫 번째 것에 내기.

저도 먼저 올려요! 이항 연산자는 if 연산자보다 몇 배 빠르지만 두 번째 연산자에는 없습니다.

 

확인:

#define   SpeedTest(count_x10,msg,EX)        { ulong mss= GetMicrosecondCount (); ulong count=( ulong ) pow ( 10 ,count_x10); for ( ulong _i= 0 ;_i<count&&! _StopFlag ;_i++){EX;} \
                                               printf ( "%s: loops=%llu ms=%llu" ,msg,count, GetMicrosecondCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   ulong sum = 0 ;
   SpeedTest( 10 , "tst 1 : " ,
   {
       ushort in01A = ( ushort ) rand ();
       ushort in01B = ( ushort ) rand ();
       ushort in02A = ( ushort ) rand ();
       ushort in02B = ( ushort ) rand ();
       ushort in03A = ( ushort ) rand ();
       ushort in03B = ( ushort ) rand ();
       ushort in04A = ( ushort ) rand ();
       ushort in04B = ( ushort ) rand ();
       ushort in05A = ( ushort ) rand ();
       ushort in05B = ( ushort ) rand ();
       uint param[ 5 ];
      param[ 0 ] = ( uint )in01A << ( sizeof ( ushort ) * 8 ) | in01B;
      param[ 1 ] = ( uint )in02A << ( sizeof ( ushort ) * 8 ) | in02B;
      param[ 2 ] = ( uint )in03A << ( sizeof ( ushort ) * 8 ) | in03B;
      param[ 3 ] = ( uint )in04A << ( sizeof ( ushort ) * 8 ) | in04B;
      param[ 4 ] = ( uint )in05A << ( sizeof ( ushort ) * 8 ) | in05B;
       for ( int i = 0 ; i < 5 ; i++) sum += param[i];
   });
//--   
   sum = 0 ;
   union ushortTouint
   {
       uint param[ 5 ];
       ushort in[ 10 ];
   }U;
   SpeedTest( 10 , "tst 2 : " ,
   {
       ushort in00 = ( ushort ) rand ();
       ushort in01 = ( ushort ) rand ();
       ushort in02 = ( ushort ) rand ();
       ushort in03 = ( ushort ) rand ();
       ushort in04 = ( ushort ) rand ();
       ushort in05 = ( ushort ) rand ();
       ushort in06 = ( ushort ) rand ();
       ushort in07 = ( ushort ) rand ();
       ushort in08 = ( ushort ) rand ();
       ushort in09 = ( ushort ) rand ();
      ushortTouint u;
      u.in[ 0 ] = in00;
      u.in[ 1 ] = in01;
      u.in[ 2 ] = in02;
      u.in[ 3 ] = in03;
      u.in[ 4 ] = in04;
      u.in[ 5 ] = in05;
      u.in[ 6 ] = in06;
      u.in[ 7 ] = in07;
      u.in[ 8 ] = in08;
      u.in[ 9 ] = in09;
       for ( int i = 0 ; i < 5 ; i++) sum += u.param[i];
   });

}

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst1 : : 루프=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst2 : : 루프 = 10000000000 ms = 10862287

큰 차이는 아니지만 테스트를 바꾸면 결과가 반대일 가능성이 높습니다.

일반적으로 중요하지 않습니다.

 
Igor Makanu :

큰 차이는 아니지만 테스트를 바꾸면 결과가 반대일 가능성이 높습니다.

컴파일러가 두 경우 모두에 대해 동일한 코드를 생성했을 가능성이 높습니다. 이 경우 주관적으로 좋아하는 것을 선택하십시오.

 
Igor Makanu :

확인:

2020.10.15 21:48:01.401 SpeedTst (EURUSD,H1) tst1 : : 루프=10000000000 ms=10864370

2020.10.15 21:48:12.264 SpeedTst (EURUSD,H1) tst2 : : 루프 = 10000000000 ms = 10862287

큰 차이는 아니지만 테스트를 바꾸면 결과가 반대일 가능성이 높습니다.

일반적으로 중요하지 않습니다.

난수를 생성하는 시간이 고르지 않을 수 있고 많은 것이 생성된 변수의 양에 따라 달라진다는 것을 보여주는 스크립트와 같습니다)))

그리고 그러한 반복 횟수에 필요한 코드는 0ms가 걸립니다.

대답은 '아니오

또는 코드 최적화 프로그램이 불필요한 것을 잘라냅니다.
 
Alexandr Andreev :

다음은 난수 생성 시간이 고르지 않을 수 있음을 보여주는 스크립트입니다.

rand()는 일반 함수가 아니며 항상 같은 방식으로 작동합니다.

그러나 작업 속도를 테스트할 때 상수로 초기화하면 테스트가 실행될 때 "가속"됩니다 - 코드 최적화   런타임 시 MQL 에서 제대로 작동하지 않음

일반적으로 이것은 두 번 이상 확인됩니다.

알렉산드르 안드레예프 :

그리고 많은 것들이 생성된 변수의 양에 달려 있습니다)))

물론, 메모리 할당은 런타임 측면에서 비싸고, 이미 확인했고, 동적으로 생성된 개체( 포인터 new ) 및 로컬 범위 의 개체만 테스트했습니다. 100500번 테스트할 때 시간은 new + delete까지 실행됩니다.

전체적인 질문은 변수에 대한 전역 가시성의 테스터에서 메모리가 모든 패스가 아니라 한 번 할당된다는 사실 때문에였습니다. 그러나 uint 배열이 필요하므로 내가 쓴 것이 아니라 그러한 스크립트로 테스트했습니다. 처음으로

알렉산드르 안드레예프 :

그리고 그러한 반복 횟수에 필요한 코드는 0ms가 걸립니다.

대답은 '아니오

또는 코드 최적화 프로그램이 불필요한 것을 잘라냅니다.

내 스크립트로 테스트 했습니까? - 테스트가 끝날 때까지 기다리지 않고 중단되었거나 ulong 오버플로됨 - 매크로의 첫 번째 매개변수는 10^ count입니다.



안드레이 트루하노비치 :

컴파일러가 두 경우 모두에 대해 동일한 코드를 생성했을 가능성이 높습니다. 이 경우 주관적으로 좋아하는 것을 선택하십시오.

예, 아마도 그렇게

일반적으로 질문은 무엇이었습니까? 최신 프로세서는 명령 파이프 라인의 최적화로 인해 한 사이클에서 둘 이상의 기본 작업을 수행 할 수 있다는 것을 반복해서 읽었습니다 .... 많은 bla-bla-bla .. . 요점은 프로세서가 예측할 수 없는 주기 수 동안 산술 명령을 실행한다는 것입니다.

그러나 분기 및 메모리 할당 작업은 프로세서에 의해 매우 최적화되지 않으므로 산술 단순화에서 최적화를 찾지 말고 분기를 최소화하여 가능한 한 선형 코드로 작성하려고 하며 변수를 선언하고 값을 할당하는 것이 좋습니다 계산 직전에 명령 파이프라인과 캐시 페치 예측이 이 코드를 최적화할 수 있도록 합니다.


저것들. 아마도 배열의 요소 값 선택(어드레싱)은 속도 면에서 중요하지 않을 것입니다. 여기서 나는 조합에 대해 교대 승리가 있을 것이라고 생각했는데, 모두