Сравнение скорости Matlab vs c++ в этом коде

Я написал простой код C++ и протестировал его на C++, затем я адаптировал тот же код для MATLAB по mex file_name.cpp и запустите тот же код в 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, i.e переход на подходящие типы, добавление MEX-функции и т. д., а результаты-около 900ms в MATLAB в отличие от 3100 ms в C++.

чего я не понимаю оба работают с одним и тем же кодом и с одним и тем же компилятором (в MATLAB я пишу mex -setup в командной строке и выбран компилятор Visual Studio в качестве компилятора MEX), однако MATLAB вокруг в 3,5 раза быстрее.

что делает MATLAB, чтобы быть быстрее, и что не делает C++? Может кто-нибудь объяснить мне, почему существует такая огромная разница? Я пробовал некоторые другие коды, все в 3-6 раз быстрее в MATLAB.

Мой компьютер 64-разрядная Windows 7, Visual Studio 2010 используется для C++, MATLAB-R2012b.

возможно ли это из-за моей версии Visual Studio? Если я изменю его на VS2012, будет ли это быстрее?

mex-v выход здесь.

спасибо,

2 ответов


производительность сильно зависит от платформы, ОС, компилятора и т. д. Что бы Matlab ни делал в этом случае, ему каким-то образом удалось найти оптимизацию, которую компилятор VS2010 не сделал. Я бы рискнул предположить, что обновление до VS2012 не будет иметь существенного значения, но я могу ошибаться. В конце концов, это другой компилятор.

Я признаю, что это несколько удивительно, но проверьте флаги компиляции и попробуйте профилирование с разными конфигурациями. Если ваша установка Matlab 32-разрядная, что также может иметь значение.

также могут быть небольшие различия в вашем коде, возможно, достаточно незначительные, что вы, возможно, не заметили. Ваш код может быть связан с другими библиотеками, которые также могут иметь большие различия в производительности.

урок здесь в том, что это может быть очень трудно определить ровно почему одна вещь работает лучше, чем другая.

EDIT: Вы упомянули, что код компилируется для отладки. Это только еще больше увеличивает вариацию того, что будут выводить компиляторы, поскольку активация параметров отладки может также отключить другие оптимизации, и каждый компилятор имеет другое представление о том, какая отладочная информация важна и стоит придерживаться вашего кода.

Я бы рекомендовал отключить все параметры отладки, чтобы получить более согласованный вывод. Я бы также рекомендовал убедиться, что вы компилируете с аналогичными уровнями оптимизации, возможно, либо максимально возможное или не совсем.


в коде C++ вы используете int k во внутреннем цикле, в то время как в коде MATLAB вы используете double a (и как ни странно, изменение от a++ написать a=a+1...)

вы оставляете их обоих unininialized; посмотреть этот вопрос почему это плохо.

mex файлы по умолчанию в ANSI C. ваш код действительно выглядит так. Дважды проверьте свой mex -setup; возможно, вы случайно выбрали C-компилятор, думая, что выбираете c++.

также убедитесь, что у вас есть точно такой же набор опций компилятора для компиляции. ровно то же самое.

но я думаю, что суть дела в том, что вы делаете целое арифметика в версии C++ и двойной арифметика в версии MATLAB. Это может иметь существенное значение.

кроме этого и того, что уже было сказано здесь, не должно быть никакой разницы. На самом деле, любой достойный компилятор С даже базовыми оптимизациями должен уметь обнаружить, что этот цикл довольно тривиален, и удалить его вообще.