Когда я тестирую небольшие куски кода/функции, написанные на RcppArmadillo, я вижу иногда невероятное (55x против R для вложенных циклов в простых операциях) до скромного (1.3x против R в течение длительного времени функции). Впечатленный этим, я решил перевести около 400 строк кода, чтобы создать одну C++-функцию (с некоторыми небольшими соседними функциями C++), чтобы заменить интенсивно вычислительный массив моего приложения R.Rcpp/RcppArmadillo C++/R баланс для производительности
Старые результаты: Код RcppArmadillo работает ~ 3 раза медленнее, чем исходный R (обновление - возможно, плохой бенчмарк - работает над ним). Гибридный RcppArmadillo & R варианта коды работает ~ 1.10 раз быстрее, чем R.
Обновления/Уроки: C++ интенсивного код выполняется ~ 6x быстрее, чем гибридный код R & C++. Для всех прохожих ошибки, которые я сделал, следующие:
- Я не учитывал переменную экземпляра в своем R-контролере (несправедливое сравнение).
- Неверные вычисления внутри вложенного цикла C++. В варианте R они были вне указанной петли (включая большой FFT и т. Д.). Человеческая ошибка.
- Передано большое количество параметров функции (большие векторы, матрицы, с литьем и т. Д.). Решил это, портируя больше кода.
- Я не работал с памятью эффективно. Вместо того, чтобы просто использовать их, делались дополнительные копии. Эти копии способствовали читабельности, но, вероятно, повредили производительность. Легко исправить.
- Использование глобальных переменных для уменьшения функции, проходящей над головой, и удаления нескольких крупных временных векторов из некоторых вычислений (векторный размер: 2^15).
Edit (извините за разрывами с первым комментарием на этот пост) Старые вопросы:
- Является ли глобальная переменная экземпляра/предварительное распределение памяти рекомендуется в кодовом пространстве RcppArmadillo, чтобы спасти от многих переменных деклараций в корпусе функции/сборщик мусора? Или Rcpp обрабатывает их так же своевременно, как R?
- Правильно ли я полагаю, что Rcpp теряет определенную производительность из-за сопряжения с R (защитные переменные, сбор мусора и т. Д.)? Если да, где я могу найти код (имя файла)/документацию, где эти операции обрабатываются, чтобы я мог научиться работать с ним лучше.
Любой практический совет оценен. Прошу прощения за неопределенный вопрос: я новичок в SO, новичок в пакете RcppArmadillo, и не написал C++ через 10 лет.
Это очень много (читайте: слишком много) вопросов для одного вопроса. Сделать это быстро: (1) нет; (2) нет; (3) нет; (4) да - все это; но он не медленнее, чем сам R для любого из них; он * медленнее, когда вам нужно преобразовать/скопировать между представлениями объектов R и C++; (5) да, если вы не сделаете что-то не так. Вопрос в том, являются ли эти выгоды достаточно большими, чтобы стоить того. Вопрос, на который нельзя ответить в целом. –
Спасибо Konrad, я думаю, это то, что мне нужно было знать. Я попытаюсь снизить параметры, переданные функции Rcpp, и посмотреть, как это происходит. Если все остальное не работает, я полагаю, что моя программа будет близка к полностью переносится на C++, для чего этот пакет (RcppArmadillo) мог бы помочь в этом. – caseyk
FWIW Я согласен с «слишком много вопросов» Конрада. Я не согласен с тем, что «будет ли это медленнее». Ответ заключается в том, что идентификационный код на идентичном аппарате, построенный под идентичными переключателями **, должен, конечно, выполняться одинаково под всеми метриками. Компьютеры детерминированы. Если ваш «рабочий код» ниже - это чистый код Armadillo, то будет то же самое, независимо от того, вы или нет интерфейс от R. Который не очень медленнее, чем сопряжение вручную через типы «SEXP», как мы показали в тестах. –