6

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

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 中约为 900 毫秒,而在 C++ 中为 3100 毫秒。

我不明白的是两者都运行相同的代码并使用相同的编译器(在 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输出在这里。

谢谢,

4

2 回答 2

3

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

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

您的代码也可能存在细微差别,可能细微到您可能没有注意到。您的代码可能链接到其他库,这些库的性能也可能有很大差异。

这里的教训是,很难准确地确定为什么一件事比另一件事表现更好。

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

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

于 2013-09-03T13:22:09.070 回答
3

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

你让它们都未初始化;看到这个问题为什么不好。

MEX 文件默认使用 ANSI C。您的代码确实看起来像这样。仔细检查您的mex -setup; 您可能不小心选择了 C 编译器,以为您选择的是 C++ 编译器。

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

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

除此之外和这里已经提到的,应该没有区别。事实上,即使是基本优化的任何体面的编译器都应该能够检测到这个循环相当琐碎,并完全删除它。

于 2013-09-03T13:59:36.903 回答