Matlab与c++;此代码中的速度比较 编写简单的C++代码,并在C++中进行测试,然后用Matlab编写了代码,代码为< > MeX文件名> CPP < /C> >,在MATLAB中使用与C++相同的编译器运行相同的代码。代码如下: int k; for(int j = 0; j < 100;j++){ for(int i = 0; i < 10000000; i++){ k++; } k/=10000000 } intk; 对于(int j=0;j

Matlab与c++;此代码中的速度比较 编写简单的C++代码,并在C++中进行测试,然后用Matlab编写了代码,代码为< > MeX文件名> CPP < /C> >,在MATLAB中使用与C++相同的编译器运行相同的代码。代码如下: int k; for(int j = 0; j < 100;j++){ for(int i = 0; i < 10000000; i++){ k++; } k/=10000000 } intk; 对于(int j=0;j,c++,visual-studio-2010,performance,matlab,C++,Visual Studio 2010,Performance,Matlab,以下是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; 双a;int

以下是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;
双a;int j;int i;
双*k;
对于(j=0;j<100;j++){
对于(i=0;i<10000000;i++){
a=a+1;
}
a=a/10000000;
}
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
k=mxGetPr(plhs[0]);
*k=(双)a;
< >我已经编辑了Matlab的代码,即改变合适的类型,添加Max函数等,结果在MATLAB中大约为900ms,而不是C++中的3100 ms。 我不明白的是,两者都运行相同的代码,使用相同的编译器(在MATLAB中,我在命令行中编写
mex-setup
,并选择Visual Studio编译器作为mex编译器),但是,MATLAB的速度大约是的3.5倍

什么是Matlab做得更快,C++不做什么?谁能解释一下为什么会有如此巨大的差异?我试过其他一些代码,它们在MATLAB中的速度都是原来的3-6倍

<强>我的PC是64位Windows 7,Visual Studio 2010用于C++,Matlab是R2012B.<强> < /P> 这可能是因为我的Visual Studio版本吗?如果我把它改成VS2012,它会更快吗

输出在这里


谢谢,

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

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

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

这里的教训是,很难确切地确定为什么一件事比另一件好

编辑:您已经提到代码是为调试而编译的。这只会进一步增加编译器输出内容的变化,因为激活调试选项也可能会关闭其他优化,并且每个编译器对什么样的调试信息是重要的、值得保留在代码中有不同的想法


我建议关闭所有调试选项以获得更一致的输出。在C++代码中,在内环中使用<代码> int k<代码>,而在Matlab代码中,使用<代码>双A<代码>(奇怪的是,从<代码> A++< /COD>符号到<代码> A= 1 + <代码>…)

你让他们两个都没有被初始化看看为什么这样不好

默认情况下,MEX文件在ANSI C中。您的代码确实是这样的。仔细检查您的
mex-设置
;你可能偶然选择了C编译器,认为你在选择C++。p> 还要确保两个编译器的编译器选项集完全相同。完全一样

<> P>但是我认为,核心是在C++版本和整数算法上进行整数运算。这可能会产生很大的不同


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

编译器仍然是这样的s#########y,它们不能删除总是返回相同值的简单for循环?我的飞车在哪里!:-)您是在VS中以调试模式还是发布模式编译?编译器选项可能不同。不同的优化级别肯定可以解释这种差异。尝试<代码> MeX -v YouFiels.CPP < /C> >检查MEX所使用的命令行选项,并将它们与C++ IDE所生成的命令行进行比较。@ SMTTSP使用发布模式,然后只比较性能。正如您建议将其更改为发布模式,使差异大得改变,但其中一些错误给出,说命令行错误D8016:“/ZI”和“/Ob1”命令行选项不兼容“。是的,这是因为发布/调试模式。当我将debug改为release时,它变成了
920 ms
,这几乎与matlab运行时间相同。对于如此简单的代码,我认为这两个编译器将产生具有类似性能的输出是合理的,尽管由于其他参数,仍然有很大的变化空间。您所说的“很大的变化空间”是什么意思?您能再解释一下吗?我的帖子描述了编译代码时可能仍然存在差异的许多原因,从外部库依赖项到编译标志,再到VS2010编译器可能不是很好这一简单事实。它与
mex-setup
无关。C++和Matlab在释放模式后有轻微的差别,但是这比3.5倍的速度慢,这是可以接受的。@ SMTTSP:你觉得什么是“可接受的”?应该没有任何区别。比matlab慢1-10%是可以接受的,因为这可能是由于机器状态、其他程序等造成的。但是慢3.5倍是完全不能接受的。