2013-03-19 119 views
0

我从我的C++代码中调用MATLAB函数(dll)。该函数获取一个数组作为参数。 函数对数组的每个成员进行一些计算。 我做了两个测试。 我第一次用24个元素的数组调用这个函数。 我第二次用8个元素调用这个函数三次。 第二次测试花了两次时间。 为什么? 进入MATLAB函数并退出需要花费很多时间吗? 如果是,为什么?延迟呼叫MATLAB函数

+0

这些结果是否一致?你能重现它们吗? – 2013-03-19 17:45:49

回答

2

你已经注意到,调用MEX函数需要花费相当长的时间。考虑到Matlab具有做到最低:

  1. 扫描Matlab的路径,以确保该函数映射到MEX文件(该文件MEX没有改变)
  2. 装入MEX函数从DLL或共享库,然后解析其符号。
  3. 分配的输入和输出参数数组,并进行初始化
  4. 调用函数
  5. 查找和无任何临时变量,你MEX函数加载
  6. 免费的输入和输出参数数组

理论上,Matlab可以使用缓存来避免前两个步骤。不过,我不确定它是否会。以后的任何步骤都不能被跳过,甚至可以通过Matlab解释器(或其JIT编译器)进行真正的优化。基本上,如果你的计算速度很快,那么你将花费更多的时间来调用MEX函数,而不是实际运行它。

您已经打出了最大化MEX性能的方法,即让MEX功能在每次调用时都尽可能地做到这一点。

除了可以在每次调用时使用尽可能多的数据之外,还应该将任何简单的外部循环插入MEX函数。简单的循环在MEX功能中很容易实现。它们也比Matlab中的循环更快(甚至是JIT编译的Matlab),并且避免了重复调用MEX函数的代价。

您还可以看看是否明智地使用mexLock函数将有所帮助。您应该提供一些方法来解锁MEX函数mexUnlock,否则您可能会开始泄漏内存,并且每次更改MEX函数时也必须重新启动Matlab会话。