Сравнение скорости 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. Это может иметь существенное значение.
кроме этого и того, что уже было сказано здесь, не должно быть никакой разницы. На самом деле, любой достойный компилятор С даже базовыми оптимизациями должен уметь обнаружить, что этот цикл довольно тривиален, и удалить его вообще.