调用MATLAB函数时的延迟 < >我从C++代码中调用MATLAB函数(DLL)。此函数获取一个数组作为参数。 函数对数组的每个成员进行一些计算。 我做了两次测试。 我第一次用一个包含24个元素的数组调用这个函数。 我第二次用8个元素调用了这个函数三次。 第二次测试又花了两次时间。 为什么? 进入和退出MATLAB函数是否需要很多时间? 如果是,原因是什么?

调用MATLAB函数时的延迟 < >我从C++代码中调用MATLAB函数(DLL)。此函数获取一个数组作为参数。 函数对数组的每个成员进行一些计算。 我做了两次测试。 我第一次用一个包含24个元素的数组调用这个函数。 我第二次用8个元素调用了这个函数三次。 第二次测试又花了两次时间。 为什么? 进入和退出MATLAB函数是否需要很多时间? 如果是,原因是什么?,c++,matlab,C++,Matlab,您注意到,调用MEX函数需要相当长的时间。考虑Matlab必须做的最小值: 扫描Matlab路径,确保函数映射到MEX文件(并且MEX文件没有更改) 从其DLL或共享库加载MEX函数,然后解析其mexFunction符号 分配输入和输出参数数组,并初始化它们 调用你的函数 查找并释放MEX函数加载的任何临时变量 释放输入和输出参数数组 理论上,Matlab可以使用缓存来避免前两步。不过,我不确定它是否会。Matlab解释器(或其JIT编译器)不能跳过任何后续步骤,甚至不能真正优化这些步骤。基本上

您注意到,调用MEX函数需要相当长的时间。考虑Matlab必须做的最小值:

  • 扫描Matlab路径,确保函数映射到MEX文件(并且MEX文件没有更改)
  • 从其DLL或共享库加载MEX函数,然后解析其
    mexFunction
    符号
  • 分配输入和输出参数数组,并初始化它们
  • 调用你的函数
  • 查找并释放MEX函数加载的任何临时变量
  • 释放输入和输出参数数组
  • 理论上,Matlab可以使用缓存来避免前两步。不过,我不确定它是否会。Matlab解释器(或其JIT编译器)不能跳过任何后续步骤,甚至不能真正优化这些步骤。基本上,如果计算速度很快,那么调用MEX函数的时间将比实际运行它的时间多得多

    您已经找到了最大化MEX性能的方法,即让MEX函数在每次调用中尽可能多地执行操作

    除了让它在每次调用中处理尽可能多的数据外,还应该将任何简单的外部循环推送到MEX函数中。简单的循环很容易在MEX函数中实现。它们也比Matlab中的循环(甚至是JIT编译的Matlab)更快,并且避免了重复调用MEX函数的成本


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

    这些结果是否一致?你能复制它们吗?