错误、漏洞、问题 - 页 2315

 
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

在不明显的范围内交替出现(+/-)。

 
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
 
Nikolai Semko:

我想在KB上写上等级,但没有成功。而从最近的出版物根本没有成绩这一事实来看,似乎我不是唯一有这个问题的人。

是的,这没有用。

 
fxsaber:
我的ref和val循环的代码是一样的(比较起来差不多是正确的),但你的是不同的
 
A100:
在我的循环中,ref和val有相同的代码(比较起来多少是正确的),而你的则不同

是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快?

 
fxsaber:

是的,不同。但这个问题仍然有效。为什么val-variant明显比ref快?

也许ref变体被编译器优化得更少--谁知道呢。

在我看来,这两种变体都应该编译出几乎相同的代码,甚至完全相同的代码,但编译器的处理方式不同

 
TheXpert:

也许ref变体被编译器优化得更差--谁知道呢。

在我看来,两者应该编译出大致相同的代码,甚至完全相同,但编译器的想法却不同

这个问题实际上是针对开发商的,这样一来,差异的原因就有了依据。

通常情况下,我试图通过引用来传递一切,以提高速度。而这在某些建筑中是合理的。但现在在我看来。

 
Alexey Kozitsyn:

+1.有些东西似乎坏了。Bild 1881 x64。赢10。在启动时,CPU加载了20%以上(i5 8600k),内存加载了650-700MB(没有增加)。

任务管理器显示 "未响应 "状态。

而另一个终端1881(不是Opening)运行良好。

已添加。

最终,它确实启动了。然而,它花了极长的时间来启动--这是不正常的。然后我关闭了终端,再次打开它。瞬间就打开了。显然,数据加载出现了一些问题。

解决办法是重新安装终端。我不小心把装有所有设置和图表的文件夹拿出来了)我又把所有东西画了一遍,但现在工作得很顺利。
 
reztor:
解决办法是重新安装终端。我还不小心删除了装有所有设置和图表的文件夹)我又画了一遍,但现在工作得很顺利。

这是不需要的。你可以简单地删除 news.dat文件

 
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

和不同的代码...和时间上的差异差不多,但代码和函数本身是完全一样的