错误、漏洞、问题 - 页 1573

 
Anton Zverev:

一个100Kb的源码项目在1325构建中不到一秒钟就能编译完毕。坚实的OOP,大量的虚拟函数 和重载,模板,指针,const修改器(尽可能)。没有DLL和OpenCL。

我想找出你滞后的原因。也许这就是帮助编译器快速优化的结构。我从来没有遇到过滞后的情况。请给我提供kodobase的源代码,它正在减慢速度。

好吧,100Kb太多,不是吗? 我有差不多1Mb。 所有你有的东西都在这里,加上很多宏。除了const不是到处都设置的。 但这并不是造成如此疯狂的滞后的原因,尤其是在build 1159中,所有的东西几乎都是即时编译的。

我无法在Build 1325中进行测试,因为项目根本无法编译,而且出现了一大堆bug,都是在晚上出现的。 A100同志也报告了新Build中的一大堆bug。 我没有兴趣把时间浪费在探究这些bug上,我会等到他们发布工作Build。

这就是为什么我告诉你1241版本的滞后性。 如果你有机会测试它,试着与最新的版本进行比较。 但我怀疑新的版本能明显加快速度。恰恰相反,MT开发者并不真正关心编译速度,他们只想在运行时间中挤出额外的纳秒,以便在市场上宣称MQL程序的速度可以与C++相媲美(尽管只是在抽象的例子上)。据我所知,他们并不关心优化效率,也就是说,游戏是否值得花费。

我会尝试在代码库中搜索源代码,但不一定能找到类似的代码。 这一定是个大项目,而那里大多是公开的小项目。

 
Renat Fatkhullin:

他可能有以文本卷轴形式存在的巨大功能。

优化器必须对这样的代码片段进行大量的处理,一遍又一遍地改进代码。对于优化器来说,减少函数的大小就足以大幅提高速度。

好吧,你必须切换到最新的构建,因为我们正在不断提高其中的质量和速度。

没有巨大的函数。最多只有150行(或被认为是巨大的? 如果你这样想,为什么一个函数的大小与编译器尝试一堆小函数有关? 让我们假设它把大函数过了10次。所以我把它分解成5个小的,每个都要经过2次。 我们得到的结果是一样的。 所以,整个代码量是很重要的,对吗? 但是,即使在分解大的函数时,结果加快了一些,那又怎么样呢? 我们在谈论的是10(!)倍慢的编译。

很明显,你想尽可能地加快程序的执行 速度,所以你做了大量的传递,试图改善一些东西。 而你越是把语言复杂化,这些传递就越长,这将消耗程序员的时间。还有一个自然的问题是关于所有这些的效率。 与程序员等待优化完成的空闲时间相比,你的优化使程序的速度提高了多少?

当然,你可以尝试寻找一些折中的办法,但是像我上面写的那样,做不同的编译模式会更有效率。 带有所有优化的程序发布只有在最后才需要--99%的程序员的时间都花在编写和调试代码上,而他们根本就不需要你的优化。

 
Alexey Navoykov:

每次构建更新后,代码停止编译,这将持续多久!即使它们被编译,它们的工作方式也与以前不同(这更糟糕)。 谁需要这样一种编程语言?

...

我不知道你是什么意思。我在MQL中有几个非常复杂的项目,有超过20000行的代码。新的构建可能在任何时候都会被编译出来。在整个期间,只有两个问题。一次是因为我的错误,另一次是由于开发商的错误。
 
Alexey Navoykov:

最多150行

这是一个非常大的、不正确的功能。
 
Vasiliy Sokolov:
我不知道你是什么意思。我有几个非常复杂的MQL项目,代码大小超过20000行。新的构建在任何时候都会被编译出来。在整个期间,只有两个问题。一次是因为我的错误,另一次是由于开发商的错误。

好吧,那么你很幸运。你的代码中没有我代码中的任何结构,这有什么好奇怪的?

翻开上面的人几页,在那里他也抓到了新构建中的很多bug,其中有些是很难抓到的。 你认为他是故意在找这些东西吗?

 
Alexey Navoykov:

好吧,那么你很幸运。你的代码中没有我代码中的任何结构,这有什么好奇怪的?

翻开上面的几页,那里的人也抓到了新构建中的一堆bug,其中有些是很难抓到的。 你认为他是故意找的吗?

请展示一个可重玩的刹车的例子。

不幸的是,到目前为止,你正在发表未经证实的声明,包括对开发者的直接攻击。


你对函数的大小和程序的整体大小的看法是错误的。由于语法树的增加和多通道优化,单个函数的大小直接和非线性地影响到每个特定函数的优化。较小的功能在飞行中被优化。

 
Alexey Navoykov:

好吧,那么你很幸运。你的代码中没有我代码中的任何结构,这有什么好奇怪的?

翻开上面几页,那里的人也抓到了新造的一堆虫子,其中有些是很难抓到的。 你认为他是故意在找这些东西吗?

1)我想知道你用了什么结构,我的代码中没有这些结构。我的代码大小有好几千行,而你的构造却不存在?当然,它一定是超级独特的东西?

2)实际上,在之前的构建中,有一个内部编译器错误,当类之间相互链接时就会发生。这是开发人员的一个错误,但他们修复了它。我想不起还有什么其他错误。

 
Vasiliy Sokolov:

2)事实上,之前的构建实际上有一个内部编译器错误,当类之间相互链接时就会出现。这是开发团队的一个错误,但它被修复了。我想不起还有什么其他错误。

https://www.mql5.com/ru/forum/1111/page1591#comment_2463820

而班级之间的相互联系又在哪里呢?

我在这里把它简化得更多,以方便你搜索相互的参考资料,了解你没有使用的构造

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров
附加的文件:
Test114.mq5  2 kb
 
A100:

https://www.mql5.com/ru/forum/1111/page1591#comment_2463820

而这里的阶级之间的相互参照在哪里?

在此,我将其进一步简化,以方便你搜索相互参照,并了解你没有使用哪些结构。

你在做逆向工程。这项工作对改进编译器很有帮助,但在实际编程方面却不适用。我不知道有哪个程序员会在实践中使用你所引用的代码。

//+------------------------------------------------------------------+
//|                                                      Test116.mq5 |
//|                                                                  |
//+------------------------------------------------------------------+
bool is( const string type, bool )
{
        return ( type == "1" || type == "2" || type == "3" || type == NULL );
}
bool _is( string type ) { return is( type, false ); }
//+------------------------------------------------------------------+
template<typename T>
bool __is( T ) { return _is( typename( T )); }
//+------------------------------------------------------------------+
#define  IS( T )         __is( T(0))
//+------------------------------------------------------------------+
template<typename T>
int sh( T t )
{
        T tt = 0x1;
        for ( int i = 0; i < 4; i++, tt <<= 1 )
                if ( (t & tt) == tt )
                        return i;
        return -1;
}
//+------------------------------------------------------------------+
class D { public:
template<typename T1, typename T2>                                     
                        T2                              g( T1 t1, T2, int sh = -1 ); 
};                                                                     
template<typename T1, typename T2>                                     
T2 D::g( T1 t1, T2, int sh )
{                                                                      
        sh = sh( t1 );                                   
        T2 t2 = T2(t1) >> 1;
        return (sh( t1 ) & sh) == sh( t1 ) && IS( T2 ) ? 1 : 0;
}                                                                      
//+------------------------------------------------------------------+
class M : public D {
        virtual void f1() { g( 0, 0 ); }
};
//+------------------------------------------------------------------+
class A {};
void g( A* ) export {}
class B { public:
        void h() { A a; g( &a ); }
};
class C { public:
        void f() {}
};
void OnStart()
{
        C c;
        c.f();
}
//+------------------------------------------------------------------+
 
Renat Fatkhullin:

请示范一个可重复的刹车的例子。

不幸的是,到目前为止,你正在发表未经证实的声明,包括直接攻击开发者...

我告诉你,这是一个大项目,所有源代码的总大小约为1Mb。 你怎么能演示刹车? 发送所有的代码还是什么? 你明白这是不可能的。 而单个片段的编译,当然会更快。

你说的 "未经证实的说法 "是什么意思? 你的优化编译器要慢得多? 而且你对它不太关心? 这里有什么未经证实的?

这里有一个链接,是去年10月的讨论,当时你刚刚介绍了这个全球优化:https://www.mql5.com/ru/forum/1111/page1424#comment_1981722

这名男子写道。

另一个代码--注意时间--它肯定已经上升了20倍

然后你回应。

这是MQL5的一个新的优化编译器(MQL4中没有)。

你必须为更好的目标代码和更长的编译时间付费。

然后还有几个人,包括我自己,也抱怨编译速度慢。 但是你的回答似乎表明,你只关心 "更好的目标代码质量 "和一些神话般的 "2到10倍的速度提升",尽管我在实际工作的项目中没有看到这样的速度提升。

正如我在上面所说的,我没能在最新的版本(4月22日)上进行测试,因为我在编译过程中遇到了一些错误。 但我认为编译速度在那里是一样慢的,因为你从未宣布在新版本中对编译器进行加速。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 评论: 2
  • www.mql5.com
Форум трейдеров