.NET производительность от Matlab - PullRequest
7 голосов
/ 28 марта 2012

У меня есть большой набор симуляторов, написанный на Matlab, но из-за опасений по поводу лучшего взаимодействия с другими внутренними проектами (а также со скоростью выполнения) я думаю о переносе некоторых функций в .NET и вызове таких объектов из Matlab. Какие издержки связаны с вызовом объектов .NET из в Matlab?

Вот хорошее обсуждение Matlab OO , которое не говорит о .NET

Редактировать : Краткое исследование

Я самостоятельно провел быстрый тест из Matlab с простыми операциями доступа и назначения в различных объектах, включая формальные объекты Matlab (R2011b), Java и .NET, каждый из которых вызывался 1 000 000 раз. Вызовы методов относятся к внутренним циклам, вызовы свойств / полей относятся к доступу к общедоступному полю из Matlab и к циклам в Matlab. Последние результаты меня озадачивают, так как накладные расходы на .NET намного выше, чем на Java, но фактическое время выполнения составляет около половины. Что происходит?

    Access(s)  Assign(s)  Type of object/call
    --- MATLAB ---
    0.003361   0.004268   'myObj.field'
    0.003403   0.004263   'myStruct.field'
    0.003376   0.003392   'myVar'   
    0.152629   0.303579   'myHandleObj.field'
    25.79159   -          'TestConstant.const'
    0.003384   -          'myTestConstant.const' (instance)
    0.006794   0.008689   'TestObj.methods'
    0.157509   0.303357   'TestHandleObj.methods'

    --- NON-MATLAB ---
    10.70006   16.42527   'JavaObj fields'
    0.005063   0.005441   'JavaObj methods'
    43.49988   43.96159   'NetObj fields'
    0.002194   0.002306   'NetObj methods'

Ответы [ 2 ]

3 голосов
/ 28 января 2014

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

0 голосов
/ 16 июля 2012

Работающее приложение потребляет ресурсы для пересчета и перерисовки данных с использованием инструментов GD I / GD I +.Обе операции не связаны друг с другом.Пересчет означает сортировку, фильтрацию, группировку и все другие операции, кроме перерисовки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...