错误、漏洞、问题 - 页 2880

 
Igor Makanu:

如果有重复的代码部分,你会得到优化的测试!

rand()执行多长时间有什么区别?

让它执行2/3的测试时间,主要是让rand()的时间不变。

您的MQL代码将使用系统的MQL-函数,对吗?- 测试一个完美的代码有什么意义?

))的速度差异可能是其中一种方法的4倍(1到4),但由于rand 操作比代码的其他部分慢10倍,这种差异将不明显(11到14)

 
Alexandr Andreev:

))速度上的差异可能是其中一种方法的4倍(1到4),但由于该操作比代码 其他部分长10倍,这种差异不会显现出来(11到14)

不可能

差异立即可见

让我们检查一下开发人员在创新中宣布的东西,他们经常写道,对某些函数访问时间序列的时间已经被优化了 = 很长时间没有检查了

#define    SpeedTest(count_x10,msg,EX)        {ulong mss=GetMicrosecondCount(); ulong count=(ulong)pow(10,count_x10);for(ulong _i=0;_i<count&&!_StopFlag;_i++){EX;} \
//+------------------------------------------------------------------+
void OnStart()
{
   double sum1 = 0.0;
   SpeedTest(7, "tst 1 : ",
   {
      sum1 += iOpen(NULL, 0, rand());
   });
//--
   double sum2 = 0.0;
   SpeedTest(7, "tst 2 : ",
   {
      double o[];
      CopyOpen(NULL, 0, rand(), 1, o);
      sum2 += o[0];
   });
   Print(sum1, " : ", sum2);
}
//+------------------------------------------------------------------+

2020.10.16 02:11:20.671 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=353174

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1296043

2020.10.16 02:11:21.967 SpeedTst (EURUSD,H1) 11304533.15558525 : 11303930.69247558

2020.10.16 02:11:44.012 SpeedTst (EURUSD,H1) tst 1 : : loops=10000000 ms=359757

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) tst 2 : : loops=10000000 ms=1357325

2020.10.16 02:11:45.369 SpeedTst (EURUSD,H1) 11304350.05612442 : 11304321.21848488

 
Igor Makanu:

不太重要

rand()的执行时间是恒定的,很可能是一个普通的C++函数,谷歌 "rand c++源代码"

你必须初始化它,但如果你用常数初始化它,你可能会遇到优化问题

总的来说,我不明白为什么不喜欢rand()。

一个选择是用类似这样的方法来初始化。

将是快速的。


运行了你的脚本,我认为不正确。

主要的时间是将代码加载到高速缓存中,然后再加载到处理器中。

并加上系统定时器的离散性

我们得到...几乎是一个随机数。

你需要长时间的测试,大约100500次,我认为。

rand()使结果沉默。
在我的电脑上,一个循环迭代大约需要1.5纳秒。

用两个rand()进行一次迭代需要两倍的时间--高达近3纳秒。你应该意识到,在这个迭代中,对一个大数组的一个项的两次访问将消失,这也是相当昂贵的。
这意味着大约2/3的迭代时间花在两个rands()上。当然,我对 "一个数量级 "有点兴奋 ))

我不明白,当一个预先准备好的数组被填入随机数时,怎么会遇到优化问题。

已经讨论过一次rand()的性能。我甚至试图自己写一个类似的函数。https://www.mql5.com/ru/forum/170952/page137#comment_12010041

#define  Num 10000000
#define  SpeedTest(msg,s,EX)  {ulong mss=GetMicrosecondCount(); EX \
                                    mss=GetMicrosecondCount()-mss;\
                                    printf("%-30s%llu µs; Сумма - %llu",msg,mss,s);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   ulong sum = 0;
   ushort in[];
   ArrayResize(in,Num*2);
   for (int i=0; i<Num*2; i++) in[i] = (ushort)rand();
   SpeedTest("test binary shift : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=in[i]<<(sizeof(ushort)*8) | in[i+1];
   });
//+------------------------------------------------------------------+ 
   sum = 0;
   union ushortTouint
   {
      uint param;
      ushort in[2];
   } u;
   SpeedTest("test union : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=in[i+1];
      u.in[1]=in[i];
      sum+=u.param;
   });
//+------------------------------------------------------------------+   
   sum=0;
   SpeedTest("test binary shift + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      sum+=(ushort)rand()<<(sizeof(ushort)*8) | (ushort)rand();
   });
//+------------------------------------------------------------------+  
   sum = 0;
   SpeedTest("test union + rand() : ", sum,
   for (int i =0; i<(2*Num-1);i+=2)
   {
      u.in[0]=(ushort)rand();
      u.in[1]=(ushort)rand();
      sum+=u.param;
   });
}

结果

2020.10.15 18:30:34.752 TestMakanu (USDCAD,M1)  test binary shift :           13474 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.763 TestMakanu (USDCAD,M1)  test union :                  10189 µs; Сумма - 10736778112806491
2020.10.15 18:30:34.792 TestMakanu (USDCAD,M1)  test binary shift + rand() :  29103 µs; Сумма - 10741215942967312
2020.10.15 18:30:34.820 TestMakanu (USDCAD,M1)  test union + rand() :         28125 µs; Сумма - 10737655794873175
2020.10.15 18:30:37.802 TestMakanu (USDCAD,M1)  test binary shift :           11144 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.812 TestMakanu (USDCAD,M1)  test union :                  10334 µs; Сумма - 10739125609966082
2020.10.15 18:30:37.840 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27495 µs; Сумма - 10739749025492645
2020.10.15 18:30:37.867 TestMakanu (USDCAD,M1)  test union + rand() :         26782 µs; Сумма - 10738717766184542
2020.10.15 18:30:40.356 TestMakanu (USDCAD,M1)  test binary shift :           10618 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.367 TestMakanu (USDCAD,M1)  test union :                  11354 µs; Сумма - 10738510882058397
2020.10.15 18:30:40.395 TestMakanu (USDCAD,M1)  test binary shift + rand() :  27637 µs; Сумма - 10738670876702722
2020.10.15 18:30:40.422 TestMakanu (USDCAD,M1)  test union + rand() :         26772 µs; Сумма - 10737441784096963
 

我认为底线是,无论你使用union还是binary shift,都几乎没有区别。
,我在我的iCanvas库中使用这两种方法来处理颜色。

union argb {
   uint clr;
   uchar c[4];
};


我记得,我也一直在做一些性能测试,我的结论是,这几乎没有什么区别。但带有union的代码更容易阅读。
我必须承认,我很失望,因为我期待着用工会获得一个明显的性能提升。

 
Nikolai Semko:

我不明白,当一个预先准备好的数组被填满随机数时,你怎么会遇到优化问题。

我在上面的hubr上给了你两个链接,第一篇文章很好地展示了一个正常的循环在编译后的样子

我不是说你一定要到运行时优化,但我认为,如果数组不改变,这基本上是一个恒定的内存空间,循环的大小是恒定的,在某种类型的处理器上,优化不会冒出来,这不是一个事实,优化可以从编译器,以及有缓存的处理器中期待。


Nikolai Semko:

我认为底线是,使用什么几乎没有区别--联合或二进制转移。

是的,没错,我将使用shift,代码是可读的,而且没有必要引入一个新的数据类型--union
 
Igor Makanu:

我在上面给了你2个关于Hbr的链接,第一篇文章很好地展示了一个正常循环在编译后的样子

我不是说你一定要进入运行时优化,但我认为,如果数组不改变,这基本上是一个恒定的内存空间,循环的大小是恒定的,不一定会有优化出现

从结果来看,没有优化的迹象

 
Nikolai Semko:

结果完全没有给人以优化的印象

争论的焦点不在于具体的代码

但在测试方法上,我仍然坚持我的最佳测试方法,而rand()虽然引入了失真,但它是一个线性系数,而不是比例,也就是说,如果没有低于5%的速度差异,准确性就不是很重要,我认为

 
亲爱的先生们,谁能至少给我一个答案,说明我不理解的这种情况
 

大家好!

我有一个问题,也许是给MQL5的开发者的? 也许有其他人知道...是否有计划将ME编译器/代码编辑器与一些流行的开发环境如IDEA或Visual Studio 集成?元编辑对我来说是个大麻烦。没有区块折叠,没有自动替换模板(例如,当你开始输入for(...)时,它立即为你提供替换循环模式和其他许多东西),没有突出显示代码的各种重要部分。诸如此类。我不是说现代机器人很复杂,这些都是大项目,对代码管理和团队开发能力有更严重的要求。

没有人再写自己的编辑器和编译器了--他们都放弃了,转而使用微软、JetBrains和其他公司的现成解决方案。所有现代编辑器都有可定制的插件系统,允许你在其中添加任何你喜欢的东西。 这项任务在原则上并不困难。

 
Сергей Таболин:
亲爱的先生们,有没有人可以给 一个答案,我不明白这个情况

而且你应该更多地欺负程序员。那么你肯定会得到帮助。