向#define专家提问 - 页 4 123456789101112 新评论 Igor Makanu 2020.11.02 18:20 #31 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 我不认为讨论测试方法有什么意义--非常冗长和必要的 Alexandr Andreev 2020.11.02 18:26 #32 Roman:在这个例子的循环中,我认为我不同意关于时间的说法。 相反,建议将结果转化为大小变量,并在条件中使用它。 因为ArraiSize(max) 的 每次迭代的循环会不必要地解开,减慢了循环的执行。 ArraiSize(max)函数扩展并返回带有数组长度记录的单元格;返回存储数组长度的单元格的地址 什么是任何变量,在本例中,size - 是存储数组长度 的单元格的 地址。 因此,我们在输出端得到同样的东西,即使我们在循环的过程中改变了数组的大小,在第一种或第二种情况下,每个单元的地址都不会改变。 由于mas值总是静态的(它不是一个引用),所以根本不可能有其他的逻辑))) ArraiSize(max)函数本身,说的是max 数组中的一个内存段应该被用于数组长度;这是在编译阶段进行的--函数部署 Alexandr Andreev 2020.11.02 18:27 #33 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 我不认为讨论测试方法有什么意义--非常冗长和必要的 然后是一些问题的建立.... Roman 2020.11.02 18:35 #34 Alexandr Andreev:那么,汇编....,就有一些问题。 很明显,产出是一样的。 但这个内存部分的访问方式会有所不同,这就是重点。 对变量的访问比对函数的访问要快,因为变量已经包含了值。 而一个函数仍然需要检索这个值并将其返回,即引用一个内存单元,这是一条不必要的指令。 伊戈尔的例子只是证实了我所说的。 Igor Makanu 2020.11.02 18:35 #35 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 } Alexandr Andreev 2020.11.02 18:48 #36 Igor Makanu:撒谎每次迭代都会调用ArraySize()。即使不是每次都检查数组大小,程序仍然被调用,至少存储数组大小的变量被检查。下面是我要写的测试:我们在循环中调整数组的大小,循环按预期终止,即在每个循环迭代中,数组的大小在循环主体执行后被定义。 给我你的测试的完整代码。 Roman: 很明显,我们在输出中得到了同样的东西。 但这个内存片段的获取方式会有所不同,这就是我的意思。 伊戈尔的例子只是证实了我所说的。 而你自己进行的测试,我在11000000000000000这样的事情不会发生。 更确切地说,我在任何测试中都没有这种情况,即使是在LONG_MAX 重复的情况下也没有。 Andrei Novichkov 2020.11.02 18:52 #37 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++),而不是依赖编译器来做我们期望它做的事。 Roman 2020.11.02 18:52 #38 Alexandr Andreev:你自己做了测试吗,我没有在11000000000000000的时候做测试 这是很久以前的测试,这就是为什么我只在循环中使用变量。 Alexandr Andreev 2020.11.02 18:53 #39 Roman:这是很久以前的测试,所以我只在循环中使用变量。 给我看一个带有代码的测试 Roman 2020.11.02 18:56 #40 Alexandr Andreev:给我看看测试的代码 什么测试? )) 你自己展示了循环条件的两种变体。 伊戈尔也给出了上面的代码。 只要用size变量和循环条件中的ArraySize() 来衡量循环的执行。 123456789101112 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
部署正常功能是理所当然的事
例如,对于(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
在这个例子的循环中,我认为我不同意关于时间的说法。
相反,建议将结果转化为大小变量,并在条件中使用它。
因为ArraiSize(max) 的 每次迭代的循环会不必要地解开,减慢了循环的执行。
ArraiSize(max)函数扩展并返回带有数组长度记录的单元格;返回存储数组长度的单元格的地址
什么是任何变量,在本例中,size - 是存储数组长度 的单元格的 地址。
因此,我们在输出端得到同样的东西,即使我们在循环的过程中改变了数组的大小,在第一种或第二种情况下,每个单元的地址都不会改变。
由于mas值总是静态的(它不是一个引用),所以根本不可能有其他的逻辑)))
ArraiSize(max)函数本身,说的是max 数组中的一个内存段应该被用于数组长度;这是在编译阶段进行的--函数部署
不正确的说法
测试:计量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
然后是一些问题的建立....
那么,汇编....,就有一些问题。
很明显,产出是一样的。
但这个内存部分的访问方式会有所不同,这就是重点。
对变量的访问比对函数的访问要快,因为变量已经包含了值。
而一个函数仍然需要检索这个值并将其返回,即引用一个内存单元,这是一条不必要的指令。
伊戈尔的例子只是证实了我所说的。
然后是装配的一些问题....
撒谎
每次迭代都会调用ArraySize()。
即使你没有每次都检查数组的大小,你仍然会得到一个过程调用,并且至少会检查存储数组大小的变量。
这是我正在写的测试,我们 在循环中调整数组的大小,循环被中断,因为它应该是这样的,即在循环的每个迭代中,数组的大小是在循环主体执行后确定的。
撒谎
每次迭代都会调用ArraySize()。
即使不是每次都检查数组大小,程序仍然被调用,至少存储数组大小的变量被检查。
下面是我要写的测试:我们在循环中调整数组的大小,循环按预期终止,即在每个循环迭代中,数组的大小在循环主体执行后被定义。
给我你的测试的完整代码。
很明显,我们在输出中得到了同样的东西。
但这个内存片段的获取方式会有所不同,这就是我的意思。
伊戈尔的例子只是证实了我所说的。
而你自己进行的测试,我在11000000000000000这样的事情不会发生。
ArraiSize(max)函数被扩展,它从数组中获取一个有长度记录的单元格并返回它,即记录数组长度的单元格的地址
什么是任何变量,在本例中,size是存储数组长度 的单元格的 地址。
因此,我们在输出端得到同样的东西,即使我们在循环的过程中改变了数组的大小,在第一种或第二种情况下,每个单元的地址都不会改变。
由于mas值总是静态的(它不是一个引用),所以根本不可能有其他的逻辑)))
ArraiSize(max)函数本身说,我们应该在max 数组中使用一个负责数组长度 的内存区域,这是在编译阶段执行的--函数部署
这种意见似乎是不成熟的。ArraiSize函数的背后到底发生了什么是未知的,不是吗?这是MQL中的一个黑盒子。很有可能,for (int i=0; i<ArraiSize(max); i++) 会导致几条指令的执行。例如,一个函数可以检查输入参数。保存 - 将数据推离堆栈。保存登记簿。复原登记册。函数调用 - 调用,然后返回。我的意思是,很多事情可能在后台发生,而我们看不到。这就是为什么最好使用for (int i=0; i<size; i++),而不是依赖编译器来做我们期望它做的事。
你自己做了测试吗,我没有在11000000000000000的时候做测试
这是很久以前的测试,这就是为什么我只在循环中使用变量。
这是很久以前的测试,所以我只在循环中使用变量。
给我看一个带有代码的测试
给我看看测试的代码
什么测试? ))
你自己展示了循环条件的两种变体。
伊戈尔也给出了上面的代码。
只要用size变量和循环条件中的ArraySize() 来衡量循环的执行。