MQL4 ve MQL5'te Rakamları () atlayarak herhangi bir sayıdan (sadece tırnak işaretleri değil) sonra ondalık basamak sayısını alma - sayfa 21

 
Nikolai Semko :
Yoldayken. Kendiniz deneyebilirsiniz. Buradaki fikir, 10, 100, 1000, 10000 gibi çeşitli boyutlarda yapı dizileriyle sendikaları kullanmaktır...
Bu, döngüyü büyüklük sıralarına göre azaltacak ve ArrayCopy'ye yapılan çağrıların sayısını büyüklük sıralarına göre azaltacaktır.
Bu onu memcopy'ye yaklaştırmalıdır.

Bu fikir kullanılmıştır. nerede

Her şey kaynakta görünür.
 
fxsaber :

Bu fikir kullanılmıştır. nerede

Her şey kaynakta görünür.
Evet, baktım. Yapmamaları garip.
 
Nikolai Semko :
Evet, baktım. Yapmamaları garip.

Kaynakta boyuttan sorumlu bir satır var.

 #define CONVERT_AMOUNT 128

Bu değeri değiştirebilir ve sonuca bakabilirsiniz. Yüzden büyük değerlerde hız artmaz. Bunu açıklamak aslında kolaydır, çünkü Toplama göre aynı sayıda eleman kopyalanır. Ve küçük kopyalama bölümleriyle ilişkili frenler hariç tutulmuştur.

 

Evet katılıyorum.
Denedim - TicksToIntArray_fxsaber4/IntArrayToTicks_fxsaber4'tekiyle aynı sonuç

 
Andrey Khatimlianskii :

Kaynaklar var, kendin ölçebilirsin.

Peki, dondur. Neredeyse emin değilim, bu yüzden ne makale üzerinde ne de ölçüm üzerinde zaman kaybetmenin bir anlamı göremiyorum.

 

Dürüst olmak gerekirse, memcpy'ye bu kadar yaklaşmayı başardığıma çok şaşırdım. Bu olamaz. Bir şey yanlış.

 

Sanırım çok ciddi yanlış hesaplamanızı anlıyorum.
BANCH'ınızda, minimum 50 kesinlikle aynı koşu seçilmiştir.
Ancak derleyici çok akıllı ve tembeldir. Aynı işi 50 kez yapmayacak, ancak kodu optimize edecek. Bu nedenle, en azından her geçişte dizileri değiştirmeniz gerekir. Veya 50 yerine 1 koyun, ancak test sayısını artırın. O zaman sonuçlar tamamen farklı ve daha objektif olacaktır.

 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 ile karşılaştırıldığında fark %40 olduğunda - daha inandırıcıdır

İlginç bir şekilde, dizinin sıkıştırılması bir etki verecektir. Bir dizi kene 10-12 kat azaltılabilir. Tek soru, bunun kaynak yoluyla gönderirken ve alırken ortaya çıkan zamandan tasarruf edip etmeyeceğidir.

Dosyalar:
 
Nikolai Semko :

Sanırım çok ciddi yanlış hesaplamanızı anlıyorum.
BANCH'ınızda, minimum 50 kesinlikle aynı koşu seçilir.
Ancak derleyici çok akıllı ve tembeldir. Aynı işi 50 kez yapmayacak, ancak kodu optimize edecek.

Kod, tam olarak ondan istediklerini yapacak şekilde yazılmıştır. Derleyici memcpy hızını etkileyemez, ancak geçişlerin sonuçları aşağıdaki gibidir

tek geçiş döngüsü

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 üzerinden

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 :

Kod, tam olarak ondan istediklerini yapacak şekilde yazılmıştır. Derleyici memcpy hızını etkileyemez, ancak geçişlerin sonuçları aşağıdaki gibidir.

tek geçiş döngüsü


50 üzerinden

Ama o zaman bu neden oluyor? Elbette, derleyici memcpy yürütme sürecini etkileyemez, ancak döngü sırasında hesaplanan parametrelerin hiçbirinin değişmediğini anlarsa, ilk hesaplamadan önceden kaydedilmiş sonuçları çekerek yürütmeyi reddedebilir. Ben kendim derleyiciyi programın mantıksızlıklarını düzeltecek şekilde düzenlerdim.
 
Ilya Malev :

Peki, dondur. Neredeyse emin değilim, bu yüzden ne makale üzerinde ne de ölçüm üzerinde zaman kaybetmenin bir anlamı göremiyorum.

ihtiyacım yok.