Matlab与此代码中的c ++速度比较

时间:2013-09-03 13:16:20

标签: c++ visual-studio-2010 performance matlab

我编写了简单的C ++代码并在C ++中进行了测试,然后我通过mex file_name.cpp为MATLAB调整了相同的代码,并在MATLAB中使用与C ++相同的编译器运行相同的代码。这是代码:

int k;
for(int j = 0; j < 100;j++){
    for(int i = 0; i < 10000000; i++){
        k++;
    }
    k/=10000000
}

这是MATLAB代码:

double a;int j;int i;
double* k;

for(j = 0; j < 100;j++){
    for(i = 0; i < 10000000; i++){
        a = a+1;
    }
    a = a / 10000000;
}

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);
k = mxGetPr(plhs[0]);
*k = (double)a;

我已经为MATLAB编辑了这段代码,即改为合适的类型,添加了MEX函数等,结果在MATLAB中约为900ms,而在C ++中为3100 ms。

我不明白两者是运行相同的代码和使用相同的编译器(在MATLAB中我在命令行中编写mex -setup并选择Visual Studio编译器作为MEX编译器),但是,MATLAB在快3.5倍

MATLAB做得更快,C ++没有做什么?有人可以解释一下为什么会有这么大的差异吗?我尝试过其他一些代码,在MATLAB中都快了3-6倍。

我的电脑是64位Windows 7,Visual Studio 2010用于C ++,MATLAB是R2012b。

这是否可能是因为我的Visual Studio版本?如果我将其更改为VS2012,会更快吗?

mex -v输出就在这里。

谢谢,

2 个答案:

答案 0 :(得分:3)

性能高度依赖于平台,操作系统,编译器等。无论Matlab在这种情况下做什么,它都以某种方式设法找到了VS2010编译器没有的优化。我冒昧地猜测升级到VS2012不会产生实质性的影响,但我可能错了。毕竟,它是一个不同的编译器。

我承认这有点令人惊讶,但请检查您的编译标志并尝试使用不同的配置进行分析。如果您的Matlab安装是32位,那也可能会有所不同。

您的代码中也可能存在细微差别,可能略微不足以让您可能没有注意到。您的代码可能与其他可能性能差异很大的库相关联。

这里的教训是,很难确定完全为什么一件事比另一件更好。

编辑:您已经提到代码是为了调试而编译的。这只会进一步增加编译器输出的变化,因为激活调试选项也可能会关闭其他优化,并且每个编译器对于哪种调试信息很重要并且值得坚持代码有不同的想法。

我建议关闭所有调试选项以获得更一致的输出。我还建议您确保使用类似的优化级别进行编译,可能是最好的也可能不是。

答案 1 :(得分:3)

在C ++代码中,您在内部循环中使用int k,而在MATLAB代码中,您使用double a(奇怪的是,从a++符号更改为{{1} } ...)

你让他们都没有被初始化; 请参阅this question,了解为什么这是不好的。

默认情况下,MEX文件是ANSI C.您的代码确实如此。仔细检查a=a+1;您可能不小心选择了C编译器,认为您正在选择C ++编译器。

还要确保两个编译都具有完全相同的编译器选项集。 完全相同。

但我认为问题的核心是你在C ++版本中进行整数算术,在MATLAB版本上进行 double 算术。这可能会产生重大影响。

除此之外,这里已经提到的内容应该没有区别。实际上,任何具有基本优化功能的优秀编译器都应该能够检测到这个循环相当简单,并将其完全删除。