c++ - MATLAB Mex 函数并不比常规函数快

标签 c++ performance matlab mex

我知道情况并非总是如此,但 MEX 函数难道不应该提高代码效率,尤其是在计算方面吗?

我已经使用编码器工具包对 MATLAB 中的 expm 函数进行了 MEX。由于该函数执行大量矩阵计算,我期待看到效率的显着提高。

但是,我没有看到时间上有太大改善,如下图所示:

enter image description here

X 轴 expm 函数的另一次迭代

Y 轴该函数的运行时间

蓝线:常规expm函数调用

红线: MEX 的 expm 函数调用

MEX 版与普通版如此相似有什么原因吗?有没有办法提高速度?我使用 tictoc 来收集有关运行时的数据。

最佳答案

大多数 matlab 函数都是调用 FORTRAN 库代码的简单包装器,其中大部分来自 LAPACK/EISPACK/LINPACK。换句话说,内置的 matlab 函数调用已经在调用编译代码,而不是解释的 matlab 代码(.m 源)。因此,MEX 无法提高这些函数调用的性能。

只有当您直接在 matlab 源代码中完成大量工作时,在 matlab 中编译代码才会带来好处。如果您的代码主要是调用一堆内置的 matlab 函数,尤其是矩阵函数(它们都是 LAPACK 函数),那么您不会看到太多改进,只有当您拥有“手动”代码时,即,如果您完全用 matlab 代码(在 .m 文件中)实现类似“expm”的东西,然后用 MEX 编译时会快得多。只有当您拥有大量自己的 matlab 代码时,您才会看到编译 matlab 代码的好处,如果您只是对内置函数进行一些调用,则看不到。

想一想,为什么 Mathworks 会在 Matlab 中提供作为解释性 matlab 代码实现的内置函数?即使他们在 matlab 代码中实现了一些内置函数(这只是一小部分,因为大多数是 FORTRAN/C/C++),他们会在发布之前编译这些函数,以便您作为用户获得他们的最佳表现。

关于c++ - MATLAB Mex 函数并不比常规函数快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660142/

相关文章:

matlab - matlab 四元函数中的错误?

C++ 编译器在实例化之前解析模板?为什么?

java - 如何在启动时提高 Guice 性能

Matlab 一个图上有多个图例 2014b

performance - 在TeamCity中进行多次并行构建后触发一次后续构建

python - 比较两个numpy数组的最快方法

matlab - 每次迭代后添加到图例

c++ - OpenCV arrowedLine函数

c++ - 从两个阵列的点积测量内存带宽

c++ - 包含许多零的矩阵的数据结构?