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

 

죄송합니다 여러분, 프로젝트 설정에서 최적화가 꺼져 있습니다

코드:

   CStopWatch sw; // Секундомер, для замера времени
   
   sw.Start();
   for ( int i = 0 ; i < 10000000 ; i++)
   {
       string st = ( string )i;
   }
   pr( "Test1, время выполнения: " + sw.Stop());

   sw.Start();
   string st = "" ;
   for ( int i = 0 ; i < 10000000 ; i++)
   {
      st = ( string )i;
   }
   pr( "Test2, Время выполнения: " + sw.Stop());


최적화 없이

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

최적화로

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

최적화를 사용하면 그 반대가 사실입니다. 여러 번 확인했습니다.

 
Aleksandr Matveev :

이미 홍수를 멈추고 먼저 재료를 마스터한 다음 자신의 경우를 증명하십시오. 프로세서와 메모리의 작동에 대한 책을 최소한 한 권 이상 읽었다면 테스트 없이도 결과가 명확했을 것입니다. 나는 그들 중 가장 독창적 인 것을 제안했습니다. 프로그래밍에서 조용히 발전하고 싶다면 분명히 읽을 것입니다.

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

 
Igor Makanu :

이상하지 않습니다. MQL에서 가장 간단한 연산자와 작업을 테스트할 수 있어야 합니다. 테스트에 srand(GetTickCount())를 추가한 이유는 무엇입니까?

;)

그건 그렇고, 나는 더 자세히 보았고, 당신은 또한 거기 루프에 결과를 가지고 있습니다. 앞으로는 고려되지 않으므로 컴파일러에서 쉽게 잘라낼 수 있습니다.

 
Alexey Navoykov :

그건 그렇고, 나는 더 자세히 살펴 보았습니다. 거기에 루프에 결과가 있습니다. 앞으로는 고려되지 않으므로 컴파일러에서 쉽게 잘라낼 수 있습니다.

심지어 제거된 rand() - 컴파일러가 완벽하게 인라인되어 다음 테스트를 수행했습니다.

 #define N 8

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

   test(N, "1. q=rand()" , string q=( string )tst);
   test(N, "2. q=rand()" , string q=( string )tst);
   test(N, "3. q=rand()" , string q=( string )tst);
   test(N, "4. q=rand()" , string q=( string )tst);
   test(N, "5. q=rand()" , string q=( string )tst);
  }
//+------------------------------------------------------------------+

2019.08.18 11:55:41.457 속도 테스트(EURUSD,H1) 1. s1=rand(): 루프=100000000ms=7672

2019.08.18 11:55:49.085 속도 테스트(EURUSD,H1) 2. s2=rand(): 루프=100000000ms=7625

2019.08.18 11:55:56.796 속도 테스트(EURUSD,H1) 3. s3=rand(): 루프=100000000ms=7719

2019.08.18 11:56:04.495 속도 테스트(EURUSD,H1) 4. s4=rand(): 루프=100000000ms=7703

2019.08.18 11:56:12.113 속도 테스트(EURUSD,H1) 5. s5=rand(): 루프=100000000ms=7610

2019.08.18 11:56:17.695 속도 테스트(EURUSD,H1) 1. q=rand(): 루프=100000000ms=5578

2019.08.18 11:56:23.362 속도 테스트(EURUSD,H1) 2. q=rand(): 루프=100000000ms=5672

2019.08.18 11:56:28.970 속도 테스트(EURUSD,H1) 3. q=rand(): 루프=100000000ms=5609

2019.08.18 11:56:34.637 속도 테스트(EURUSD,H1) 4. q=rand(): 루프=100000000ms=5672

2019.08.18 11:56:40.277 속도 테스트(EURUSD,H1) 5. q=rand(): 루프=100000000ms=5640


 
Alexey Navoykov :

따라서 "실수하지 않으려면" 어셈블러로 이동하십시오. 모든 것을 직접 제어해야하기 때문에 ... 결국 설명 된 사례는 완전한 사소한 일입니다. 훨씬 더 복잡한 것들이 있습니다. OOP는 확실히 금기입니다. 컴파일러가 이 또는 저 가상 메서드를 일반 호출로 퇴화시켰는지, 아니면 불필요한 포인터 검사를 생략했는지 알 수 없습니다... 그런 편집증이 있는 관리형 MQL에서 무엇을 할 수 있습니까? )

그리고 코드를 컴파일러의 기능(그리고 가상의 것)에 맞게 조정하여 코드의 정확성과 신뢰성을 손상시키는 것 - 이것은 분명히 훌륭한 프로그래머가 해서는 안 되는 일입니다. 그리고 여기서 우리는 코드의 부정확성에 대해 이야기하고 있습니다. 변수는 사용되는 블록에서 직접 선언해야 합니다.

하하하... Alexey, 당신은 포럼에서 OOP의 주요 지지자 중 한 명에게 "OOP는 확실히 금기입니다"라고 주장합니다("당신").

코드는 컴파일러의 기능이 아니라 생각의 기능에 맞게 조정되어야 합니다. 이 경우 이론상 루프 내부에서 변수를 선언 하면 효율성이 감소합니다. 허용된 규칙에 따르면 변수는 매번 생성되어야 하고 매번 소멸되어야 하기 때문입니다.

효율성에 관한 것도 아닙니다. 신뢰할 수 있는 코드는 투명하고 이해하기 쉬우며 수정 및 유지 관리가 쉬운 코드입니다.

개인적으로, 나는 프로그램 전체에 많은 변수가 흩어져 있고, 이 변수나 저 변수가 생성된 위치를 찾아야 할 때마다 정말 마음에 들지 않습니다. 따라서 가능하면 함수 시작 부분에 변수를 모두 함께 선언하려고 합니다. 변수가 생성된 위치를 확인하고 언제 삭제되는지 이해하기 위해서입니다.

이 경우 예제는 매우 짧습니다. 변수 생성과 사용 사이에 수십 줄과 중첩된 함수가 있을 때 - 저에게는 - 변수가 블록 외부에 미리 선언되어 있을 때 훨씬 더 안정적입니다.

 
pivalexander :

죄송합니다 여러분, 프로젝트 설정에서 최적화가 꺼져 있습니다

코드:


최적화 없이

최적화로

최적화를 사용하면 그 반대가 사실입니다. 여러 번 확인했습니다.

일반적으로 이 예에서는 최적화의 도움으로 주기의 전체를 잘라낼 수 있습니다.

 

일반적으로 모든 것은 예상대로 엉뚱한 일에 휘말릴 필요가 없으며, 갑자기 존재하지 않는 문제를 찾아 실제 문제를 만드는 데 수렴됩니다.

손이 가렵고 자신을 멋진 쿨해커라고 생각한다면 즉시 어셈블러로 작성하십시오. 그렇지 않으면 한 걸음 물러서서 삼촌 컴파일러가 작업을 수행하도록 방해하지 마십시오)

 
Aleksandr Matveev :

일반적으로 이 예에서는 최적화의 도움으로 주기의 전체를 잘라낼 수 있습니다.

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

Без оптимизации:
Test1, время выполнения: 0.027539 сек.

С оптимизацией:
Test1, время выполнения: 0.005448 сек.
 
Alexey Navoykov :

일반적으로 모든 것은 예상대로 엉뚱한 일에 휘말릴 필요가 없으며, 갑자기 존재하지 않는 문제를 찾아 실제 문제를 만드는 데 수렴됩니다.

손이 가렵고 자신을 멋진 쿨해커라고 생각한다면 즉시 어셈블러로 작성하십시오. 그렇지 않으면 한 걸음 물러서서 삼촌 컴파일러가 작업을 수행하도록 방해하지 마십시오)

가장 큰 문제는 내가 스스로를 쿨해커라고 생각하지 않는다는 것입니다. 이것이 제 생각에 변수가 루프 외부에서 선언되어야 하는 이유입니다. 그리고 더 나은 - 기능의 맨 처음에 모든 것이 한 번에.

그리고 멋진 해커는 코드 내에서 필요에 따라 변수를 선언할 수 있습니다.

 
Georgiy Merts :

가장 큰 문제는 내가 스스로를 쿨해커라고 생각하지 않는다는 것입니다. 이것이 제 생각에 변수가 루프 외부에서 선언되어야 하는 이유입니다. 그리고 더 나은 - 기능의 맨 처음에 모든 것이 한 번에.

그리고 멋진 해커는 코드 내에서 필요에 따라 변수를 선언할 수 있습니다.

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