Существуют значительные издержки при работе с методами .NET в Matlab.
Я провел небольшой тест в Matlab (8.0.0.783 (R2012b)):
v = zeros(10000,1);
for i=1:3
rnd = System.Random();
tic; for j=1:10000, v(j) = rnd.NextDouble(); end; toc;
dt = System.DateTime(2014,1,28,0,0,0);
tic; for j=1:10000, dt = dt.AddSeconds(1); end; toc;
end
Это требует Matlab в моем приложении для ПК. 0,5 секунды для первого цикла и 1 секунда для второго цикла. В чистом .NET-коде это занимает 0,00015 и 0,0002 секунды. Таким образом, накладные расходы при вызове метода объекта .NET в Matlab зависят от объекта и метода .NET под рукой.
Для более сложных методов объекта .NET издержки могут быть еще хуже. Я отвечаю за .NET API для доступа к файлам в специализированном формате научных данных.
Этот .NET API можно использовать из Matlab. В худшем случае вы читаете только одно значение типа double или float каждый раз, когда вызываете метод чтения .NET (файлы временных рядов: на каждый раз для одного элемента существует одно значение (double или float).
Скрипт для чтения такого файла показывает, что Matlab на моем ноутбуке может выполнять несколько менее 1000 вызовов в .NET в секунду.
Забавно, что если я помещаю тот же код в функцию Matlab (в основном, в качестве первой строки в скрипте помещает функцию read_file ()), Matlab выполняет около 6.500 вызовов .NET в секунду. Так что внутри функции Matlab примерно в 8 раз быстрее, чем внутри скрипта, когда дело доходит до вызова этих методов .NET. Это невозможно воспроизвести в приведенном выше тестовом примере.
Суть в том, что при вызове метода .NET из Matlab возникают значительные накладные расходы. Важно сделать .NET api «коренастым» вместо «болтливым».
Мы решили наши проблемы, создав набор метода «chunky helper» в утилите .NET dll, которая выполняет все операции чтения, собирает данные в большую матрицу и возвращает матрицу за один вызов Matlab, сводя к минимуму активность через границу Matlab- .NET.
Основной код .NET, по-видимому, работает так же быстро при запуске из чистого приложения .NET, как при запуске из Matlab.