向#define专家提问 - 页 4

 
Alexandr Andreev:

部署正常功能是理所当然的事

例如,对于(int i=0; i<ArraiSize(max); i++)

这里ArraiSize(max);将被扩展,它将得到类似于给定数组大小的地址(如果我们看一下数组,它的大小在一个变量中,这里我们对这个变量 "内存中的地址 "进行替换),即根本没有必要将它改为一个变量

for (int i=0; i<ArraiSize(max); i++)

и

for (int i=0; i<size; i++)

在这种情况下,ArraiSize(max)和size有相同的时序来确定数组的大小

不正确的说法

测试:我试了1000次,3个数组和每个数组中的3个嵌套循环,2个变体:第一个第二个

结果是稳定的(测试了3次)。

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

我不认为讨论测试方法有什么意义--非常冗长和必要的
 
Roman:

在这个例子的循环中,我认为我不同意关于时间的说法。
相反,建议将结果转化为大小变量,并在条件中使用它。
因为ArraiSize(max) 每次迭代的循环会不必要地解开,减慢了循环的执行。

ArraiSize(max)函数扩展并返回带有数组长度记录的单元格;返回存储数组长度的单元格的地址

什么是任何变量,在本例中,size - 是存储数组长度单元格的 地址。

因此,我们在输出端得到同样的东西,即使我们在循环的过程中改变了数组的大小,在第一种或第二种情况下,每个单元的地址都不会改变。

由于mas值总是静态的(它不是一个引用),所以根本不可能有其他的逻辑)))

ArraiSize(max)函数本身,说的是max 数组中的一个内存段应该被用于数组长度;这是在编译阶段进行的--函数部署

 
Igor Makanu:

不正确的说法

测试:计量1000次,3个数组和每个数组上的3个嵌套蛮力循环,2个变体:第一第二

结果是稳定的(测试了3次)。

2020.11.02 21:17:25.952 SpeedTst (EURUSD,H1) ArraySize: loops = 1000 seconds=114.5013

2020.11.02 21:17:40.713 SpeedTst (EURUSD,H1) cnt: loops = 1000 seconds=99.7722

我不认为讨论测试方法有什么意义--非常冗长和必要的

然后是一些问题的建立....

 
Alexandr Andreev:

那么,汇编....,就有一些问题。

很明显,产出是一样的。
但这个内存部分的访问方式会有所不同,这就是重点。
对变量的访问比对函数的访问要快,因为变量已经包含了值。
而一个函数仍然需要检索这个值并将其返回,即引用一个内存单元,这是一条不必要的指令。

伊戈尔的例子只是证实了我所说的。

 
Alexandr Andreev:

然后是装配的一些问题....

撒谎

每次迭代都会调用ArraySize()。

即使你没有每次都检查数组的大小,你仍然会得到一个过程调用,并且至少会检查存储数组大小的变量。

这是我正在写的测试,我们 在循环中调整数组的大小,循环被中断,因为它应该是这样的,即在循环的每个迭代中,数组的大小是在循环主体执行后确定的。

void OnStart()
{
   int arr[];
   int sz = ArrayResize(arr, 100000);
   int cnt = 0;
   for(int i = 0; i < ArraySize(arr); i++)
   {
      ArrayResize(arr, sz--);
      cnt++;
   }
   printf("cnt = %i", cnt);   //cnt = 50001
}
 
Igor Makanu:

撒谎

每次迭代都会调用ArraySize()。

即使不是每次都检查数组大小,程序仍然被调用,至少存储数组大小的变量被检查。

下面是我要写的测试:我们在循环中调整数组的大小,循环按预期终止,即在每个循环迭代中,数组的大小在循环主体执行后被定义。

给我你的测试的完整代码。

Roman:

很明显,我们在输出中得到了同样的东西。
但这个内存片段的获取方式会有所不同,这就是我的意思。

伊戈尔的例子只是证实了我所说的。

而你自己进行的测试,我在11000000000000000这样的事情不会发生。

更确切地说,我在任何测试中都没有这种情况,即使是在LONG_MAX 重复的情况下也没有。
 
Alexandr Andreev:

ArraiSize(max)函数被扩展,它从数组中获取一个有长度记录的单元格并返回它,即记录数组长度的单元格的地址

什么是任何变量,在本例中,size是存储数组长度单元格的 地址。

因此,我们在输出端得到同样的东西,即使我们在循环的过程中改变了数组的大小,在第一种或第二种情况下,每个单元的地址都不会改变。

由于mas值总是静态的(它不是一个引用),所以根本不可能有其他的逻辑)))

ArraiSize(max)函数本身说,我们应该在max 数组中使用一个负责数组长度内存区域,这是在编译阶段执行的--函数部署

这种意见似乎是不成熟的。ArraiSize函数的背后到底发生了什么是未知的,不是吗?这是MQL中的一个黑盒子。很有可能,for (int i=0; i<ArraiSize(max); i++) 会导致几条指令的执行。例如,一个函数可以检查输入参数。保存 - 将数据推离堆栈。保存登记簿。复原登记册。函数调用 - 调用,然后返回。我的意思是,很多事情可能在后台发生,而我们看不到。这就是为什么最好使用for (int i=0; i<size; i++),而不是依赖编译器来做我们期望它做的事。

 
Alexandr Andreev:

你自己做了测试吗,我没有在11000000000000000的时候做测试


这是很久以前的测试,这就是为什么我只在循环中使用变量。

 
Roman:

这是很久以前的测试,所以我只在循环中使用变量。

给我看一个带有代码的测试

 
Alexandr Andreev:

给我看看测试的代码

什么测试? ))
你自己展示了循环条件的两种变体。
伊戈尔也给出了上面的代码。
只要用size变量和循环条件中的ArraySize() 来衡量循环的执行。

原因: