错误、漏洞、问题 - 页 816

 
在我看来,这只是对直接访问 对象成员 的第一种情况的优化。

在第二种情况下,有通过引用的间接访问,在一个微观的循环体中,这自然需要一半的时间,使其翻倍。
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
这个测试有些不正确,基本上是比较一条汇编指令和两条汇编指令放在一亿个循环中的区别。
 
Renat:
我认为这只是对直接访问 对象成员 的第一种情况的优化。

在第二种情况下,我们通过参照物进行间接访问,这自然需要一半的时间,而微观的循环体将其增加了两倍。

雷纳特,在现实中,有大量的数据数组被处理。我已经简化了这个测试,只是为了说明问题所在。 最初我使用自己的数组和类来创建它。然后我把它简化为一个方案。

也就是说,我们实际上并不只有一个arr对象,而是一个复杂对象的数组(也是用数组)。

大致上,这可以在方案中写为

class A
{
  double prm1;
  int prm2;
  string prm3;
  char prm4;
}

class B
{
   A m_a[1000];
}

B _b[1000];



我的推理是,如果我得到一个对特定数组元素A的引用

А *item=GetPointer(_b[i]._a[j]);

使用参数 A::prmX 的工作会更快。


但事实证明,从数组名称中拉出一根香肠

_b[i]._a[j].prmX  

将至少比提及一个特定 项目 一倍。

我对此有点吃惊,很明显,内核得到了某种伪指针。

有没有什么方法可以优化速度,至少可以减少速度上的差异?

 
sergeev:

这就是没有错误的情况下的情况

在这个测试中不会有错误。但这种方法并没有解决主要问题:为什么编译器会跳过常量对象引用到非常量引用的转换而不产生任何错误和/或警告?如果是这样的功能,没有问题,但在这种情况下,类方法 签名中的返回类型的const修饰符的意义就失去了。
 
mvk:
在这个测试中,不会出现这样的错误。但是这个方法并没有解决主要的问题:为什么编译器会跳过常量对象引用到非常量引用的转换,并且没有产生错误和/或警告?如果是这样的功能,没有问题,但在这种情况下,类方法 签名中的返回类型的修饰符const的意义就会消失。

对我来说,一切都很有意义。

常量对象函数不应该改变对象本身,所以它们也应该有一个常量修饰符

以及关于

   //Ошибки нет. Это НЕ правильно(CONST A* B::getA())!
   A* a2 = b.getA();

嗯,是的,这在C++中是行不通的。

写信给servicedesk。

 
sergeev:

事实证明,从数组名称中拉出一根香肠

将比访问一个特定 项目至少 一倍。

它真的更快,还是基于其他更简单的情况,对输出的逻辑构造?

在我看来,一个基于所提出的对多维数组 的访问的干净证明还没有被提出。特别是考虑到坦率的昂贵的附加函数GetPointer的存在。


这让我有点吃惊,而且变得很清楚,在内核中存在着某种伪索引。

传统意义上的指针在MQL5中不存在,它们是句柄,有其所有的后果。


有没有什么方法可以优化速度,至少可以减少速度差异?

我们一直在努力优化,但在引用/句柄的情况下,间接访问有一个系统开销。

无论如何,让我们更仔细地研究一下这种访问的优化。

Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 
Renat:

它真的更快,还是基于其他更简单的案例对结论的逻辑构建?

是的,这是很现实的。我在填充我的数组时测试过,它总是慢两倍。

在我看来,一个基于所提出的多维数组 访问的干净证明还没有被提出。

好了,我已经列出了方案和类A、B和数组的图像。


特别是有了坦率地说是昂贵的附加函数GetPointer。

但原则上,为了进行更准确的测试,你也可以在GetTickCount之外调用它。

在任何情况下,我们将仔细研究优化这种访问。

好的,谢谢,这正是我们需要的。

 
sergeev:

它在进入循环之前被调用一次。但原则上,为了获得更准确的测试,你也可以在GetTickCount之外调用它。

如果代码是这样的,那么在循环之外呢?
А *item=GetPointer(_b[i]._a[j]);
 
一个建议。能否在帮助中加入文字缩放功能,如:+或- ,或Ctrl+鼠标滚轮。
 
paladin800:
一个建议。能否在帮助中包括文本缩放功能。例如,+或- ,或Ctrl+鼠标滚轮。

这可能是不可能的。网上的版本不合适吗?

这是我在互联网上找到的关于这个问题的资料 -http://forum.ru-board.com/topic.cgi?forum=62&topic=20907

UPDate 更多http://forum.ixbt.com/topic.cgi?id=23:39211

Невозможно изменить размер шрифта при просмотре .CHM файлов. :: Microsoft Windows :: Компьютерный форум Ru.Board
  • forum.ru-board.com
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору