将C/C++代码作为MEX文件调用与纯C/C++有何区别?

3
我个人喜欢高级编程语言。对于概念验证,MATLAB非常好用。此外,你可以使用MATLAB轻松地可视化几乎任何东西。
然而,出于速度的考虑,我经常需要编写C或C++代码。但是,在C/C++中进行可视化是一件非常麻烦的事情。在理想的情况下,我希望能够在C/C++速度下使用MATLAB可视化工具。对我来说,这意味着我应该将必要的C/C++函数MEX并从MATLAB脚本中调用它们,使用MATLAB的工具执行可视化。理想情况下,这给了我两全其美的结果。但是,我不希望由于通过MEX文件调用函数而导致C/C++运行时间变慢。
当调用已编译的MEX函数作为C/C++函数时,我是否会牺牲 C++提供的10倍到100倍的加速效果?也就是说,mexFunction(param1, param2)在从MATLAB脚本中调用时是否比运行已编译的二进制文件更慢?

1
一个mex文件是一个已编译的二进制文件。你的第二段,去掉最后一句话,就是编写mex文件的原因。 - Phil Goddard
从 mxArray 获取指向数据的指针以便将其作为 C 数组进行操作(或传递给现有/其他 C 函数)的开销可以忽略不计。 - Phil Goddard
@PhilGoddard:简而言之,你对我的问题的回答是:不。通过从MATLAB调用,我几乎没有牺牲任何东西。只是寻求澄清。 - marcman
这可能有点偏题,但在 MEX 环境中维护 C++ 对象并不是一件简单的事情。 - user3528438
1个回答

1
我认为要回答这个问题,你必须考虑到什么才是真正导致开销的原因。每次对mex函数的调用都会导致一些开销,而将数据传递给mex(根据我的经验只有这个方向,不是返回结果)也会导致一些开销。我认为主要原因是M-Code采用了写时复制优化,这意味着我的代码从未复制输入数据,但mex实现确实接收到了一份副本。 举个例子,当我们在MATLAB中实现二分查找时,C++循环速度更快,而mathworks可能拥有合格的程序员,所以为什么我能够在MATLAB中实现二分查找并获得更好的性能?。在这种情况下,将数据传递给mex函数只会使它变慢。许多数据被传递,你必须支付开销,最终这些数据几乎没有被使用(二分查找)。

最后,这个开销到底有多大呢? 对于一个 nop调用,仅需0.00001秒,(无输入,无输出,无计算)。 关于传递数据,我没有详细的基准测试数据,但从我上面链接的二分查找示例来看,它必须低于0.5s/GB。

现在根据你的情况进行计算,并决定是否值得切换到C++。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接