我使用MATLAB Engine API将MATLAB与C / C ++连接起来。
在我的特定情况下,MATLAB用于计算某些东西,结果用C打印。但是,在双方的各种测试中,我注意到C中的显着性能损失。
以下是MATLAB函数调用的示例:
tic;
data = predictIM(data);
toc;
在C方面,我调用类似的函数如下:
iMod::Timer_T<high_resolution_clock> t;
engPutVariable(ep, "data", dataContent);
engEvalString(ep, "[posture] = predictIM(data);");
UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds());
我在C ++中的计时器实现如下:
template< class Clock >
class Timer_T
{
typename Clock::time_point start;
public:
Timer_T() : start( Clock::now() ) {}
typename Clock::duration elapsed() const {
return Clock::now() - start;
}
double seconds() const {
return elapsed().count() *
((double)Clock::period::num/Clock::period::den);
}
};
上述MATLAB代码以大约每秒180帧的速度运行,包括设置矩阵(data
),而C代码仅为24 FPS。我使用tic
/ toc
来测量MATLAB中的执行时间,而我自己的计时器实现则用在C / C ++端。
在分析应用程序时,我注意到MATLAB Engine调用是瓶颈。 我知道Linux MATLAB Engine实现使用命名管道与MATLAB连接,我想知道是否有办法加速MATLAB与其引擎的通信?
答案 0 :(得分:1)
首先,像这样测量MATLAB引擎是不公平的。您应该只像在MATLAB中那样计算时间,如下所示:
engPutVariable(ep, "data", dataContent); // you should not time this
iMod::Timer_T<high_resolution_clock> t;
engEvalString(ep, "[posture] = predictIM(data);"); // time this only for fair
UT_NOTIFY(LV_DEBUG,"The execution took "<<t.seconds());
实际上,根据我的经验,运行MATLAB并用C / C ++调用它的引擎应该具有与实际依赖MATLAB软件本身相似的速度。
其次,我对可能的加速有建议。您应该只在整个C / C ++项目中打开单个MATLAB引擎,而不是为每个调用创建一个。像这样:
int main()
{
// Open MATLAB engine for the whole project
Engine *ep = engOpen(NULL);
// Use it multiple times
for (int i=0; i<100; ++i){
engEvalString(ep, ...);
}
// Close MATLAB engine
engClose(ep);
return 0;
}