для моего проекта У меня есть программа R, которая много раз вызывает функцию C, реализованную с использованием #include <R.h>
и #include <Rdefines.h>
. Поскольку я хочу максимально ускорить весь алгоритм, я закодировал R-программу непосредственно на C++, поэтому, чтобы удалить слой трансляции между C и R. Я назвал ранее закодированную функцию C из C++ в качестве обычной функции. Я смог выполнить перевод и получить тот же результат.R вызов кода C быстрее, чем вызов функции C++ на C-код?
Глядя на время работы, я обнаружил, что выполнение R выполняется быстрее, чем C++ (2 м 10 с против 2 м 50 с). Чтобы узнать, где «проблема», я использовал два профайлера: gprof и Valgrind, которые сообщают об использовании времени выполнения в 99% времени с помощью внешней функции C. Это не дает мне объяснений в отношении этой разницы во время выполнения 30%, в то время как 99% времени тратится на выполнение одного и того же кода. Для интеграции C++ и C я попробовал обе ссылки на объектный файл C и связал все .o из C с созданием единой библиотеки (libExternal.a). Есть ли у вас какие-либо предположения, которые могут быть причиной этой разницы?
Я приложил часть отчета valgrind. Внешняя функция C подчеркнута.
Спасибо!
Вот результат перфорация стат -d по программе C++: Вот результат перфорация стат -d по программе R:
Я хочу напомнить вам, что 99% времени проводится в функции C, которая одинакова для обоих. В коде C++ я просто создаю объекты перед передачей функции, поэтому данные должны быть рядом друг с другом в памяти. Благодарим за помощь.
Включите код пожалуйста. – nrussell
или включить * некоторые * код, который также показывает проблему. или даже код контрпримера. Выполнение этого может быть даже достаточно для вас, чтобы выяснить проблему самостоятельно ... – Spacedman
Я не могу добавить код, так как он слишком длинный, и это не поможет. Что я могу сказать, чтобы объяснить, что делает алгоритм, так это то, что я выполняю итерацию по матрице данных, сделанной во входе, и в зависимости от индекса я динамически создаю несколько массивов, чтобы содержать некоторые результаты, и передаю массивы и матрицу данных в c функция, которая оценивает некоторые меры на них, возвращая массив. R делает то же самое, но объекты, которые проходят, являются объектами R, которые преобразуются в c-массивы с помощью кода c. – Nadir