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 сек.
이미 홍수를 멈추고 먼저 재료를 마스터한 다음 자신의 경우를 증명하십시오. 프로세서와 메모리의 작동에 대한 책을 최소한 한 권 이상 읽었다면 테스트 없이도 결과가 명확했을 것입니다. 나는 그들 중 가장 독창적 인 것을 제안했습니다. 프로그래밍에서 조용히 발전하고 싶다면 분명히 읽을 것입니다.
그리고 여기에 메모리와 프로세서가 있습니다. 우리는 최적화에 대해 이야기하고 있습니다. 당신은 책 이론가입니다)
따라서 "실수하지 않으려면" 어셈블러로 이동하십시오. 모든 것을 직접 제어해야하기 때문에 ... 결국 설명 된 사례는 완전한 사소한 일입니다. 훨씬 더 복잡한 것들이 있습니다. OOP는 확실히 금기입니다. 컴파일러가 이 또는 저 가상 메서드를 일반 호출로 퇴화시켰는지, 아니면 불필요한 포인터 검사를 생략했는지 알 수 없습니다... 그런 편집증이 있는 관리형 MQL에서 무엇을 할 수 있습니까? )
그리고 코드를 컴파일러의 기능(그리고 가상의 것)에 맞게 조정하여 코드의 정확성과 신뢰성을 손상시키는 것 - 이것은 분명히 훌륭한 프로그래머가 해서는 안 되는 일입니다. 그리고 여기서 우리는 코드의 부정확성에 대해 이야기하고 있습니다. 변수는 사용되는 블록에서 직접 선언해야 합니다.
하하하... Alexey, 당신은 포럼에서 OOP의 주요 지지자 중 한 명에게 "OOP는 확실히 금기입니다"라고 주장합니다("당신").
코드는 컴파일러의 기능이 아니라 생각의 기능에 맞게 조정되어야 합니다. 이 경우 이론상 루프 내부에서 변수를 선언 하면 효율성이 감소합니다. 허용된 규칙에 따르면 변수는 매번 생성되어야 하고 매번 소멸되어야 하기 때문입니다.
효율성에 관한 것도 아닙니다. 신뢰할 수 있는 코드는 투명하고 이해하기 쉬우며 수정 및 유지 관리가 쉬운 코드입니다.
개인적으로, 나는 프로그램 전체에 많은 변수가 흩어져 있고, 이 변수나 저 변수가 생성된 위치를 찾아야 할 때마다 정말 마음에 들지 않습니다. 따라서 가능하면 함수 시작 부분에 변수를 모두 함께 선언하려고 합니다. 변수가 생성된 위치를 확인하고 언제 삭제되는지 이해하기 위해서입니다.
이 경우 예제는 매우 짧습니다. 변수 생성과 사용 사이에 수십 줄과 중첩된 함수가 있을 때 - 저에게는 - 변수가 블록 외부에 미리 선언되어 있을 때 훨씬 더 안정적입니다.
죄송합니다 여러분, 프로젝트 설정에서 최적화가 꺼져 있습니다
코드:
최적화 없이
최적화로
최적화를 사용하면 그 반대가 사실입니다. 여러 번 확인했습니다.
이미 홍수를 멈추고 먼저 재료를 마스터한 다음 자신의 경우를 증명하십시오. 프로세서와 메모리의 작동에 대한 책을 최소한 한 권 이상 읽었다면 테스트 없이도 결과가 명확했을 것입니다. 나는 그들 중 가장 독창적 인 것을 제안했습니다. 프로그래밍에서 조용히 발전하고 싶다면 분명히 읽을 것입니다.
그리고 여기에 메모리와 프로세서가 있습니다. 우리는 최적화에 대해 이야기하고 있습니다. 당신은 책 이론가입니다)
이상하지 않습니다. MQL에서 가장 간단한 연산자와 작업을 테스트할 수 있어야 합니다. 테스트에 srand(GetTickCount())를 추가한 이유는 무엇입니까?
;)
그건 그렇고, 나는 더 자세히 보았고, 당신은 또한 거기 루프에 결과를 가지고 있습니다. 앞으로는 고려되지 않으므로 컴파일러에서 쉽게 잘라낼 수 있습니다.
그건 그렇고, 나는 더 자세히 살펴 보았습니다. 거기에 루프에 결과가 있습니다. 앞으로는 고려되지 않으므로 컴파일러에서 쉽게 잘라낼 수 있습니다.
심지어 제거된 rand() - 컴파일러가 완벽하게 인라인되어 다음 테스트를 수행했습니다.
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
따라서 "실수하지 않으려면" 어셈블러로 이동하십시오. 모든 것을 직접 제어해야하기 때문에 ... 결국 설명 된 사례는 완전한 사소한 일입니다. 훨씬 더 복잡한 것들이 있습니다. OOP는 확실히 금기입니다. 컴파일러가 이 또는 저 가상 메서드를 일반 호출로 퇴화시켰는지, 아니면 불필요한 포인터 검사를 생략했는지 알 수 없습니다... 그런 편집증이 있는 관리형 MQL에서 무엇을 할 수 있습니까? )
그리고 코드를 컴파일러의 기능(그리고 가상의 것)에 맞게 조정하여 코드의 정확성과 신뢰성을 손상시키는 것 - 이것은 분명히 훌륭한 프로그래머가 해서는 안 되는 일입니다. 그리고 여기서 우리는 코드의 부정확성에 대해 이야기하고 있습니다. 변수는 사용되는 블록에서 직접 선언해야 합니다.
하하하... Alexey, 당신은 포럼에서 OOP의 주요 지지자 중 한 명에게 "OOP는 확실히 금기입니다"라고 주장합니다("당신").
코드는 컴파일러의 기능이 아니라 생각의 기능에 맞게 조정되어야 합니다. 이 경우 이론상 루프 내부에서 변수를 선언 하면 효율성이 감소합니다. 허용된 규칙에 따르면 변수는 매번 생성되어야 하고 매번 소멸되어야 하기 때문입니다.
효율성에 관한 것도 아닙니다. 신뢰할 수 있는 코드는 투명하고 이해하기 쉬우며 수정 및 유지 관리가 쉬운 코드입니다.
개인적으로, 나는 프로그램 전체에 많은 변수가 흩어져 있고, 이 변수나 저 변수가 생성된 위치를 찾아야 할 때마다 정말 마음에 들지 않습니다. 따라서 가능하면 함수 시작 부분에 변수를 모두 함께 선언하려고 합니다. 변수가 생성된 위치를 확인하고 언제 삭제되는지 이해하기 위해서입니다.
이 경우 예제는 매우 짧습니다. 변수 생성과 사용 사이에 수십 줄과 중첩된 함수가 있을 때 - 저에게는 - 변수가 블록 외부에 미리 선언되어 있을 때 훨씬 더 안정적입니다.
죄송합니다 여러분, 프로젝트 설정에서 최적화가 꺼져 있습니다
코드:
최적화 없이
최적화로
최적화를 사용하면 그 반대가 사실입니다. 여러 번 확인했습니다.
일반적으로 이 예에서는 최적화의 도움으로 주기의 전체를 잘라낼 수 있습니다.
일반적으로 모든 것은 예상대로 엉뚱한 일에 휘말릴 필요가 없으며, 갑자기 존재하지 않는 문제를 찾아 실제 문제를 만드는 데 수렴됩니다.
손이 가렵고 자신을 멋진 쿨해커라고 생각한다면 즉시 어셈블러로 작성하십시오. 그렇지 않으면 한 걸음 물러서서 삼촌 컴파일러가 작업을 수행하도록 방해하지 마십시오)
일반적으로 이 예에서는 최적화의 도움으로 주기의 전체를 잘라낼 수 있습니다.
빈 루프 본문으로 실행한 결과는 매우 다르며 훨씬 빠르게 작동합니다.
일반적으로 모든 것은 예상대로 엉뚱한 일에 휘말릴 필요가 없으며, 갑자기 존재하지 않는 문제를 찾아 실제 문제를 만드는 데 수렴됩니다.
손이 가렵고 자신을 멋진 쿨해커라고 생각한다면 즉시 어셈블러로 작성하십시오. 그렇지 않으면 한 걸음 물러서서 삼촌 컴파일러가 작업을 수행하도록 방해하지 마십시오)
가장 큰 문제는 내가 스스로를 쿨해커라고 생각하지 않는다는 것입니다. 이것이 제 생각에 변수가 루프 외부에서 선언되어야 하는 이유입니다. 그리고 더 나은 - 기능의 맨 처음에 모든 것이 한 번에.
그리고 멋진 해커는 코드 내에서 필요에 따라 변수를 선언할 수 있습니다.
가장 큰 문제는 내가 스스로를 쿨해커라고 생각하지 않는다는 것입니다. 이것이 제 생각에 변수가 루프 외부에서 선언되어야 하는 이유입니다. 그리고 더 나은 - 기능의 맨 처음에 모든 것이 한 번에.
그리고 멋진 해커는 코드 내에서 필요에 따라 변수를 선언할 수 있습니다.
나는 코드를 논리적 블록으로 나누고 그 안에 필요한 변수를 선언하는 것을 선호하며, 함수 시작 부분에 모든 종류의 변수를 묶지 않는 것을 선호합니다.