2017-02-10 15 views
0

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

Глядя на this post о бенчмаркинге, ответчик сказал, что зернистость результата составляет 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. Будет ли точный результат? Для обозначения времени, которое я планирую использовать, this function by Andreas Bonini.

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


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

+0

Нет разумного компилятора для оптимизации атомизации –

+2

Что именно подразумевается под словом «атомный» в этом контексте? –

+0

«Является ли функция атомной» означать что-то конкретное в OpenCV? Потому что я не вижу ничего атомного в этой функции, кроме его имени. –

ответ

1

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

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

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

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

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