Я хочу автонастройки мой код, и для этого нужно измерить время, необходимое для некоторой части кода, напримерНужно ли мне волатильность при выборе фрагмента кода?
auto t0 = std::chrono::high_resolution_clock::now();
section_of_code_to_be_timed(arguments);
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>
(std::chrono::high_resolution_clock::now()-t0).counts();
// ... using dt to tweak auto-tuning parameters
Что я беспокоюсь о том, что компилятор может переставить вызовы к std::chrono::high_resolution_clock::now()
и section_of_code_to_be_timed()
, что позволяет аннулировать мое измерение времени. Является ли это веским беспокойством? Если да, могу ли я предотвратить его с объявлением t0
volatile
или иным образом (как)?
(я заметил, что я мог бы использовать RAII идиому, подобный std::lock_guard
, который, кажется, не использовать volatile
...)
Я не думаю, что он может это сделать, потому что функция таймера - это внешний вызов, и компилятор не «знает» его последствия или структуру, поэтому он не будет перемещать его. Потенциальная проблема заключается в том, что 'section_of_code' может быть удален, если он абсолютно ничего не делает, например, только манипулирует данными в стеке и возвращается.Наконец, я не видел, чтобы это было проблемой на практике. Также используйте профайлер, например, kcachegrind. – Mikhail
@ Михаил Я ** не профилирую ** мой код (как видно из Q). 'section_of_code_to_be_timed' не пуст и не может быть оптимизирован. Производительность 'section_of_code_to_be_timed()' зависит от параметров времени выполнения, и я не могу профилировать все возможные комбинации значений. Следовательно, я хочу использовать автонастройку. – Walter
Из любопытства, на какой платформе вы делаете такое умение? –