Тестирование быстродействия MATLAB и GNU/Octave (original) (raw)

Для работы мне нужно моделировать искажение света атмосферой и компенсировать его - в этом, собственно, основная идея адаптивной оптики и состоит. Ответ на вопрос "как это сделать" может занять пару томов в книге, и чтобы искать ответ было проще, люди создают симуляторы. После долгих раздумий о том, на каком языке его писать, я таки начал писать симулятор на Матлабе - это то, что лучше всего мне известно. Однако есть проблема: МАТЛАБ медленный и лицензии на него стоят немалых денег. Купить лицензию в моём университете не вопрос, но вот медлительность МАТЛАБа это действительно проблема.

MATLAB и GNU/Octave - мы с тобой два берега...

Я ждала и верила,
Сердцу вопреки:
Мы с тобой два берега
У одной реки
(с) песня, из которой слов не выкинешь

Так вот, MATLAB дорогой и медленный, но на нём уже мное написано и он широко распространён. Octave свободная и быстрая, но с дурной документацией и несовместимыми названиями функций, которых к тому же мало. Вот такая трагедия инженерной интеллигенции.

Однако установив Octave3, я был приятно удивлён тому, что октависты всё-таки взялись за ум и начали пилить свой велосипед в правильном направлении. Да, сообщения об ошибках всё так же убоги, а документация оставляет желать много лучшего. Но если закрыть на это глаза, как и на то, что Октава всё ещё не умеет сама строить графики, а вывод mesh на gnuplot занимает вечность, совместимость с MATLAB стала намного, намного лучше чем в Octave2.

И вот, после того, как я оценил Октаву3, я решил запустить свой симулятор на Октаве. К моему большому удивлению, он отработал прекрасно и даже умудрился построить один график (меши строить всё так же не умеет и дёргает для этого Гнуплот, что занимает несколько минут).

Коротко об Octave3 можно сказать так:

Достоинства

+ написано много функций с именами а-ля-MATLAB, что даёт высокую степень совместимости с MATLAB;
+ высокая скорость работы (см.тесты ниже), особенно на преобразовании Фурье;
+ свободная лицензия.

Недостатки

- низкое качество документации в комплекте;
- неинформативные сообщения об ошибках (трудно выполнять отладку программы, если не понятно, в какой функции ошибка);
- графическая оболочка для Octave в стадии альфа-версии;
- отсутствует профайлер (profiler, тестирование скорости выполнения каждой строки кода);
- нет собственного модуля построения графиков (требуется gnuplot, что не всегда работает хорошо);
- большое потребление памяти.

Последний момент меня лично удивил: Октава, не имеющая графической оболочки, на том же fft потребляет больше памяти, чем MATLAB!

Небольшое сравнительное тестрование работы Octave и MATLAB
В своё время мне в комментариях к QtOctave задали вопрос насчёт скорости Октавы. Тогда я внёс его в свой список "что бы ещё посмотреть", а не так давно, когда я приступил к новому проекту, пришлось объяснять шефу выбор Octave вместо Матлаба. А так как графики говорят больше, чем полстатьи, я написал небольшой тестовый скрипт для снятия данных. Скрипт работает на полную мощь только в UNIX, так как я использовал вызовы ps -aux для выяснения, сколько на самом деле потребляется памяти. Если есть предложения по коду скрипта и конструктивная критика, пожалуйста не стесняйтесь в комментариях.

Для тестирования использовался ноутбук Dell Latitude E5100 (Intel Celeron 2.2GHz processor, 2Gb DDR RAM, ATA-100 160Gb HDD, rock-solid Debian GNU/Linux Lenny v.5.0). Использовались MATLAB v7 R14 и Octave 3.0.1 из Debian Lenny. Тест был выполнен при выключенной графической оболочке, результаты усреднены 10 раз. И Матлаб, и Октава были в консольном режиме.

Было интересно протестировать операции сложения и умножения матриц, а также Fast Fourier Transform (FFT) - это самые часто используемые функции в симуляторе. Размеры матриц были от 4x4 до 8192x8192.

Время выполнения операций в MATLAB и Octave

Базовые операции сложения и перемножения матриц (в том числе поэлементного) практически совпадают, что вполне ожидаемо. Однако при время вычисления Fast Fourier Transform разное, и оно не в пользу MATLAB:

a) b)Figure 1.1: Median computation time versus matrix size for: a) FFT function and for b) FFTSHIFT function.

На больших размерах матриц, например 4096х4096, Octave почти в три раза быстрее MATLAB. Следует сказать, что на новых версиях MATLAB, например 2008b, это отставание меньше: например, на MATLAB 2008b под Windows операция FFT на матрице 4096х4096 занимает около 2.8 секунды, в то время как под Octave это всего 1.6 секунд. В этой бочке мёду есть ложка дёгтя - Октава потребляет больше памяти, чем МАТЛАБ.

Потребление памяти в MATLAB и Octave

Увы, но потребление памяти в Octave в целом больше, чем в MATLAB на операциях с Фурье-преобразованием. Это видно на графиках ниже. Для небольших матриц (менее 2048x2048) Октава использует в 2.5-3 раза больше памяти, чем МАТЛАБ, а на больших матрицах (4096х4096 и более) на 10-20% больше. Так что точки для Фурье-преобразования 8192x8192 для Октавы нет. Справедливости ради надо сказать, что новые версии Матлаба (типа 2008), перекормленные джавой, выдают сообщение "out of memory" при попытке посчитать такие огромные матрицы, даже не удосуживаясь попробовать сделать это.

Figure 1.2: Median memory consumption versus matrix size for: a) FFT function and for b) FFTSHIFT function.

a) b)

Так что краткий итог такой: Октава быстрее Матлаба в разы, но потребляет гораздо больше памяти, чем MATLAB.

Бен, ай нид хелп
Проблема в том, что у меня есть матлаб и октава только под Дебианом и хотелось бы, чтобы кто-то запустил тестовую программу на более современных версиях Матлаба под линуксом, виндой и (вдруг таковые отыщутся среди читателей) под MacOSX. Внутри программы ничего менять не надо - она полностью автоматическая. Результат её работы - куча файлов с расширением .data, содержащие данные о затраченном времени и памяти. Последняя версия программы по тестированию производительности лежит в репозитории и её можно забрать по этой ссылке .

В скрипте измерение потребления памяти я организовал через вызов команды ps. Это связано с тем, что мне часто бывает нужно узнать ПОЛНОЕ потребление памяти Матлаба\Октавы, а не номинальное потребление памяти одной переменной. Поэтому возник вопрос: как это сделать под виндой? Матлаба под виндой у меня нет, а октаву ставить довольно долго и могут возникнуть вопросы от ITшников универа.

Если у кого есть идеи по модернизации скрипта - пишите в комментарии, с удовольствием подискутируем.