关键是 MKL 与 R 有质的区别。在进行性能比较时,应尽可能考虑到这些质的不同。R 是一种解释器,而 MKL 是一种编译器。对于工业程序而言,这种质的差异是 MKL 的优势所在。
请看一下 R 的源代码(它是开放源代码)。所有的 C/C++ 基本数学都编译到了引擎中。而且大多数软件包也是用 C++ 编写的,否则你就无法等待计算结果了。
如果 R 是基本/系统函数的解释器,它将落后 MQL5 200-500 倍。我们专门测试了 R 的 C/C++ 系统函数,而不是在循环中进行手动处理(R 在这方面落后数百倍)。
在 R 开发过程中,我们一直在寻找 "如何才能找到一个软件包,让我不必编写 for/while/foreach 循环"。事实上,在 R 中进行计算只有一种方法,那就是将任何或多或少的大量计算传递给第三方软件包。
但还有一个质的区别,这在程序的工业运行中也非常重要,在测试中没有考虑到这些区别,导致结果失真。
R 和 MKL 的本质区别在于,MKL 中的基本对象是标量,而更复杂的对象(例如矢量)则由标量 构成。矢量是分布函数的输入。
在 /include/math/stat 目录中可以找到数百个向量函数。
在 R 中,根本没有标量的概念。最简单的对象就是向量。在我们比较 R 代码中的分布函数的示例中,我们可以清楚地看到 "矢量化 "这种 R 特有的编程技术,而 MKL 中没有这种技术。由于矢量化是 R 的一种特殊技术,可将计算速度提高 10-100 倍(取决于矩阵的大小),因此 R 的代码必须包含这种技术。矢量化的使用是显而易见的,因为在测试中,我们使用一个输入矢量并对其进行 100 次计算,也就是说,它是一个相同的矩阵,但我们可以对不同的列进行计算。
R 中没有矢量化,也没有现代功能。那里的代码都是由普通编程初学者迎头编写的。没错,他们是出色的数学家,但却是平庸的程序员。
R 中的 GPU 仍然只是童话故事和最稀有软件包中的个别尝试。
总而言之:R 语言中的文本应该使用 R 语言的功能来编写,尤其是在 MKL 中没有类似功能的情况下。
你根本不了解 R 或 MQL5。
你没有看过 R 的源代码,也不知道 MQL5 的源代码。在过去的 15 年中,你从未编译过编译器。但您却试图与那些做过这一切的人争论。
读一读。
读懂了。
我认为您给出的测试不完全正确。我认为有必要写出来,因为性能比较不是最后的问题。
关键是 MKL 与 R 有质的区别。在进行性能比较时,应尽可能考虑到这些质的不同。R 是一种解释器,而 MKL 是一种编译器。对于工业程序而言,这种质的差异是 MKL 的优势所在。
请看一下 R 的源代码(它是开放源代码)。所有的 C/C++ 基本数学都编译到了引擎中。而且大多数软件包也是用 C++ 编写的,否则你就无法等待计算结果了。
如果 R 是基本/系统函数的解释器,它将落后 MQL5 200-500 倍。我们专门测试了 R 的 C/C++ 系统函数,而不是在循环中进行手动处理(R 在这方面落后数百倍)。
在 R 开发过程中,我们一直在寻找 "如何才能找到一个软件包,让我不必编写 for/while/foreach 循环"。事实上,在 R 中进行计算只有一种方法,那就是将任何或多或少的大量计算传递给第三方软件包。
但还有一个质的区别,这在程序的工业运行中也非常重要,在测试中没有考虑到这些区别,导致结果失真。
R 和 MKL 的本质区别在于,MKL 中的基本对象是标量,而更复杂的对象(例如矢量)则由标量 构成。矢量是分布函数的输入。
在 /include/math/stat 目录中可以找到数百个向量函数。
在 R 中,根本没有标量的概念。最简单的对象就是向量。在我们比较 R 代码中的分布函数的示例中,我们可以清楚地看到 "矢量化 "这种 R 特有的编程技术,而 MKL 中没有这种技术。由于矢量化是 R 的一种特殊技术,可将计算速度提高 10-100 倍(取决于矩阵的大小),因此 R 的代码必须包含这种技术。矢量化的使用是显而易见的,因为在测试中,我们使用一个输入矢量并对其进行 100 次计算,也就是说,它是一个相同的矩阵,但我们可以对不同的列进行计算。
R 中没有矢量化,也没有现代功能。那里的代码都是由普通编程初学者迎头编写的。没错,他们是出色的数学家,但却是平庸的程序员。
R 中的 GPU 仍然只是童话故事和最稀有软件包中的个别尝试。
总而言之:R 语言中的文本应该使用 R 语言的功能来编写,尤其是在 MKL 中没有类似功能的情况下。
你根本不了解 R 或 MQL5。
你没有看过 R 的源代码,也不知道 MQL5 的源代码。在过去的 15 年中,你从未编译过编译器。但您却试图与那些做过这一切的人争论。
目前,MQL5 统计库(不包括 Alglib 和 Fuzzy)已经拥有超过 461 个函数:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。
这已经很好地涵盖了基本的统计函数。
如果您以前读过这篇文章,我建议您再读一遍--昨天他们发布了新版文章,增加了很多新函数。
目前,MQL5 统计库(不包括 Alglib 和 Fuzzy)已经拥有超过 461 个函数:https://www.mql5.com/ru/forum/86386/page222#comment_3867386。
这已经很好地涵盖了基本的统计函数。
我建议以前读过这篇文章的人再读一遍--昨天他们发布了新版文章,增加了很多新函数。
还不知道如何向 Quantum 发送推送消息。请添加一个 R 中可能根本没有的东西。
这是平均值区间向右移动一位时的快速计算。类似的还有皮尔逊相关系数的计算。
如果正面计算,Pearson 是很难计算的。但也有迭代计算的方法:K[i] 到 K[i-1]。
有趣的是,这是我第一次在俄语中遇到每个单词后面都有逗号的句子:
为什么不自己编写必要的函数?
查看 /include/math/stat 中的全部函数,并写出缺少的函数。
R 没有矢量化,也没有现代功能。那里的代码只是由普通的程序员编写的。是的,他们是不错的数学家,但他们是平庸的程序员。
你根本不了解 R 或 MQL5。
你没有看过 R 的源代码,也不知道 MQL5 的源代码。在过去的 15 年中,你从未编译过编译器。但你却试图与那些做过所有事情的人争论。
我的编程知识非常有限,但还没有达到你所描述的程度。
总之,我完全明白,你所说的 R 在 C++ 中的内部实现与我提出的测量执行速度问题毫无关系。我写的是用 R 本身编写代码的技术,而内部的东西才是我们要测量的。
那么,关于矢量化。
字符串在 R 中看起来很正常
它至少总是一个向量计算。这取决于上下文--a 和b 是什么。
此外
会得到一个向量c,其中每个元素都是向量a 的相应元素的平方根。
在这种情况下,a 不一定是一个向量,它可以是一个更复杂的对象,如矩阵。
在 MQL 中,这些对象总是循环。
此外,R 语言中的矢量化不仅意味着对象本身,还包括
回到我在上一篇文章中所写内容的含义。
我根本没有写任何关于 C++ 函数实现质量的内容。和你一样,我建议按实际情况来衡量它们。不过,我使用的是专门用于矢量化操作的 R 语言工具。
举个例子
对于你的所有测试,用 100 个数据组成一个矩阵 M(就像你所做的那样),其中每一列都是一个引用的模型
那么在 R 语言中,所有列的最小值看起来像这样
结果将是一个包含每列最小值的向量
利用这种模式,我们需要测量用适当的应用程序包着的所有分布函数的比率。分布函数有很多,而且各不相同。MKL 中没有类似的函数。
同时,确保MKL 库与 R 一起安装。
为什么不自己编写必要的函数?
查看 /include/math/stat 中的完整函数源,然后写出缺失的函数。
有趣的想法。
也许你能找到移植软件包的执行者。例如,花键。你会得到高质量的mashups,货真价实。
我对编程略知一二,但还没有达到您所描述的程度。
无论如何,我完全明白你所说的 R 的内部 C++ 实现与我提出的测量执行速度问题毫无关系。我写的是在 R 本身中编写代码的技术,而内部的东西就是我们要测量的。
那么,关于矢量化。
在 R 中,字符串看起来很正常
在 R 中,一个字符串看起来是正常的,但它至少是一个矢量化计算。这取决于上下文--a 和b 是什么。
此外
会得到一个向量c,其中每个元素都是向量a 的相应元素的平方根。
在这种情况下,a 不一定是一个向量,它可以是一个更复杂的对象,例如矩阵。
在 MQL 中,这些对象总是循环。
我们已经展示了如何在循环中更快地工作。在 MQL5 中的纯源代码中,无需使用 C++。
我们还将打败最简单的向量 sqrt。这里有两个标准函数库中的函数,它们与 R. 完全类似:
bool MathSqrt(const double &array[],double &result[]) // 将结果放入一个单独的向量
你还不太明白,MQ5 数学标准库中的这 461 个函数涵盖了大量的基本数学运算。
此外,R 语言中的矢量化不仅意味着对象本身,还意味着以特定形式存在的程序装置:
是的,没错。理论上是这样。
而 99% 的操作都是在最简单的函数中完成的,没有加速的机会。
在 MQL5 中,OpenCL 是标准配置,无需第三方库即可加速所有操作。在普通 MQL5 中,您可以获得 C++ 级别的结果。
但在 R 中,唯一的选择是寻找一个包来加速每个循环。是的,准确地说是每个周期,如果它在迭代次数方面有任何问题的话。
回到我在上一篇文章中所写的意思。
很少有人意识到这一点,但在使用 MKL 时,将 R 输入数据转换为 MKL 可以处理的常规数组,然后将结果转换回 R 的内部数据表示格式,很可能会 产生巨大的开销。
我还没有深入研究过这个问题,但从逻辑上看就是这样。这意味着提供 MKL 支持需要很大的开支。
当然,在 MQL5 中完全没有这种损失。只有在 OpenCL 中才需要复制数据,但这只是简单的平面内存复制。
你为什么不自己写一个必要的函数呢?
我写过一次,但我没有将其格式化为数学函数。
看看 /include/math/stat 中函数的完整来源,然后写出缺少的函数。
问题是要像量子那样,将它们放入一个科学与编程相结合的标准库中。
很有可能需要与你的解决方案进行性能比较。然后,我认为就有可能说服将自行车放到 mat 库中。我自己还没有在 mat 软件包中见过这种情况(R 软件包就更不用说了)。
另一个小秘密--为什么 MQL5 速度如此之快,尤其是当库完全包含在源代码中时。
我们的编译器进行了深度优化,能够切断大量的检查和条件,以至于函数完全消失,循环被简化到极致。当然,这仅限于 x64 版本。
与其他系统使用库/包(甚至不能对调用进行优化)不同,MQL5 编译器几乎总是使用完整的源代码,并始终执行最大深度的全局优化。这将带来惊人的结果。
这就是为什么我们必须提供所有标准库 的源代码。我们知道,在决赛中,一切都会被过度优化,这样你就能在速度上击败几乎所有人。甚至托管语言的开销也不会对其造成太大影响。