MQL5中的OOP问题 - 页 71 1...646566676869707172737475767778...96 新评论 Vladimir Simakov 2020.05.31 17:20 #701 Igor Makanu: 如果你写了这样的类。 根据你的研究判断,如果你在计算中频繁使用结构字段,B类的 执行速度会比较慢? 所以,我们讨论的是遍历一个对象数组的时间)) 根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段是先走的,所以,数据字段会被移位,也就是在取消引用的时候进行额外的计算。 Igor Makanu 2020.05.31 17:36 #702 Vladimir Simakov: 所以,我们讨论的是遍历对象阵列的时间))) 根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段,这两个字段先走,所以,数据字段会被移位,也就是在取消引用的过程中进行额外的计算。 谢谢你,这很有帮助! Alexey Navoykov 2020.05.31 18:00 #703 Vladimir Simakov: 所以,我们讨论的是遍历对象阵列的时间))) 根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别:有两个隐含的字段是先走的,所以数据字段会被访问到一个偏移量,也就是说,会进行额外的解引用计算。 这两个班级都很相似。在这两种情况下,访问都是通过偏移,只是不是相对于结构的开始,而是相对于类的开始。 换句话说,结构本身是没有重量的。 只有类产生了开销。 fxsaber 2020.05.31 18:06 #704 Vladimir Simakov: 所以,没有神秘主义--物理学规律在起作用。 它不符合 "物理学定律"。 #include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh long f1( const int Size, const long Amount = 5 e9 ) { long Sum = 0; for (long i = 0; i < Amount; i++) { Sum += Size * i; Sum |= 1; } return(Sum); } long f2( const int Size, const long Amount = 5 e9 ) { long Sum = 0; for (long i = 0; i < Amount; i++) { Sum += Size * (Amount - i); Sum |= 1; } return(Sum); } void OnStart() { Print(_B(f1(2), 1)); Print(_B(f1(200), 1)); Print(_B(f2(2), 1)); Print(_B(f2(200), 1)); } Alert: Time[Test6.mq5 267: f1(2)] = 3252 ms. 6553255921290448385 Alert: Time[Test6.mq5 268: f1(200)] = 4602 ms. -8757194524499019775 Alert: Time[Test6.mq5 270: f2(2)] = 3061 ms. 6553255931290448385 Alert: Time[Test6.mq5 271: f2(200)] = 3112 ms. -8757193524499019775 这是一个自相矛盾的结果。更为复杂的计算会以1.5倍的速度进行,并且不取决于大小。 Roman 2020.05.31 18:14 #705 Vladimir Simakov: 所以,我们在讨论对象数组的遍历时间)))) 根据你的例子,在pluses中是一样的,但是在mql中有一个细微的差别--有两个隐含的字段在前面,所以数据字段将以一个偏移量被访问,也就是说,将进行额外的解引用计算。 感谢Vladimir对汇编器的研究。 而正如Alexey所建议的,开销是由类创造的。 由此我们可以得出结论,如果你可以不使用类,那么最好用程序化风格来写代码。 也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你处理的是ticks,比如说,你最好直接使用它,而不使用包装器。 原则上,这是我遵循的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。 Sergey Dzyublik 2020.05.31 19:05 #706 Roman: 谢谢弗拉基米尔的集会研究。 而正如阿列克谢所建议的,开销创造了阶级。 由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。 也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。 原则上,这是我一直遵循的方法,而且经常在找到一个类的例子后,用程序化的方法拆解其方法。 论坛上有一个巨魔... 我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了? Sergey Dzyublik 2020.05.31 19:19 #707 关于交易、自动交易系统和策略测试的论坛 MQL5中的OOP问题 fxsaber, 2020.05.30 14:06 我不知道该如何处理它。我已经做了简单的结构。 50000000 50000000 Alert: Time[Test6.mq5 280: Func(Array1)] = 312 ms. 1333106752 Alert: Time[Test6.mq5 281: Func(Array3)] = 1348 ms. 1333106752 : sizeof(STRUCT1) = 20 : sizeof(STRUCT3) = 84 我不清楚为什么对一个简单结构的第一个字段的访问取决于其大小。 你在一个数组中使用50M的元素。 对于大小为20和84字节的结构,这分别是0.93GB和3.91GB的数据。 而在你的计算框架中,据推测,所有这些内存都要通过处理器的缓存。 而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。 C++测试的结果如何? 因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼? Roman 2020.05.31 19:30 #708 Sergey Dzyublik: 论坛上有一个巨魔... 我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了? 你应该注意自己,而不是别人。 答案是:不是你,也不是为了你。 在沉默中忽略))。 Vladimir Simakov 2020.05.31 19:31 #709 Sergey Dzyublik: 你在一个数组中使用50M的元素。 对于20和84字节的结构,这分别是0.93GB和3.91GB的数据。 而作为你计算的一部分,推测所有这些内存都会经过处理器的缓存。 而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。 C++测试的结果如何? 因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼? 它以同样的方式运作。它只是快了一点,但比例是一样的,所以它是硬件。 Dmitry Fedoseev 2020.06.01 10:27 #710 Roman:谢谢弗拉基米尔的集会研究。 而正如阿列克谢所建议的,开销创造了阶级。 由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。 也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。 原则上,这是我采取的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。 你可以用一个结构来代替一个类,它们都很好。 1...646566676869707172737475767778...96 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如果你写了这样的类。
根据你的研究判断,如果你在计算中频繁使用结构字段,B类的 执行速度会比较慢?
所以,我们讨论的是遍历一个对象数组的时间))
根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段是先走的,所以,数据字段会被移位,也就是在取消引用的时候进行额外的计算。
所以,我们讨论的是遍历对象阵列的时间)))
根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别,有两个隐含的字段,这两个字段先走,所以,数据字段会被移位,也就是在取消引用的过程中进行额外的计算。
谢谢你,这很有帮助!
所以,我们讨论的是遍历对象阵列的时间)))
根据你的例子,这在pluses中是一样的,但是在mql中,有一个细微的差别:有两个隐含的字段是先走的,所以数据字段会被访问到一个偏移量,也就是说,会进行额外的解引用计算。
所以,没有神秘主义--物理学规律在起作用。
它不符合 "物理学定律"。
这是一个自相矛盾的结果。更为复杂的计算会以1.5倍的速度进行,并且不取决于大小。
所以,我们在讨论对象数组的遍历时间))))
根据你的例子,在pluses中是一样的,但是在mql中有一个细微的差别--有两个隐含的字段在前面,所以数据字段将以一个偏移量被访问,也就是说,将进行额外的解引用计算。
感谢Vladimir对汇编器的研究。
而正如Alexey所建议的,开销是由类创造的。
由此我们可以得出结论,如果你可以不使用类,那么最好用程序化风格来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你处理的是ticks,比如说,你最好直接使用它,而不使用包装器。
原则上,这是我遵循的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。
谢谢弗拉基米尔的集会研究。
而正如阿列克谢所建议的,开销创造了阶级。
由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。
原则上,这是我一直遵循的方法,而且经常在找到一个类的例子后,用程序化的方法拆解其方法。
论坛上有一个巨魔...
我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了?
关于交易、自动交易系统和策略测试的论坛
MQL5中的OOP问题
fxsaber, 2020.05.30 14:06
我不知道该如何处理它。我已经做了简单的结构。
我不清楚为什么对一个简单结构的第一个字段的访问取决于其大小。
对于大小为20和84字节的结构,这分别是0.93GB和3.91GB的数据。
而在你的计算框架中,据推测,所有这些内存都要通过处理器的缓存。
而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。
C++测试的结果如何?
因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼?
论坛上有一个巨魔...
我以前不明白为什么有些用户要求使用忽略功能,啊,现在怎么不见了?
你应该注意自己,而不是别人。
答案是:不是你,也不是为了你。
在沉默中忽略))。
对于20和84字节的结构,这分别是0.93GB和3.91GB的数据。
而作为你计算的一部分,推测所有这些内存都会经过处理器的缓存。
而对这些结果的一个非常合理的解释是,0.93GB的数据从内存下载到CPU缓存的速度比3.91GB的数据快四倍。
C++测试的结果如何?
因为我看到了汇编代码,但没有测试结果,还是我看得很不顺眼?
谢谢弗拉基米尔的集会研究。
而正如阿列克谢所建议的,开销创造了阶级。
由此我们可以得出结论,如果我们可以不使用类,最好是用程序化的方式来写代码。
也就是说,如果任务不需要速度,你可以把它包装在一个类中,但如果你要处理的是ticks,比如说,你最好直接写,不要用包装器。
原则上,这是我采取的方法,经常找到一个类的例子,我以程序化的方式拆解其方法。
你可以用一个结构来代替一个类,它们都很好。