C ++比MATLAB慢

时间:2015-08-02 13:55:31

标签: c++ matlab

我正在尝试生成5000乘5000的随机数矩阵。这是我用MATLAB做的事情:

for i = 1:100
    rand(5000)
end

这就是我在C ++中所做的:

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <ctime>

using namespace std;


int main(){

    int N = 5000;
    double ** A = new double*[N];
    for (int i=0;i<N;i++)
        A[i] = new double[N];


    srand(time(NULL));

    clock_t start = clock();
    for (int k=0;k<100;k++){
        for (int i=0;i<N;i++){
            for (int j=0;j<N;j++){
                A[i][j] = rand();
            }
        }
    }

    cout << "T="<< (clock()-start)/(double)(CLOCKS_PER_SEC/1000)<< "ms " << endl;

}

MATLAB大约需要38秒,而C ++大约需要90秒。 在另一个问题中,人们执行相同的代码并获得相同的C ++和MATLAB速度。

我使用visual C ++进行以下优化 http://i.stack.imgur.com/HXP8i.png

我想知道我在这里缺少什么?谢谢你的帮助。

编辑:这是关键的事情...... Why MATLAB is faster than C++ in creating random numbers?

在这个问题中,人们给了我答案,他们的C ++速度与MATLAB相同。当我使用相同的代码时,我的速度会变得更差,而我正在努力理解为什么。

4 个答案:

答案 0 :(得分:3)

在您的C ++代码中,您正在堆上执行5000次double [5000]分配。如果你单次分配一个双[25000000],你可能会获得更好的速度,然后你自己的算术将你的2个索引转换为单个索引。

答案 1 :(得分:3)

您的测试存在缺陷,正如其他人所指出的那样,甚至没有解决标题所做的陈述。您正在将内置的Matlab函数与C ++进行比较,而不是Matlab代码本身,实际上它比C ++执行速度慢100倍。 Matlab只是C / Fortran中BLAS / LAPACK库的一个包装器,所以人们会期望一个Matlab脚本,一个完全编写的C ++大致相当,实际上它们是:Matlab 2007b中的这段代码

tic; A = rand(5000); toc

在我的机器上执行810毫秒

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <ctime>

#define N 5000
int main()
{
    srand(time(NULL));

    clock_t start = clock();

    int num_rows = N,
        num_cols = N;
    double * A = new double[N*N];
    for (int i=0; i<N*N; ++i)
        A[i] = rand();

    std::cout << "T="<< (clock()-start)/(double)(CLOCKS_PER_SEC/1000)<< "ms " << std::endl;

    return 0;
}

在830ms内执行。 Matlab内部RNG优于rand()的一个小优势并不令人惊讶。另请注意单个索引。 这就是Matlab在内部执行的操作。然后它使用一个聪明的索引系统(由其他人开发)为您提供类似矩阵的数据接口。

答案 2 :(得分:0)

我相信MATLAB在您的机器上使用多个cpu内核。您是否尝试编写多线程版本并测量差异?

此外,(伪)随机的质量也会略有不同(但不是那么多)。

答案 3 :(得分:0)

根据我的经验,

  • 首先检查您是否在发布模式下而不是在调试模式下执行C ++代码。 (虽然我在图片中看到你处于发布模式)
  • 考虑MPI并行化。
  • 请记住,MATLAB经过高度优化,并使用英特尔编译器进行编译,从而生成更快的可执行文件。如果你能负担得起,你也可以尝试更高级的编译器。
  • 最后,您可以通过使用函数在单个循环中生成i,j的组合来进行循环聚合。 (在python中,这是product库中函数itertools给出的常见做法,请参阅this

我希望它有所帮助。