绕过MQL4和MQL5中的Digits(),获取任何数字的小数位数(不仅仅是引号)。 - 页 15

 
Igor Makanu:

如果ArrayCopy()是以与Cysh memmove()相同的方式进行。

我认为ArrayCopy()的速度取决于内存分配的速度,如果中间缓冲区的内存已经准备好供复制,ArrayCopy()将很快被执行,如果内存没有分配,你将开始请求操作系统分配内存

你可以试着测试一下--用一个大的数据量调用ArrayCopy(),从而为交换缓冲区内存做准备,然后用ArrayCopy()做一个循环,用一个较小的数据量来复制,然后测量速度

在我们目前的例子中,复制是在静态数组中执行的,但在一般情况下,当ArrayCopy比简单的for慢的时候,当然是很有意思的。如果你需要分配内存,无论你怎么做,你都必须这样做。

 
Ilya Malev:

在我们目前的例子中,复制是向静态数组进行的,但在一般情况下,当ArrayCopy比简单的for慢时,当然是很有趣的。如果我们需要分配内存,无论如何我们都要这样做。

静态或动态并不重要,我们不知道ArrayCopy()是如何实现的,我只是假设它是标准Cish函数的一个 "包装器",memmove()通常通过额外的缓冲器工作...好吧,像往常一样,这就是以前的写法,很难说是怎样的,哪个编译器在工作。

SZY: 我只是不知道如何测试MQL的运行时间(((-我试过几次,我想我从帮助中取了例子,结果不知为何大不相同,出于需要,我忽略了这个问题-我不测试性能,我通常在剖析器中 查看,什么和如何执行的时间

 
Igor Makanu:

我只是不知道如何测试MQL的执行速度((()--我试过几次,我想我是从帮助中取的例子,但结果由于某种原因而大相径庭,所以我放弃了这个问题,因为我不测试性能,我通常使用剖析器来 查看如何执行和什么执行的时间

这是最简单的方法,我在上面使用了这个方法

#property strict

#define    test(M,S,EX)        {uint mss=GetTickCount();int nn=(int)pow(10,M);for(int tst=0;tst<nn;tst++){EX;} \
                                printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}

void OnStart()
 {
  int arr1[100]={0},arr2[100]={0};
  test(7,"Копирование через ArrayCopy",ArrayCopy(arr1,arr2))
  test(7,"Копирование через for",for(int i=0;i<100;i++)arr1[i]=arr2[i])
 }  


 
Ilya Malev:

这是我使用的最简单的方法。


谢谢,我知道了,我明天会测试的。

 
Ilya Malev:

是的,这将工作得更 快(在可能的情况下,用ArrayCopy代替,其余的都一样)。

我告诉过你,我没有经过任何测试就写了第一个想到的东西))。

这个变体与我的 没有什么不同。测量结果(10次尝试中的最少时间)证明了这一点。

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber2
Time[TicksToIntArray(TicksIn,Array)] = 301036
IntArrayToTicks_fxsaber2
Time[IntArrayToTicks(Array,TicksOut)] = 315109
true

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 216101
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 203610
true

https://www.mql5.com/ru/forum/287618/page14#comment_9810247
TicksToIntArray_antfx2
Time[TicksToIntArray(TicksIn,Array)] = 303656
IntArrayToTicks_antfx2
Time[IntArrayToTicks(Array,TicksOut)] = 312008
true

你可以看到,带周期的变体更快,因为周期为60/4=15个元素。

附加的文件:
 
fxsaber:

这个变体与我的 没有什么不同。

显然是的,只有结构类型和数组类型是任意的。

 
fxsaber:

你可以看到,循环变体更快,因为60/4=15个元素的循环。

奇怪的是,在同样的MqlTicks 和int.Level中,我得到了比ArrayCopy更快的速度。

 
Ilya Malev:

奇怪的是,我在同样的MqlTicks 和int.Ltd.下得到了比ArrayCopy更快的速度。

我在MT5x64中运行它。

Ilya Malev:

显然,是的,但结构类型和数组类型是任意的。

我特意避开了常见的案例,以便让更多人参与进来。


到目前为止

https://www.mql5.com/ru/forum/287618/page14#comment_9808274
TicksToIntArray_antfx1
Time[TicksToIntArray(TicksIn,Array)] = 213426
IntArrayToTicks_antfx1
Time[IntArrayToTicks(Array,TicksOut)] = 202693
true

https://www.mql5.com/ru/forum/287618/page14#comment_9807465
TicksToIntArray_fxsaber3
Time[TicksToIntArray(TicksIn,Array)] = 192362
IntArrayToTicks_fxsaber3
Time[IntArrayToTicks(Array,TicksOut)] = 159932
true
 
fxsaber:

在MT5x64中运行。

特意绕过了一般情况,以便更多的人可以参与。


到目前为止。

我猜你的代码已经比较快了 :)

我必须在那里添加大量的服务代码,以改善ArrayCopy 的功能(源开始,目的地开始,计数),并检查参数的正确性...

总的来说,你有这么多很酷的作品/库,你在论坛上询问和讨论最佳解决方案,这很奇怪 :)

 
Ilya Malev:

很奇怪,你在论坛上询问和讨论最佳解决方案 :)

我需要一个用于HistoryTicks图书馆。谢谢你的参与。