Должен ли я сделать большую функцию атомарной, чтобы точно ее сравнить?

Я хотел бы знать, сколько времени занимает выполнение некоторого кода. Код, который я выполняю, имеет дело с матрицами и операциями openCV. Код будет выполняться в среде ROS в Linux. Я не хочу, чтобы код прерывался системными функциями во время моего теста производительности.

Смотря на эта почта по поводу бенчмаркинга, ответчик сказал, что степень детализации составляет 15 мс. Я хотел бы сделать это намного лучше, и поэтому я решил сделать функцию атомарной (только для целей бенчмаркинга). Я не уверен, что это хорошая идея по нескольким причинам, в первую очередь потому, что у меня нет глубокого понимания архитектуры процессора.


void atomic_wrapper_function(const object& A, const object& B) {
static unsigned long running_sum = 0;
unsigned long before, after;
before = GetTimeMs64();
function_to_benchmark(A, B);
after = GetTimeMs64();
running_sum += (after - before);
}

Функция, которую я пытаюсь оценить, не является короткой функцией.

  1. Будет ли результат точным? Для отметки времени, которое я собираюсь использовать эта функция Андреаса Бонини.

  2. Будет ли это сделать что-то ужасное с моим компьютером? Назовите меня суеверным, но я думаю, что хорошо задать этот вопрос.


Я использую C ++ 11 на ядре Linux.

0

Решение

Атомика C ++ 11 не является атомарной в смысле RTOS, она просто обеспечивает гарантии при написании многопоточного кода. Linux не является ОСРВ. Ваш код может и всегда будет прерван. Есть несколько способов уменьшить эффект, но не без глубокого погружения в Linux.

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

Есть много других вещей, которые могут изменить время выполнения вашего алгоритма, например, несколько уровней кэшей ЦП, функции энергосбережения вашего ЦП и т. Д. Если вы действительно заинтересованы только в сравнительном анализе времени выполнения вашей функции для несложного реального времени проблемы, проще просто запустить алгоритм много раз и получить статистическую оценку времени выполнения.

  1. Вызовите функцию миллиард раз во время эталонного и среднего. ИЛИ ЖЕ
  2. Оцените функцию от 1 до миллиарда раз. Мера времени выполнения, которая вас интересует, должна масштабироваться линейно. Затем выполните некоторую линейную регрессию, чтобы получить оценку этого.

ИЛИ: Вы говорите, что хотите знать, какое влияние алгоритм оказывает на общее время выполнения программы? Используйте инструменты профилирования, такие как callgrind (интегрируется в QtCreator).

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector