2013-05-09 2 views
2

У меня есть графическая программа, и я хочу измерить время выполнения определенных вызовов функций. Поскольку я не уверен, как работает std::cout, я хотел бы спросить, могут ли звонки на него между вызовами таймера повлиять на производительность. Я знаю, что он медленный сам по себе, поэтому я, естественно, не буду помещать его в функции, которые я измеряю, но буферизован/асинхронен, так что эффект будет задерживаться после того, как звонок возвращает? Я хочу сделать что-то вроде этого (псевдокод):Будет ли std :: cout влиять на таймеры?

timer->Start(); 
RunSomeFunction(); 
timer->Stop(); 
std::cout << timer << std::endl; // Could this affect the next timer event? 
timer->Start(); 
RunAnotherFunction(); 
timer->Stop(); 
std::cout << timer << std::endl; 
// etc 
+0

Вывод на 'std :: cout' из одного потока не является асинхронным. 'timer-> Start()' не запускается, пока не закончится запись. – Yuushi

ответ

3

Короче говоря, нет.

Более длинный ответ: Однако это зависит от того, где находится cout, и в какой системе вы фактически работаете.

Как правило, внутренние элементы cout будут использовать какой-то системный вызов «записать в файл», где файл является «стандартным» файловым дескриптором - может быть какое-то устройство отображения, окно или файл, если вывод перенаправляется. Это, скорее всего, приведет к некоторому прерыванию или некоторому процессу в другом месте (например, «cmd.exe» в Windows или «xterm» или аналогичном в Linux/Unix). Если функции ОЧЕНЬ короткие, такого рода «помехи» могут быть достаточно, чтобы изменить результаты - конечно, одинаково возможно, что ваш веб-браузер просыпается, чтобы проверить, есть ли в facebook какие-либо новые элементы, или ваше почтовое программное обеспечение, или даже Аналогичный эффект имеет только сеть из какой-либо другой системы. Тем не менее, в современной системе с достойным многоядерным процессором (до тех пор, пока система еще не использует 100% -ный процессор), эти эффекты должны быть довольно маленькими и на самом деле не очень важны - мы говорим cout или любой других потенциальных факторов.

Редактирование: Кроме того, для очень чувствительного кода эффект вызова cout (или любая другая функция, которая больше, чем несколько строк длиной [или петли вокруг чтения больших кусков памяти, даже если несколько строк]), повлияет содержимое кеша, которое может повлиять на выполнение кода.

+1

+1 отличный подробный ответ, особенно как примечание о 'cout', влияющем на кеш. –

2

Технически std::cout (а также большинство функций) может привести к потере некоторых страниц RAM или заполнению буферов ОС или созданию дополнительной нагрузки для ОС другим способом. Но это не должно быть заметно.

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

Смежные вопросы