与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,即使在与 R 中函数的 DLL 实现对抗时也能获胜。
以下是基于上述示例的测试:R 3.3.1 x64
install.packages("microbenchmark")
library(microbenchmark)
n <- 2000
k <- seq(0,n,by=20)
res <- microbenchmark(a<-dbinom(k, n, pi/10, log = TRUE))
print(res)
Unit: microseconds
expr min lq mean median uq max neval
a <- dbinom(k, n, pi/10, log = TRUE) 20.16720.16820.8872620.46920.7735.819100
搞什么鬼?数学圣经的目标很明确。
我有不明白的地方
在 MQL 中调用指定函数的结果是什么?标量还是向量?下面是我们在 R 中得到的结果
n <- 2000
>
> k <- seq(0, n, by = 20)
>
> dbinom(k, n, pi/10, log = TRUE)
[1] -754.219687 -660.247472 -592.126636 -534.532344 -483.881605
[6] -438.460449 -397.256529 -359.600217 -325.015561 -293.146935
[11] -263.718651 -236.510862 -211.344286 -188.070044 -166.562645
[16] -146.714976 -128.434635 -111.641185 -96.264050 -82.240889
[21] -69.516303 -58.040813 -47.770020 -38.663934 -30.686405
[26] -23.804662 -17.988917 -13.212041 -9.449276 -6.678001
[31] -4.877524 -4.028903 -4.114796 -5.119322 -7.027950
> a<-dbinom(k, n, pi/10, log = TRUE)> str(a)
num [1:101] -754 -660 -592 -535 -484 ...
也就是说,在 R 中调用该函数会得到一个向量,可以用通用方法绘制 plot
> plot(a)
请将更新后的文件放到 /Include/Math/Stat 中。
它为向量添加了一个重载函数 + 一个额外的 log_mode 参数。
下面是你的计算结果,与 R 的结果完全一致:
结论:
我们正在努力添加向量操作,以便在语法上尽可能接近 R。
当然,我们还将添加大量新的单元测试。
顺便说一句,关于 R 中数学库全速优化的说法非常夸张。
与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,即使在与 R 中函数的 DLL 实现对抗时也能获胜。
以下是基于上述示例的测试:R 3.3.1 x64
三重运行显示最少需要 20 微秒。
在 MQL5 中进行了同样的测试:
MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。
计算基于 i7-4930k、Windows 10 x64、MetaTrader 5 x64、无虚拟化和无外部负载。
顺便说一句,关于 R 中数学库全速优化的说法非常夸张。
与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,甚至可以让您在与 R 中函数的 DLL 实现对抗中获胜。
以下是基于上述示例的测试:R 3.3.1 x64
三重运行显示最少需要 20 微秒。
在 MQL5 中进行了同样的测试:
MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。
计算基于 i7-4930k、Windows 10 x64、MetaTrader 5 x64、无虚拟化和无外部负载。
顺便说一句,关于 R 中数学库全速优化的说法非常夸张。
与 R 不同,MQL5 使用类型清晰的数组,并以本地 x64 编译代码。这给 MQL5 带来了巨大的优势,即使在与 R 中函数的 DLL 实现对抗时也能获胜。
以下是基于上述示例的测试:R 3.3.1 x64
三重运行显示最少需要 20 微秒。
在 MQL5 中进行了同样的测试:
MQL5 的计算速度是 R 的两倍:10 微秒对 20 微秒。
计算使用 i7-4930k,Windows 10 x64,MetaTrader 5 x64,无虚拟化,无外部负载。
结果出现错误((
vars' - 参数转换不允许
我得到了一个错误信息((
vars' - 参数转换不允许
你需要从https://www.mql5.com/ru/forum/97153/page4#comment_2882502 获取更新文件。
那里添加了用于向量的重载函数。
您需要从https://www.mql5.com/ru/forum/97153/page4#comment_2882502 获取更新文件。
有一个重新定义的向量函数。
我必须马上告诉你,我是在 32 位的 vyne 下运行 MT 的。这就是为什么我猜答案会是--64 位更快)))为了避免任何混淆--R 也是 32 位的。
是的,谢谢你。它就是这样工作的。我就是这样工作的。我必须说,我是在 Wyne 下运行 MT 的,32 位。那么答案是什么呢,我可以猜测 - 64 位更快))))。
这并不严重。
在 wyne 下,甚至是 32 位。32 位 MT5 使用与 MT4 类似的旧编译器。它比 64 位代码慢几十倍,而 64 位代码是由专门为 MT5 64 位版本创建的新编译器生成的。我们发布了一份报告,比较 32 位和 64 位 MQL5 程序的速度。
每个 MQL5 程序实际上包含两份编译代码:32 位用于旧系统以保证兼容性,64 位用于新系统。
我们已经完全放弃了 32 位编译器的开发,因为它没有意义,也没有未来。
因此,如果您想获得最高性能,只能使用 64 位版本的 MetaTrader 5。
顺便提一下,MT4 用户须知--MQL4代码执行速度 也比 64 位 MetaTrader 5 慢几十倍。
祝贺你双赢。
计算速度是编译后类似 R 计算速度的两倍(R 的第一道是字节/或 jit 编译,因此最大值>1.5avg,最小值~=avg)?
好吧,成就......:-)
计算速度是编译后相同 R 计算速度的两倍(R 的第一道是字节/或 jit 编译,因此最大值>1.5avg,最小值~=avg)?
好吧,成就......:-)
R 用了多次运行的最短时间,而不是第一次运行的最长时间。
因此,"冷启动 "在这里并不能解释问题。即使是在所有库代码都在 DLL 中的环境下。实际上没有什么需要预热的。
但可以解释的是
与动态链接库中未经优化的实现相比,编译器在这方面有很大的空间,因为动态链接库没有机会学习环境并进行调整。