将 C/C++ 代码称为 MEX 文件与纯 C/C++

Calling C/C++ Code as MEX File vs. Pure C/C++

本文关键字:C++ 文件 MEX 代码      更新时间:2023-10-16

我个人喜欢高级编程语言。对于概念验证的东西,MATLAB很棒。此外,您还可以使用 MATLAB 轻松可视化几乎所有内容。

但是,为了速度,我经常需要编写 C 或 C++ 代码。不过,C/C++ 中的可视化是脖子上的痛。在理想情况下,我希望 MATLAB 可视化工具具有 C/C++ 的速度。对我来说,这意味着我应该MEX必要的C/C++函数,并从MATLAB脚本调用它们,使用MATLAB的工具执行可视化。理想情况下,这给了我两全其美的效果。但是,我不想因为通过 MEX 文件调用函数而导致 C/C++ 运行时间变慢。

在将 C/C++ 函数作为编译的 MEX 函数调用时,我是否会牺牲 C++ 10-100 倍的速度增益?也就是说,从 MATLAB 脚本调用的mexFunction(param1, param2)是否一定比运行编译的二进制文件慢?

我认为

要回答这个问题,您必须考虑真正导致开销的原因。对 mex 本身的每个函数调用都会导致开销,并且进一步将数据传递给 mex(根据我的经验,只有那个方向,而不是传回结果)也会导致一些开销。我认为主要原因是 M-Code 是写入时复制优化的,这意味着我的代码从未复制输入数据,但 mex 实现确实会收到副本。举一个 mex 表现"糟糕"的例子,我想我们都同意 C++ 迭代速度更快,并且 mathworks 可能拥有合格的程序员,那么为什么我能够在 MATLAB 中实现二进制搜索的性能更好呢?在这种情况下,将数据传递给 mex 函数只会使其变慢。传递了大量数据,您必须为此支付开销,最后数据几乎没有被触及(二进制搜索)。

最后,开销到底有多大?对于nop调用,它只有0.00001s,(没有输入,没有输出,没有计算)。对于传递数据,我没有任何详细的基准,但从我上面链接的二叉搜索示例中,它必须低于 0.5s/GB。

现在为您的情况进行数学计算,并决定是否值得切换到 c++。