MQL4 및 MQL5에서 Digits()를 무시하고 숫자(따옴표 제외)의 쉼표 뒤 소수 자릿수 가져오기 - 페이지 21

 
Nikolai Semko :
도중에. 직접 시도해 볼 수 있습니다. 아이디어는 10, 100, 1000, 10000과 같은 다양한 크기의 구조 배열과 함께 공용체를 사용하는 것입니다.
이렇게 하면 루프가 몇 자릿수만큼 줄어들고 ArrayCopy에 대한 호출 수가 몇 자릿수만큼 줄어듭니다.
이것은 memcopy에 더 가까워져야 합니다.

이 아이디어가 사용되었습니다. 어디에서

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

MQL4 및 MQL5에서 Digits()를 무시하고 숫자(따옴표 제외)의 쉼표 뒤 소수 자릿수 가져오기

fxsaber , 2018.12.08 16:25

물론 다양한 크기를 시도했습니다. 어떤 이유로 그들은 결과에 영향을 미치지 않습니다.

모든 것은 소스에서 볼 수 있습니다.
 
fxsaber :

이 아이디어가 사용되었습니다. 어디에서

모든 것은 소스에서 볼 수 있습니다.
네, 찾아봤습니다. 그들이하지 않는 것이 이상합니다.
 
Nikolai Semko :
네, 찾아봤습니다. 그들이하지 않는 것이 이상합니다.

소스에 크기를 담당하는 줄이 있습니다.

 #define CONVERT_AMOUNT 128

이 값을 변경하고 결과를 볼 수 있습니다. 100보다 큰 값에서는 속도가 증가하지 않습니다. 이것은 실제로 설명하기 쉽습니다. 왜냐하면 합계에 따라 동일한 수의 요소가 복사됩니다. 그리고 복사의 작은 부분과 관련된 브레이크는 제외됩니다.

 

그래, 난 동의.
나는 시도했습니다 - TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4에서와 동일한 결과

 
Andrey Khatimlianskii :

소스가 있으므로 스스로 측정할 수 있습니다.

글쎄, 그것을 동결. 나는 거의 확실하지 않으므로 기사 나 측정에서 시간 낭비의 요점을 보지 못합니다.

 

솔직히 말해서 memcpy에 이렇게 가까이 갈 수 있었다는 사실에 매우 놀랐습니다. 그럴 수 없습니다. 뭔가 잘못되었다.

 

나는 당신의 심각한 계산 착오를 이해한다고 생각합니다.
BANCH에서 최소 50개의 절대적으로 동일한 실행이 선택됩니다.
그러나 컴파일러는 매우 똑똑하고 게으릅니다. 동일한 작업을 50번 수행하지는 않지만 코드를 최적화합니다. 따라서 최소한 각 패스에서 배열을 변경해야 합니다. 또는 50 대신 1을 입력하되 테스트 수를 늘립니다. 그러면 결과는 완전히 다르고 더 객관적일 것입니다.

 2018.12 . 09 13 : 55 : 43.048 StructToArray__2        https: //www.mql5.com/ru/forum/287618/page18#comment_9813963
2018.12 . 09 13 : 55 : 43.048 StructToArray__2        TicksToIntArray_thexpert
2018.12 . 09 13 : 55 : 43.296 StructToArray__2         Time [TicksToIntArray(TicksIn,Array)] = 247579
2018.12 . 09 13 : 55 : 43.296 StructToArray__2        IntArrayToTicks_thexpert
2018.12 . 09 13 : 55 : 43.544 StructToArray__2         Time [IntArrayToTicks(Array,TicksOut)] = 247840
2018.12 . 09 13 : 55 : 43.634 StructToArray__2         true
2018.12 . 09 13 : 55 : 43.766 StructToArray__2        
2018.12 . 09 13 : 55 : 43.766 StructToArray__2        https: //www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12 . 09 13 : 55 : 43.766 StructToArray__2        TicksToIntArray_fxsaber4
2018.12 . 09 13 : 55 : 44.118 StructToArray__2         Time [TicksToIntArray(TicksIn,Array)] = 351847
2018.12 . 09 13 : 55 : 44.118 StructToArray__2        IntArrayToTicks_fxsaber4
2018.12 . 09 13 : 55 : 44.452 StructToArray__2         Time [IntArrayToTicks(Array,TicksOut)] = 334011
2018.12 . 09 13 : 55 : 44.548 StructToArray__2         true
2018.12 . 09 13 : 55 : 44.692 StructToArray__2        
2018.12 . 09 13 : 55 : 44.692 StructToArray__2        https: //www.mql5.com/ru/forum/287618/page18#comment_9814108
2018.12 . 09 13 : 55 : 44.692 StructToArray__2        TicksToIntArray_semko
2018.12 . 09 13 : 55 : 45.037 StructToArray__2         Time [TicksToIntArray(TicksIn,Array)] = 344707
2018.12 . 09 13 : 55 : 45.037 StructToArray__2        IntArrayToTicks_semko
2018.12 . 09 13 : 55 : 45.373 StructToArray__2         Time [IntArrayToTicks(Array,TicksOut)] = 336193
2018.12 . 09 13 : 55 : 45.462 StructToArray__2         true

memcpy와 비교한 차이가 40%일 때 - 더 믿을 수 있습니다.

흥미롭게도 배열을 압축하면 효과가 나타납니다. 틱 배열을 10-12배 줄일 수 있습니다. 유일한 질문은 리소스를 통해 보내고 받을 때 결과적으로 시간을 절약할 수 있는지 여부입니다.

파일:
 
Nikolai Semko :

나는 당신의 매우 심각한 계산 착오를 이해한다고 생각합니다.
BANCH에서 최소 50개의 절대적으로 동일한 실행이 선택됩니다.
그러나 컴파일러는 매우 똑똑하고 게으릅니다. 동일한 작업을 50번 수행하지는 않지만 코드를 최적화합니다.

코드는 그들이 원하는 것을 정확히 수행할 수 있도록 작성되었습니다. 컴파일러는 memcpy 의 속도에 영향을 줄 수 없지만 통과 결과는 다음과 같습니다.

단일 패스 주기

https: //www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time [TicksToIntArray(TicksIn,Array)] = 235285
IntArrayToTicks_thexpert
Time [IntArrayToTicks(Array,TicksOut)] = 192509
true


50점 만점에

https: //www.mql5.com/ru/forum/287618/page18#comment_9813963
TicksToIntArray_thexpert
Time [TicksToIntArray(TicksIn,Array)] = 80970
IntArrayToTicks_thexpert
Time [IntArrayToTicks(Array,TicksOut)] = 81103
true
 
fxsaber :

코드는 그들이 원하는 것을 정확히 수행할 수 있도록 작성되었습니다. 컴파일러는 memcpy의 속도에 영향을 줄 수 없지만 통과 결과는 다음과 같습니다.

단일 패스 주기


50점 만점에

그런데 왜 이런 일이 일어납니까? 물론 컴파일러는 memcpy 실행 프로세스에 영향을 줄 수 없지만 루프 중에 계산된 매개변수가 변경되지 않는다는 것을 이해하면 컴파일러는 실행을 거부하고 첫 번째 계산에서 이전에 저장된 결과를 가져옵니다. 나 자신은 프로그램의 비합리성을 수정하는 방식으로 컴파일러를 구성할 것입니다.
 
Ilya Malev :

글쎄, 그것을 동결. 나는 거의 확실하지 않으므로 기사 나 측정에서 시간 낭비의 요점을 보지 못합니다.

난 필요 없어.