mql5语言的特点、微妙之处以及技巧 - 页 118

 
不,我错了,当Optimize=1时,FastLog2确实工作得更快,这是一个奇迹......我必须在C++中检查它。
 
Alexey Navoykov:

顺便说一下,关于零,FastLog2不检查零,这给了它一个先机。但如果测试正确,它仍然比log2慢1.5-2倍)。

那么它有什么不正确的地方呢?

因为即使是你的测试版本也会产生。

2019.01.05 04:43:12.372 TestLog (EURUSD,H1)     Result log2:       sum=1400005128  time=297 ms
2019.01.05 04:43:12.635 TestLog (EURUSD,H1)     Result log2_:      sum=1400018381  time=262 ms
2019.01.05 04:43:12.809 TestLog (EURUSD,H1)     Result _FastLog2:  sum=1400004095  time=174 ms
 
Alexey Navoykov:

顺便说一下,关于零,FastLog2不检查零,这给了它一个先机。但如果测试正确的话,它仍然比log2慢1.5-2倍)。

当然,我们应该从log2中删除零点检查,或者在FastLog2中添加同样的检查。

这个问题实际上是关于计算部分的速度。在log2中,一切都纯粹是通过移位和加法来计算。FastLog2在涉及乘法的巧妙转换后使用表值。这段代码非常古老,它是在数学协处理器时代使用的,从那时起情况很可能已经发生了变化。

 
在C++中检查了一下。 是的,FastLog2的确是最快的。这是个棘手的代码,虽然 )也许原因是位操作比比较操作快得多。
 
我已经在MT4中测试了所有的代码。在MT4中,编译器没有进行任何优化(也就是说,带有sum的变体与我原来没有sum的变体显示出相同的相对结果),而且在MT4中log2的运行速度比FastLog2快。而在MT5中,优化已经在不求和的情况下进行(即代码显然没有完全执行),FastLog2变体比log2快。从中可以得出什么结论,我不知道,因为没有关于代码优化器如何工作的细节,那里和那里。
 
void f(){
  static int a[]; 
  Print("a[]=",ArraySize(a)); 
  ArrayResize(a, 100); 
  Print("a[]=",ArraySize(a));}


class A
 {
public: A(){ f(); }
 };
 
A _a;

void OnStart()
  {

  }


 
Ilya Malev:

这是标准的MQL5行为:静态变量排在全局变量之后。

你可以因为这个而变得非常严重的混乱。
 
fxsaber:

这是MQL5的标准行为:静态变量在全局变量之后开始。

这就是为什么类/结构的每一个静态变量都必须在结构本身之后声明?即使不给它赋予任何价值...也许我们应该建议编译器自动完成这一切?

 

这实质上是一个错误,是程序代码执行的不正确顺序。编译器原则上不应该允许这样做。 你应该多向开发者吼叫这个问题。

在C++中,代码被编译器严格地从上到下处理,所以上面的一切都已经被初始化了。 而且你不能访问下面的代码。这就是为什么一切都很清楚。 既然开发者在这里引入了他们自己的规则,就让他们提供正确的代码执行顺序。

 
Alexey Navoykov:

在C++中,代码被编译器严格地从上到下处理,所以上面的任何东西都已经被初始化了。 而你无法访问下面的。这就是为什么一切都很清楚。

灵活性较低。