【问题标题】:Calling C/C++ Code as MEX File vs. Pure C/C++将 C/C++ 代码调用为 MEX 文件与纯 C/C++
【发布时间】:2016-05-03 11:57:39
【问题描述】:

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

但是,为了速度,我经常需要编写 C 或 C++ 代码。不过,C/C++ 中的可视化是一件令人头疼的事情。在一个理想的世界里,我想要 C/C++ 速度的 MATLAB 可视化工具。对我来说,这意味着我应该 MEX 必要的 C/C++ 函数,然后从 MATLAB 脚本中调用它们,使用 MATLAB 的工具来执行可视化。理想情况下,这给了我两全其美。但是,我不想因为通过 MEX 文件调用函数而导致 C/C++ 运行时间变慢。

当调用 C/C++ 函数作为编译的 MEX 函数时,我是否会牺牲 10x-100x speed gains of C++?也就是说,从 MATLAB 脚本调用的 mexFunction(param1, param2) 是否一定比运行编译后的二进制文件运行得慢?

【问题讨论】:

  • mex 文件是经过编译的二进制文件。您的第二段,去掉了最后一句,是 the 编写 mex 文件的原因。
  • 从 mxArray 获取指向数据的指针的开销可以忽略不计,以便可以将其作为 C 数组进行操作(或传递给现有/其他 C 函数)。
  • @PhilGoddard:简而言之,您对我的问题的回答是:不。从 MATLAB 调用我几乎没有牺牲任何东西。只是想澄清一下。
  • 这可能有点离题,但在 MEX 环境中维护 C++ 对象并非易事。

标签: c++ c performance matlab


【解决方案1】:

我认为要回答这个问题,您必须考虑真正导致开销的原因。对 mex 本身的每个函数调用都会导致开销,并且进一步将数据传递给 mex(根据我的经验,只有那个方向,而不是传回结果)也会导致一些开销。我认为主要原因是 M-Code 是写时复制优化的,这意味着我的代码从未复制输入数据,但 mex 实现确实收到了一份副本。 举一个 mex 表现“糟糕”的例子,我想我们都同意 C++ 的迭代速度更快,而且 mathworks 可能有合格的程序员,所以why was I able to beat the performance implementing binary search in MATLAB?。在这种情况下,将数据传递给 mex 函数只会让它变慢。传递了很多数据,您必须为此付出开销,最后几乎没有触及数据(二进制搜索)。

最后,开销到底有多大? 对于nop call, it is only 0.00001s,(无输入,无输出,无计算)。 对于传递数据,我没有任何详细的基准,但从我上面链接的二进制搜索示例来看,它必须低于 0.5s/GB。

现在计算一下你的情况并决定是否值得切换到 c++。

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多