错误、漏洞、问题 - 页 2315 1...230823092310231123122313231423152316231723182319232023212322...3184 新评论 A100 2018.10.29 02:58 #23141 fxsaber: 为什么by_ref比by_val慢?它从何而来? 如果代码是一样的 //Test.mqh int by_ref(string& var) { return int(var) % 100; } int by_val(string var) { return int(var) % 100; } //Test.mq5 #include "Test.mqh" #define ITERATIONS 1000000 #define MACRO( X ) \ { \ ulong time = GetMicrosecondCount(); \ for(int i=0; i<ITERATIONS; i++) \ { \ string r = string( rand ); \ sum_##X += by_##X(r); \ } \ time_##X = GetMicrosecondCount() - time; \ } void OnStart() { for ( int i = 0; i < 10; i++ ) OnStart2( rand()); } void OnStart2( int rand ) { long time_ref, sum_ref = 0; long time_val, sum_val = 0; MACRO( ref ) MACRO( val ) printf( "%+10.3f:%d", (time_ref-time_val)/1000.0, sum_ref-sum_val ); }结果也是如此(执行时间差)。 +12.221:0+5.099:0+0.149:0-13.729:0+14.531:0-27.429:0+26.405:0-0.839:0+5.400:0-4.882:0 在不明显的范围内交替出现(+/-)。 fxsaber 2018.10.29 06:36 #23142 A100:它是从哪里来的? #define ITERATIONS 1000000 void OnStart() { string Str = "1"; for (int i = 0; i < 10; i++) Str += Str; for (int j = 0; j < 5; j++) { { ulong time = GetMicrosecondCount(); ulong sum = 0; for(int i=0; i<ITERATIONS; i++){ string r = string(rand()) + Str; sum += by_ref(r); } time = GetMicrosecondCount() - time; printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum); }{ ulong time = GetMicrosecondCount(); ulong sum = 0; for(int i=0; i<ITERATIONS; i++) sum += by_val(string(rand()) + Str); time = GetMicrosecondCount() - time; printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum); } Print(""); } } //+------------------------------------------------------------------+ int by_ref(string &var){ return int(var) % 100; } int by_val(string var){ return int(var) % 100; } by_ref took 15119.806 milliseconds: sum=-1000000 ll by_val took 13872.479 milliseconds: sum=-1000000 ll by_ref took 14433.781 milliseconds: sum=-1000000 ll by_val took 13817.533 milliseconds: sum=-1000000 ll by_ref took 13889.424 milliseconds: sum=-1000000 ll by_val took 14135.603 milliseconds: sum=-1000000 ll by_ref took 16047.643 milliseconds: sum=-1000000 ll by_val took 14494.432 milliseconds: sum=-1000000 ll by_ref took 15542.276 milliseconds: sum=-1000000 ll by_val took 13843.121 milliseconds: sum=-1000000 ll fxsaber 2018.10.29 08:58 #23143 Nikolai Semko:我想在KB上写上等级,但没有成功。而从最近的出版物根本没有成绩这一事实来看,似乎我不是唯一有这个问题的人。是的,这没有用。 A100 2018.10.29 09:18 #23144 fxsaber: 我的ref和val循环的代码是一样的(比较起来差不多是正确的),但你的是不同的 fxsaber 2018.10.29 09:24 #23145 A100: 在我的循环中,ref和val有相同的代码(比较起来多少是正确的),而你的则不同是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快? TheXpert 2018.10.29 09:39 #23146 fxsaber:是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快?也许ref变体被编译器优化得更少--谁知道呢。 在我看来,这两种变体都应该编译出几乎相同的代码,甚至完全相同的代码,但编译器的处理方式不同 fxsaber 2018.10.29 09:44 #23147 TheXpert:也许ref变体被编译器优化得更差--谁知道呢。 在我看来,两者应该编译出大致相同的代码,甚至完全相同,但编译器的想法却不同这个问题实际上是针对开发商的,这样一来,差异的原因就有了依据。 通常情况下,我试图通过引用来传递一切,以提高速度。而这在某些建筑中是合理的。但现在在我看来。 reztor 2018.10.29 14:44 #23148 Alexey Kozitsyn:+1.有些东西似乎坏了。Bild 1881 x64。赢10。在启动时,CPU加载了20%以上(i5 8600k),内存加载了650-700MB(没有增加)。 任务管理器显示 "未响应 "状态。 而另一个终端1881(不是Opening)运行良好。 已添加。 最终,它确实启动了。然而,它花了极长的时间来启动--这是不正常的。然后我关闭了终端,再次打开它。瞬间就打开了。显然,数据加载出现了一些问题。 解决办法是重新安装终端。我不小心把装有所有设置和图表的文件夹拿出来了)我又把所有东西画了一遍,但现在工作得很顺利。 [删除] 2018.10.29 14:51 #23149 reztor: 解决办法是重新安装终端。我还不小心删除了装有所有设置和图表的文件夹)我又画了一遍,但现在工作得很顺利。这是不需要的。你可以简单地删除 news.dat文件。 A100 2018.10.29 16:19 #23150 TheXpert:也许Ref变体被编译器优化得更差--谁知道呢? 在我看来,这两个选项应该可以编译出大致相同的代码,甚至是完全相同的代码,但编译器的计算方式不同最后的代码和它的执行时间之间有什么联系? 例如,让我们改变... 这样一来,这些循环就变得绝对相同了 #define ITERATIONS 1000000 void OnStart() { string Str = "1"; for (int i = 0; i < 10; i++) Str += Str; for (int j = 0; j < 5; j++) { { ulong time = GetMicrosecondCount(); ulong sum = 0; for(int i=0; i<ITERATIONS; i++) sum += by_ref(string(rand()) + Str); time = GetMicrosecondCount() - time; printf("%s took %.3f milliseconds: sum=%dll", "by_ref", time/1000.0, sum); } { ulong time = GetMicrosecondCount(); ulong sum = 0; for(int i=0; i<ITERATIONS; i++) sum += by_val(string(rand()) + Str); time = GetMicrosecondCount() - time; printf("%s took %.3f milliseconds: sum=%dll", "by_val", time/1000.0, sum); } Print(""); } } int by_ref(string var){ return int(var) % 100; } int by_val(string var){ return int(var) % 100; } 其结果是..: by_ref花了18354.547毫秒: sum=1865600ll by_val花了18318.319毫秒: sum=1861628ll by_ref花了18416.747毫秒: sum=1904488ll by_val花了18221.978毫秒: sum=1907860ll by_ref花了18301.009毫秒: sum=1757988ll by_val花了18545.258毫秒: sum=1949720ll by_ref花了18373.648 毫秒: sum=1867160ll by_val花了17972.432 毫秒: sum=1760308ll by_ref花了19426.076 毫秒: sum=1795564ll by_val花了19177.485 毫秒: sum=1826360ll 是差不多的...还是你认为编译器在同一个循环中创建了不同的代码? 让我提醒你--有 这样的事情 by_ref花了13889.424 毫秒: sum=-1000000ll by_val花了14135.603 毫秒: sum=-1000000ll 和不同的代码...和时间上的差异差不多,但代码和函数本身是完全一样的 Errors, bugs, questions 1...230823092310231123122313231423152316231723182319232023212322...3184 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
为什么by_ref比by_val慢?
它从何而来?
如果代码是一样的
结果也是如此(执行时间差)。
+12.221:0
+5.099:0
+0.149:0
-13.729:0
+14.531:0
-27.429:0
+26.405:0
-0.839:0
+5.400:0
-4.882:0
在不明显的范围内交替出现(+/-)。
它是从哪里来的?
我想在KB上写上等级,但没有成功。而从最近的出版物根本没有成绩这一事实来看,似乎我不是唯一有这个问题的人。
是的,这没有用。
在我的循环中,ref和val有相同的代码(比较起来多少是正确的),而你的则不同
是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快?
是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快?
也许ref变体被编译器优化得更少--谁知道呢。
在我看来,这两种变体都应该编译出几乎相同的代码,甚至完全相同的代码,但编译器的处理方式不同
也许ref变体被编译器优化得更差--谁知道呢。
在我看来,两者应该编译出大致相同的代码,甚至完全相同,但编译器的想法却不同
这个问题实际上是针对开发商的,这样一来,差异的原因就有了依据。
通常情况下,我试图通过引用来传递一切,以提高速度。而这在某些建筑中是合理的。但现在在我看来。
+1.有些东西似乎坏了。Bild 1881 x64。赢10。在启动时,CPU加载了20%以上(i5 8600k),内存加载了650-700MB(没有增加)。
任务管理器显示 "未响应 "状态。
而另一个终端1881(不是Opening)运行良好。
已添加。
最终,它确实启动了。然而,它花了极长的时间来启动--这是不正常的。然后我关闭了终端,再次打开它。瞬间就打开了。显然,数据加载出现了一些问题。
解决办法是重新安装终端。我还不小心删除了装有所有设置和图表的文件夹)我又画了一遍,但现在工作得很顺利。
这是不需要的。你可以简单地删除 news.dat文件。
也许Ref变体被编译器优化得更差--谁知道呢?
在我看来,这两个选项应该可以编译出大致相同的代码,甚至是完全相同的代码,但编译器的计算方式不同
最后的代码和它的执行时间之间有什么联系?
例如,让我们改变... 这样一来,这些循环就变得绝对相同了
其结果是..:
by_ref花了18354.547毫秒: sum=1865600ll
by_val花了18318.319毫秒: sum=1861628ll
by_ref花了18416.747毫秒: sum=1904488ll
by_val花了18221.978毫秒: sum=1907860ll
by_ref花了18301.009毫秒: sum=1757988ll
by_val花了18545.258毫秒: sum=1949720ll
by_ref花了18373.648 毫秒: sum=1867160ll
by_val花了17972.432 毫秒: sum=1760308ll
by_ref花了19426.076 毫秒: sum=1795564ll
by_val花了19177.485 毫秒: sum=1826360ll
是差不多的...还是你认为编译器在同一个循环中创建了不同的代码?
让我提醒你--有 这样的事情
by_ref花了13889.424 毫秒: sum=-1000000ll
by_val花了14135.603 毫秒: sum=-1000000ll
和不同的代码...和时间上的差异差不多,但代码和函数本身是完全一样的