Почему я не вижу значительное ускорение при использовании компилятора MATLAB?

Попробуйте вызвать flutterWebviewPlugin.onDestroy.listen() внутри initstate () виджета ... у меня это нормально работает ...

9
задан Amro 11 September 2011 в 14:46
поделиться

11 ответов

Я отзовусь эхом что сказанный dwj: если Ваш код MATLAB является медленным, это, вероятно, потому что он не достаточно векторизован. Если Вы делаете явные циклы, когда Вы могли делать операции на целых массивах, это - преступник.

Это применяется одинаково ко всем ориентированным на массив динамическим языкам: Язык описания данных Perl, Числовой Python, MATLAB/октава, и т.д. Это даже верно в некоторой степени в скомпилированном C и скомпилированном коде ФОРТРАНА: особенно разработанные библиотеки векторизации обычно используют тщательно кодированные рукой внутренние циклы и инструкции SIMD (например, MMX, SSE, AltiVec).

14
ответ дан 4 December 2019 в 05:53
поделиться

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

Если Вы делаете, файловый ввод-вывод высматривают чтение данных в одной части за один раз. Посмотрите в справочных файлах для векторизованной версии fscanf.

Не забывайте, что MATLAB включает профилировщика, также!

19
ответ дан 4 December 2019 в 05:53
поделиться

При использовании компилятора MATLAB (на последней версии MATLAB) затем, Вы не будете почти наверняка видеть ускорений вообще. Это вызвано тем, что весь компилятор на самом деле делает, дают Вам способ упаковать Ваш код так, чтобы он мог быть распределен людям, у которых нет MATLAB. Это ни во что не преобразовывает его быстрее (такие как машинный код или C) - это просто переносит его в C, таким образом, можно назвать его.

Это делает это, заставляя Ваш код работать на Времени выполнения компилятора MATLAB (MCR), которое является по существу MATLAB вычислительное ядро - Ваш код все еще интерпретируется. Благодаря штрафу, понесенному при необходимости вызвать MCR, можно найти, что скомпилированный код работает более медленно чем при простом выполнении его на MATLAB.

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

Более старые версии компилятора работали по-другому, и ускорения могли произойти в определенных ситуациях. Поскольку Mathwork берет это движение к

http://www.mathworks.com/support/solutions/data/1-1ARNS.html

22
ответ дан 4 December 2019 в 05:53
поделиться

Во-первых, я второй все вышеупомянутые комментарии о профилировании и векторизации.

Для исторической перспективы...

Более старая версия Matlab позволила пользователю преобразовывать m файлы в функции mex путем предварительного парсинга кода m и преобразования его в ряд matlab вызовы библиотеки. Эти вызовы имеют всю проверку ошибок, которую сделал интерпретатор, но старые версии интерпретатора и/или синтаксического анализатора онлайн были медленными, так компилировали, m файл будет иногда помогать. Обычно помогало, когда у Вас были циклы, потому что Matlab был достаточно умен встроить часть этого в C. Если у Вас есть одна из тех версий Matlab, можно попытаться говорить mex сценарию сохранить.c файл, и Вы видите точно, что он делает.

В более поздней версии (вероятно, 2006a и позже, но я не помню), MathWorks начал использовать своевременный компилятор для интерпретатора. В действительности этот JIT-компилятор автоматически компилирует все функции mex, так явно выполнение, это офлайн не помогает вообще. В каждой версии с тех пор, они также приложили много сил для создания интерпретатора намного быстрее. Я полагаю, что более новые версии Matlab даже не позволяют Вам автоматически скомпилировать m файлы в файлы MEX, потому что он больше не имеет смысла.

5
ответ дан 4 December 2019 в 05:53
поделиться

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

На другие ответы, векторизуя Ваш код полезно. Но, JIT MATLAB довольно хорош в эти дни, и много вещей работает примерно также векторизованный или нет. That'a для не высказывания нет выигрышей в производительности, которые будут получены от векторизации, это - просто не чудодейственное средство, которым это однажды было. Единственный способ действительно сказать состоит в том, чтобы использовать профилировщика для обнаружения, где код видит узкие места. Часто времена там являются некоторыми местами, где можно сделать локальный рефакторинг для реального улучшения производительности кода.

Существует несколько других аппаратных подходов, можно взять производительность. Во-первых, большая часть подсистемы линейной алгебры является многопоточной. Можно хотеть удостовериться, что Вы включили это в своих предпочтениях, если Вы работаете над многоядерной или многопроцессорной платформой. Во-вторых, Вы можете использовать панель инструментов параллельных вычислений, чтобы воспользоваться большим преимуществом нескольких процессоров. Наконец, если Вы - пользователь Simulink, Вы можете использовать emlmex для компиляции м-кода в c. Это особенно эффективно для работы фиксированной точки.

3
ответ дан 4 December 2019 в 05:53
поделиться

Вы попытались представить свой код? Вы не должны векторизовать ВЕСЬ свой код, просто функции, которые доминируют над временем выполнения. Профилировщик MATLAB даст Вам некоторые подсказки, где Ваш код проводит большую часть времени.

Существует много других вещей Вы, необходимо читать на разделе Tips For Improving Performance в руководстве MathWorks.

2
ответ дан 4 December 2019 в 05:53
поделиться

Как другие отметил, медленный код Matlab часто является результатом недостаточной векторизации.

Однако иногда даже отлично векторизованный код является медленным. Затем у Вас есть еще несколько опций:

  1. Посмотрите, существуют ли какие-либо библиотеки / панели инструментов, можно использовать. Они обычно писались, чтобы быть очень оптимизированными.
  2. Представьте свой код, найдите трудные пятна и перепишите пятна в плоскости C. Соединение C код (как DLLs, например) к Matlab легко и охвачено в документации.
0
ответ дан 4 December 2019 в 05:53
поделиться

Я голосовал бы за профилирование +, затем смотрят на то, что является узкими местами.

Если узкое место является матричной математикой, Вы, вероятно, не собираетесь делать немного лучше... КРОМЕ одного большого глюка распределение массива. например, если у Вас есть цикл:

s = [];
for i = 1:50000
  s(i) = 3;
end

Это должно продолжать изменять размер массива; это намного быстрее для предварительной калибровки массива (запустите с нулей или NaN), и заполните его оттуда:

s = zeros(50000,1);
for i = 1:50000
  s(i) = 3;
end

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

Если узкое место является материалом, который MATLAB не делает быстро (определенные типы парсинга, XML, материала как этот) затем, я использовал бы Java, так как MATLAB уже работает на JVM, и это взаимодействует через интерфейс действительно легко в произвольные файлы JAR. Я посмотрел на взаимодействие через интерфейс с C/C++, и это ДЕЙСТВИТЕЛЬНО ужасно. Microsoft COM в порядке (только в Windows), но после изучения Java я не думаю, что буду когда-либо возвращаться к этому.

1
ответ дан 4 December 2019 в 05:53
поделиться

MCC не ускорит Ваш код вообще - это не действительно компилятор.

Перед отказом необходимо выполнить профилировщика и фигуру, куда все время идет (Инструменты-> Открывают Profiler). Кроме того, разумное использование "тика" и "toc" может помочь. Не оптимизируйте свой код, пока Вы не знаете, куда время идет (не пытайтесь предположить).

Следует иметь в виду что в matlab:

  • операции разрядного уровня являются действительно медленными
  • файловый ввод-вывод является медленным
  • циклы являются обычно медленными, но векторизация быстра (если Вы не знаете векторный синтаксис, изучаете это),
  • базовые операции действительно быстры (например, умножение матриц, fft),
  • если Вы думаете, что можно сделать что-то быстрее в C/Fortran/etc, можно записать файл MEX
  • существуют коммерческие решения для преобразования matlab в C (Google "matlab к c"), и они работают
1
ответ дан 4 December 2019 в 05:53
поделиться

Компилятором Matlab Вы, вероятно, имеете в виду MCC команды, который действительно ускоряет код немного путем хитрости интерпретатора Matlab. Что ускорилось бы, код MAtlab значительно (фактором 50-200) является использованием фактического кода C, скомпилированного командой mex.

-1
ответ дан 4 December 2019 в 05:53
поделиться

Вы могли портировать свой код на "Встроенный Matlab" и затем использовать Семинар в реальном времени для перевода его в C.

Встроенный Matlab является подмножеством Matlab. Это не поддерживает Массивы ячеек, Графику, Marices динамического размера или некоторые Матричные способы адресации. Это может приложить значительные усилия к порту к Встроенному Matlab.

Семинар в реальном времени в ядре продуктов Генерации кода. Это выкладывает универсальный C или может оптимизировать для диапазона встроенных Платформ. Большая часть межотдыха Вам является, возможно, xPC-целью, которая рассматривает аппаратные средства общего назначения как встроенную цель.

1
ответ дан 4 December 2019 в 05:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: