我有一些Matlab代码需要加速。通过分析,我确定了一个特定函数是导致执行减慢的罪魁祸首。在循环中调用该函数数十万次。
我的第一个想法是将该函数转换为mex(使用Matlab Coder),以加速它。但是,常识告诉我,在Matlab和mex代码之间的接口会带来一些开销,这意味着调用此mex函数数千次可能并不是一个好主意。这个理解正确吗?或者当重复调用相同的mex时,Matlab是否会施展魔法来消除开销?
如果有明显的开销,我想重新构建代码,将循环添加到函数本身中,然后创建该函数的mex。在这样做之前,我要验证我的假设,以证明花费时间的必要性。
更新:
我尝试了@angainor的建议,并创建了donothing.m文件,其中包含以下代码:
function nothing = donothing(dummy) %#codegen
nothing = dummy;
end
然后,我从这个函数创建了一个名为donothing_mex的mex函数,并尝试了以下代码:
tic;
for i=1:1000000
donothing_mex(5);
end
toc;
结果表明,调用该函数一百万次大约需要9秒。对于我们的目的来说,这并不是一个重要的开销,因此我认为现在我只需要将被调用的函数转换为mex
即可。然而,回想起来,从循环中调用一个函数,而这个循环执行了大约一百万次,似乎是一个相当愚蠢的想法,特别是考虑到这是关键性能代码,因此将循环移动到mex
函数中仍然在计划之内,但优先级较低。