mql5语言的特点、微妙之处以及技巧 - 页 153

 
Roffild:

在ArrayReverse的帮助下。

ArraySetAsSeries()函数并没有实际移动数组中的元素,只是将索引方向向后扭转,以安排对元素的访问,就像在一个时间序列中一样。ArrayReverse()函数在物理上移动数组项,使数组被 "反转"。

但这段代码证明了相反的情况。

为什么?这就对了。

如果我们处理一个数组,其编号就像在时间序列中一样,即零条是最新的,最新的是最早的,当一个新的元素被添加时,它将在最新的旁边,即最早的。

而如果数组没有像时间序列那样进行编号,那么零号元素就是最早的,最新的就是最新的。因此,当一个新的元素被添加时,它将在最新的元素旁边。
这就是你的测试中发生的情况。

我不明白这里的证据在哪里。我们如何证明它,并找出数组的起始点在内存中的位置,以及什么增量步长是正还是负。
你只能通过传递数组和使用指针来证明它。
但通过测量执行这一操作所需的时间来证明它更容易。如果一个有100 000 000个项目的数组瞬间 "翻转",很明显没有翻转;对开始的引用改变了,增量改变了它的符号。
我一直在使用ArraySetAsSeries() 函数,我看到它在时间上是绝对免费的。所以你错了。

说实话,我不明白,既然我们有快速的ArraySetAsSeries(),为什么还需要缓慢的ArrayReverse 函数?

 
Roffild:

在ArrayReverse的帮助下。

ArraySetAsSeries()函数并没有实际移动数组中的元素,只是将索引方向向后扭转,以安排对元素的访问,就像在一个时间序列中一样。ArrayReverse()函数在物理上移动数组项,使数组被 "反转"。

但这段代码证明了相反的情况。

你对带有asSeries标志的数组进行了内存重新分配,自然他们已经考虑到了这一点。他们那里一定有这样的东西。

template<typename T>
T* ReAllocArray(T* array, size_t size, size_t newSize, bool asSeries) {
    auto _array = (T*)realloc(array, newSize * sizeof(T));
    if (_array == NULL) throw bad_alloc();
    auto _ptr = _array + size;
    auto ptr = _array + newSize;
    if (asSeries){
        while (_ptr != _array) *(--ptr) = *(--_ptr);
        while (ptr != _array) new(--ptr) T;
    }
    else {
        while (_ptr != ptr) new(_ptr++) T;
    }
    return _array;
}
 
Vladimir Simakov:

你对有asSeries标志的数组进行了内存重新分配,他们当然会考虑到这一点。他们那里一定有这样的东西。

是的,他们一定考虑到了这一点。但这种行为与CopyRates() 并不对应。

无论接收数组有什么属性--as_series=true或as_series=false,数据都会被复制,使时间上最早的元素位于分配给数组的物理内存的开头。

也是为了ArrayCopy()

如果count<0或count>src_size-src_start,则复制数组的整个剩余部分。数组是从左到右复制的。对于串行数组,考虑到从左到右的复制,起始位置被正确覆盖。

最后一句话有点含糊不清。
 

我现在有点震惊。我用Java写了一个测试。事实证明,Java的速度几乎和C一样快,因此比MQL5略快。

我不知道他们是如何做到的,事实上这是一种翻译语言。

我想知道Python是否也是如此。

当然,这并不是说MQL5不好。只是,Java太酷了。

我一定是错过了什么。从什么时候开始,解释器变得和编译器一样快了?

显然,这只有在部分编译的情况下才有可能,也就是说,解释器是不纯的。

 
Nikolai Semko:

我现在有点震惊。我用Java写了一个测试。事实证明,Java的速度几乎和C一样快,因此比MQL5略快。

我不知道他们是如何做到的,事实上这是一种翻译语言。

我想知道Python是否也是如此。

当然,这并不是说MQL5不好。只是,Java太酷了。

我一定是错过了什么。从什么时候开始,解释器变得和编译器一样快了?

显然,这只有在部分编译的情况下才有可能,也就是说,解释器是不纯的。

MQL也是一个解释器。

 
Nikolai Semko:

我现在有点震惊。我用Java写了一个测试。事实证明,Java的速度几乎和C一样快,因此比MQL5略快。

我不知道他们是如何做到的,事实上这是一种翻译语言。

我想知道Python是否也是如此。

当然,这并不是说MQL5不好。只是,Java太酷了。

我一定是错过了什么。从什么时候开始,解释器变得和编译器一样快了?

显然,这只有在部分编译的情况下才有可能,也就是说,解释器是不纯的。

Java虽然被翻译成字节码,但有自己的虚拟 执行(JVM)。
该语言也是严格类型化的,不像其他语言有解释器。
最有可能的是,严格的类型化和JVM是快速执行和向硬件传输指令的原因。
美国的交易终端是用Java编写的,是有原因的。芝加哥的CME集团正式提供用Java编写的终端。
一位程序员曾经告诉我,Java的根基在电信。
在电信领域,你必须从一开始就拥有处理和传输数据的速度。
而且Oracle有自己的社区来开发这种语言。
也就是说,该语言是有生命力的,并且正在被Oracle社区敲定。

顺便说一下,Quik品牌和LUA语言也是由美国人开发的。
但在蓬头垢面的90年代,它被成功卖给了俄罗斯联邦。
在那些年里,美国人已经明白,LUA没有发展前途。
他们成功地把它卖给了俄罗斯联邦,那里的交易市场在苏联解体后刚刚开始形成。

 
Nikolai Semko:

我现在有点震惊。我用Java写了一个测试。事实证明,Java的速度几乎和C一样快,因此比MQL5略快。

我不明白他们是怎么做的,这本质上是一种解释器语言。

那里的模式与.Net相同--源代码被编译成字节码,它将是一个解释器,当你在给定的PC上解压字节码时,将为执行的虚拟环境生成本地代码,即它将是编译后的代码。

https://habr.com/ru/post/107585/


用谷歌搜索 "Java编译器或解释器"--会有类似的文章。

 
Алексей Тарабанов:

MQL也是一个解释器。

理由是什么?

 
Nikolai Semko:

我现在有点震惊。我用Java写了一个测试。事实证明,Java的速度几乎和C一样快,因此比MQL5略快。

我不知道他们是如何做到的,事实上这是一种翻译语言。

我想知道Python是否也是如此。

当然,这并不是说MQL5不好。只是,Java太酷了。

我一定是错过了什么。从什么时候开始,解释器变得和编译器一样快了?

显然,这只有在部分编译的情况下才有可能,也就是说,解释器是不纯的。

你有没有想过,它需要多少启动时间? 吞噬了多少内存,JVM运行多少线程来编译字节的代码? 我运行了monster,它在飞行中编译了hello world,结果是同时出现了nativ.com和nativ.com。除了C怪物没有。还有关于Python。

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

MetaTrader 5 Python 用户组 - 如何在 Metatrader 中使用 Python

胜利, 2019.12.07 07:12

关于python-- 最近谈到了ranger(文件管理器),是用它写的。我已经用了几天,我的印象是, 这是一个很酷的想法,有很有趣的功能,但是python真的很慢(如果在后台执行一些复杂的任务)。撕掉它,我不知道 为什么人们对蟒蛇如此感兴趣。在C 上放 一个类似的东西。

好吧,好吧--买一个多核数字破碎机,带一车的内存,说我的java/sharp/...在这个测试中是非常酷的,让我们对整体负载保持沉默。他们永远不会追上C。进步,把80年代的俄罗斯方块,用sharpe重写,和以前一样快,但要用60核CPU))。

ZS:类似于Elbrus中两个线程只参与x86指令的广播。BelAZ在运输包裹。

 
顺便说一下,至于Sharp,看起来小软体使其有可能直接编译成本地代码。 我还没有试过,但应该很不错。