루프 뒤 또는 루프 내부에서 변수를 선언하시겠습니까? - 페이지 5

 
pivalexander :

나는 코드를 논리적 블록으로 나누고 그 안에 필요한 변수를 선언하는 것을 선호하며, 함수 시작 부분에 모든 종류의 변수를 묶지 않는 것을 선호합니다.

한 곳에서만 필요한 변수의 경우, 특히 블록이 작은 경우 블록 자체 앞에 변수를 선언하는 것이 좋습니다. 그러나 블록이 충분히 크고 다른 곳에서 변수가 필요한 경우 처음부터 함수를 선언하는 것을 선호합니다. 여기에서는 여전히 상식에서 나아가야 합니다.

 
pivalexander :

빈 루프 본문으로 실행한 결과는 매우 다르며 훨씬 빠르게 작동합니다.

Test1, время выполнения: 0.548275 сек.
Test2, Время выполнения: 0.313978 сек.

마이크로초로 무엇을 측정하고 있습니까? .... 당신의 테스트가 현실과 일치한다고 확신합니까?

;)

또한 다음과 같이 테스트했습니다.

 #define N 8

#define   test(M,S,EX, res) {                             \
uint mss= GetTickCount ();                                 \
ulong nn=( ulong ) pow ( 10 ,M);                               \
for ( ulong tst= 0 ;tst<nn && ! _StopFlag ;tst++) \
{ EX;  res }                                             \
printf ( "%s: loops=%i ms=%u" ,S,nn, GetTickCount ()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   string result;
   string s1;  test(N, "1. s1=" ,s1=( string )tst, result = s1; );
   string s2;  test(N, "2. s2=" ,s2=( string )tst, result = s2;);
   string s3;  test(N, "3. s3=" ,s3=( string )tst, result = s3;);
   string s4;  test(N, "4. s4=" ,s4=( string )tst, result = s4;);
   string s5;  test(N, "5. s5=" ,s5=( string )tst, result = s5;);

   test(N, "1. q=" , string q=( string )tst, result = q; );
   test(N, "2. w=" , string w=( string )tst, result = w;);
   test(N, "3. e=" , string e=( string )tst, result = e;);
   test(N, "4. r=" , string r=( string )tst, result = r;);
   test(N, "5. t=" , string t=( string )tst, result = t;);
  }

2019.08.18 12:14:20.765 속도 테스트(EURUSD,H1) 1. s1=: 루프=100000000 ms=8156

2019.08.18 12:14:29.127 속도 테스트(EURUSD,H1) 2. s2=: 루프=100000000 ms=8359

2019.08.18 12:14:37.353 속도 테스트(EURUSD,H1) 3. s3=: 루프=100000000 ms=8235

2019.08.18 12:14:45.464 속도 테스트(EURUSD,H1) 4. s4=: 루프=100000000 ms=8109

2019.08.18 12:14:53.557 속도 테스트(EURUSD,H1) 5.s5=:루프=100000000ms=8094

2019.08.18 12:15:01.446 속도 테스트(EURUSD,H1) 1. q=: 루프=100000000ms=7890

2019.08.18 12:15:09.159 속도 테스트(EURUSD,H1) 2. w=: 루프=100000000ms=7703

2019.08.18 12:15:16.903 속도 테스트(EURUSD,H1) 3. e=: 루프=100000000ms=7750

2019.08.18 12:15:24.716 속도 테스트(EURUSD,H1) 4.r=: 루프=100000000ms=7813

2019.08.18 12:15:32.661 속도 테스트(EURUSD,H1) 5.t=: 루프=100000000ms=7937

 
Igor Makanu :

마이크로초로 무엇을 측정하고 있습니까? .... 당신의 테스트가 현실과 일치한다고 확신합니까?

   ulong   time_finish = GetMicrosecondCount ();
   ulong   res = time_finish - time_start;

그래서 나는 측정

 
pivalexander :

그래서 나는 측정

이것은 모두 이해할 수 있지만 측정하는 데 최소한 몇 초가 필요합니다.

Windows는 실시간 시스템이 아닙니다. 그렇죠? 백그라운드 작업도 Windows의 리소스가 필요합니다. 여기에 시스템 타이머 및 백그라운드 프로세스의 특정 오류 수준에서의 테스트가 있습니다.

IMHO, 최소 5초의 테스트는 이미 최소한 신뢰할 수 있는 정보입니다.

 
Igor Makanu :

이것은 모두 이해할 수 있지만 최소한 몇 초는 측정해야 합니다.

Windows는 실시간 시스템이 아닙니다. 그렇죠? 백그라운드 작업도 Windows의 리소스가 필요합니다. 여기에 시스템 타이머 및 백그라운드 프로세스의 특정 오류 수준에서의 테스트가 있습니다.

IMHO, 최소 5초의 테스트는 이미 최소한 신뢰할 수 있는 정보입니다.

몇 초 동안 측정했는데 결과는 동일합니다. 왜 여기에 결과를 게시하는 데 오랜 시간을 기다려야합니까?

 

일반적으로 동일한 테스트를 수행하기로 결정했지만 100% 정확하기 때문에 확실한 것은 없습니다.

 void OnStart ()
{
   int count= ( int ) 10 e6;

  { 
     uint t= GetTickCount ();
     int sum= 0 ;
        
     for ( int i= 0 ; i<count; i++)
    {
       string st = ( string )i;
       sum += st[ rand ()% 10 ];
    }
     Print ( "Test1, время выполнения: " , GetTickCount ()-t, " ms,  sum=" ,sum);
  }
  
  {
     uint t = GetTickCount ();
     int sum= 0 ;
     string st = "" ;
     for ( int i= 0 ; i<count; i++)
    {
       st = ( string )i;
       sum += st[ rand ()% 10 ];
    }
     Print ( "Test2, время выполнения: " , GetTickCount ()-t, " ms,  sum=" ,sum);
  }
}

최적화가 없는 모드에서는 두 번째 옵션이 실제로 더 빠릅니다. 그러나 최적화에서는 그 반대가 사실입니다. 그리고 어떤 이유로 두 번째 옵션은 최적화 전보다 느려집니다)

 
pivalexander :

몇 초 동안 측정했는데 결과는 동일합니다. 왜 여기에 결과를 게시하는 데 오랜 시간을 기다려야합니까?

동일한 테스트를 여러 번 실행해야 합니다. 다음 테스트에서 캐싱 작업의 가능성이 높기 때문에 약간의 차이가 있는 2개의 동일한 테스트가 다르게 수행될 수 있습니다. 동일한 테스트의 실행에 차이가 보이지 않습니까?

그것은 당신의 일입니다. 위에서 쓴 것처럼 나는 Windows, 프로세서 및 나조차도 아무도 믿지 않습니다.)


알렉세이 나보이코프 :

일반적으로 동일한 테스트를 수행하기로 결정했지만 100% 정확하기 때문에 확실한 것은 없습니다.

최적화가 없는 모드에서는 두 번째 옵션이 실제로 더 빠릅니다. 그러나 최적화에서는 그 반대가 사실입니다. 그리고 어떤 이유로 두 번째 옵션은 최적화 전보다 느려집니다)

사실이 아니라 srand() 가 없습니다. rand() 컴파일러가 매우 멋지게 최적화한다고 썼습니다.)

그리고 스크립트의 텍스트를 최소 2번 복사하여 컴파일러가 무언가를 선택했는지 확인할 수 있습니다.)

 
pivalexander :

그리고 여기에 메모리와 프로세서가 있습니다. 우리는 최적화에 대해 이야기하고 있습니다. 당신은 책 이론가입니다)

추론의 대괄호를 넘어 컴파일러가 작동하는 방식과 최적화가 작동하는 방식을 이해하면 모든 컴파일러가 코드 실행 주기 수를 줄이고 일관되지 않은 메모리 액세스를 최소화하는 것을 목표로 한다는 것이 분명해질 것입니다. 컴파일러의 최적화 결과가 있는 경우 dibile 테스트 없이 미리 알려줍니다. 테스트를 사용하여 2 + 2 = 4인지 확인하는 것과 같습니다.

그리고 책 이론가에 대해... 이 이론가는 EC1020과 ZX Spectrum을 시작으로 87년부터 글을 써왔으며, 자신의 컴파일러를 두 개 이상 작성했으며 그의 회사에서 600명 이상의 프로그래머를 고용했습니다...

 
Aleksandr Matveev :

추론의 대괄호를 넘어 컴파일러가 작동하는 방식과 최적화가 작동하는 방식을 이해하면 모든 컴파일러가 코드 실행 주기 수를 줄이고 일관되지 않은 메모리 액세스를 최소화하는 것을 목표로 한다는 것이 분명해질 것입니다. 컴파일러의 최적화 결과가 있는 경우 dibile 테스트 없이 미리 알려줍니다. 테스트를 사용하여 2 + 2 = 4인지 확인하는 것과 같습니다.

그리고 책 이론가에 대해... 이 이론가는 EC1020과 ZX Spectrum을 시작으로 87년부터 글을 써왔으며, 자신의 컴파일러를 두 개 이상 작성했으며 그의 회사에서 600명 이상의 프로그래머를 고용했습니다...

당신은 책을 찔러보고 자신을 칭찬하지만 본질적으로 그들은 아무 말도하지 않았습니다. 덤불 주위의 이론 만 읽고 읽으면 명확해질 것입니다 ... 메모리 및 프로세서, 프로세서 및 메모리, 전원 공급 장치, 그것은 또한 사용됩니다

 
그러나 문자열에 작은 내부 버퍼가 있을 수 있고 작은 문자열을 사용하면 데이터가 완전히 거기에 갈 수 있다는 사실을 알고 계셨습니까? 즉, 대부분의 사소한 경우에 가속도가 붙는 것입니다. malloc()을 잡기 위해 만지작거리다가 문자열이 약 15자보다 짧으면 malloc이 전혀 움직이지 않는다는 것을 알았습니다. 당신의 테스트는 어떻게 ...