帆布与标签 - 页 13

 
Nikolai Semko:

啊,好吧,那么它根本就是正常的。
我的GIF上也有一个画布,它是占用资源最少的面板,因为我不需要经常重绘它,抓住新条的瞬间。

很好!一切都在飞翔!

而在低速时,它的更新没有跳过一拍。
 
Dmitry Fedoseev:
找到了正确的文件。看数字的地方、地点和时间都不清楚,但即使不看,也能看出画布的速度要慢得多,而且不只是画布,而是一个画布,而不是一串标签。

运行专家CanvasVsLabels.mq5,选择显示类型outType,启用limit_fps,设置,nIterations,默认为10000。这就足够了,你不需要改变它。那么结果将与这里提出的类似 https://www.mql5.com/ru/forum/364640/page11#comment_21301589。

现在是结果。 最小延迟、中间延迟最大延迟 分别是一次运行的最小平均和 最大 延迟。总数,是总的nIterations 次数的总时间。

再一次,这里有一个比较结果 的表格

帆布无限制的帧数 帆布有限的fps 标签无限制的fps 标签有限的fps
最小延迟(μs) 1530 1 18 0
中间延迟(μs) 7674 4086 48 7
最大延迟(μs) 11967 11093 785 286
共计(μs) 77727510 29452299 39648984 27439654


完全相同的测量可以在测试器中进行,因为测试器的设计就是这样的。但我还没有做这些事。等我有空闲时间的时候再做吧。我计划在未来尝试使用许多BitmabLabels的显示方式。

 

关于交易、自动交易系统和策略测试的论坛

帆布与标签

fxsaber, 2021.03.13 19:26

只有我一个人有这样的结果?

fxsaber:

拿走了15-20%。显然,我的显卡太慢了。

结果发现ResourceReadImage的速度非常慢。摆脱了它--得到了零负荷。

 

我再次公布对比表,但这次是用直方图。

帆布无限制的帧数 帆布有限的fps 标签无限制的fps 标签有限的fps
最小延迟(μs) 1530 1 18 0
中间延迟(μs) 7674 4086 48 7
最大延迟(μs) 11967 11093 785 286
共计(μs) 77727510 29452299 39648984 27439654


每道工序的平均延迟值比较

中段延迟

由于某些原因,这与总运行时间(Total)没有可比性......

总运行时间的比较

共计

测量结果显示,基于Canvas的有限FPS显示(Canvas unlimited FPS)比基于Labels的有限FPS 显示(Labels unlimited FPS)稍慢。但一般来说,它们都适用于显示来自高负荷进程的信息。

如何运行专家顾问来进行测量

输入参数

  1. 从画布或标签下拉列表中选择outType
  2. 设置limit_fps 开启或关闭。
  3. 确认您的选择
  4. 按 "开始"按钮,开始在图表中进行测量

开始测量

以同样的方式,专家顾问可以在视觉测试器中进行测量。然而,日期范围应该在测试器设置中设置,以便在历史中至少有与输入参数nIterations 的值一样多的条形。

更多信息以及来源,可以在图表显示库的描述中找到:https://www.mql5.com/ru/code/33898

专门为测量而修改的库:https://www.mql5.com/ru/code/download/33898/chartdisplay.mqh

测量的通用专家:https://www.mql5.com/ru/code/download/33898/canvasvslabels.mq5

更多细节见KB:https://www.mql5.com/ru/code/33898


我想补充更多正确的测量结果,在本主题的第一篇文章中使用新的专家顾问。因为目前存在的那些测量结果是不正确的。但不幸的是,第一条信息不能再被编辑了。我请版主在开始时增加更多正确的测量方法, 并将现在的测量方法 标记为不相关。

Дисплей с оптимизацией для вывода текста в чарт по типу консоли
Дисплей с оптимизацией для вывода текста в чарт по типу консоли
  • www.mql5.com
Данная библиотека позволяет создавать дисплеи для удобного вывода текстовой информации в чарт с наиболее оптимальной скоростью
 
fxsaber:

事实证明,ResourceReadImage非常慢。摆脱了它--零负荷。

真的吗?
给我的惊喜。
比复制一个相同大小的普通uint数组慢多少?
 
Mihail Matkovskij:

运行专家CanvasVsLabels.mq5...

这有什么意义?我现在不想钻研代码。这些数值是如何计算的?如果你在测试器中进行测试,你应该测量运行的总时间,而不是其他,但不应该测量单个代码片段的性能。在极端的情况下,不要算上inite。看吧,不用测量,你就可以看到,坎布的速度比较慢。我不知道,也许我有某种反常现象......

 
Nikolai Semko:
真的吗?
给我的惊喜。
比复制同样大小的普通uint数组要慢多少?

呼叫时大约有15%的负荷,不呼叫时则为零。

 
Dmitry Fedoseev:

这有什么意义?我现在不想钻研代码。这些数字是如何计算的?如果你在测试器中这样测试,你应该测量运行的总时间,而不是其他,而不是单独的代码片段的性能。在极端的情况下,不要算上inite。看吧,不用测量,你就可以看到,坎布的速度比较慢。我不知道,也许我有某种反常现象......

我不想钻研代码。我也不想相信我的话。:)我不知道该如何向你解释。从头到尾告诉你我是如何写出所有的代码...那将是一整篇文章。:)

而且,关于专家如何进行测量,根本没有什么可理解的。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void run() {
  MqlRates rates[];
  int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
  ulong start, min, mid, max;
  ulong last, delay; 
  static ulong totalDelays = 0;
  static int nTick = 0;
  ulong first;
  if (!triggerBtn.State())
    return;
  start = GetMicrosecondCount();
  min = INT_MAX; mid = 0; max = 0;
  if (CopyRates(NULL, PERIOD_CURRENT, 0, nIterations, rates) != nIterations) {
    triggerBtn.State(false);
    triggerBtn.setText("Start");
    Print("Not enough quotes!");
    Comment("Not enough quotes!");
    return;
  }
  for (int i = nIterations - 1; i >= 0 && triggerBtn.State(); i--) {
    first = GetMicrosecondCount();
    
    display.push();
    display.setText(concatenate(i));
    display.update();
    
    last = GetMicrosecondCount();
    delay = last - first;
    if (delay < min)
      min = delay;
    if (delay > max)
      max = delay;
    nTick++;
    totalDelays += delay;
    mid = totalDelays / nTick;
    Comment("Min delay: " + (string)min + " μs\n"
            "Mid delay: " + (string)mid + " μs\n"
            "Max delay: " + (string)max + " μs\n"
            "Total: " + (string)(GetMicrosecondCount() - start) + " μs" + " \n"
            "Completed: " + (string)(int)(100.0 / nIterations * (nIterations - i)) + "%");
  }
  
  printf("Min delay: %d μs", min);
  printf("Mid delay: %d μs", mid);
  printf("Max delay: %d μs", max);
  printf("Total: %d μs", GetMicrosecondCount() - start);
  triggerBtn.State(false);
  triggerBtn.setText("Start");
  ChartRedraw();
}
总数在循环结束时计算,最小、中间和最大在循环的主体中,在display.push、display.setText和display.update之后。没有什么复杂的,如果你坐下来好好看看所有的东西,你至少可以拿到Kanvas和Labels的源代码。顺便说一下,那里也没有什么复杂的东西。除了Kanvas中绘制贝塞尔曲线 等的方法。
 
Dmitry Fedoseev:

而在这里,如果不进行测量,你可以看到,坎布的速度比较慢。我不知道,也许我有某种反常现象......

你需要告诉我,Kanvas在什么输入参数下会很慢。如果limit_fps: false,那么很明显...:)

 
fxsaber:

事实证明,ResourceReadImage非常慢。摆脱了它,得到了零负荷。

如果你从编译时保存的资源中读取,你必须做一次。

资源在编译时被压缩。