Вот программа, в которой sleep
использует почти 100% циклов процессора, предоставленных приложению:
for (i = 0; i < bigNumber; i++){
sleep(someTime);
}
Почему? Потому что он не использует очень много реальных циклов процессора,
и из тех, что он использует, почти все они тратятся на вход и выход sleep
.
Значит ли это, что это настоящая проблема? Конечно нет.
Это проблема с профилировщиками, которые смотрят только на процессорное время.
Вам необходим сэмплер, который производит выборку по времени настенных часов, а не по времени ЦП.
Он должен сэмплировать стек, а не только счетчик программ.
Он должен показать вам по строке кода (не по функции) долю выборок стека, содержащих эту строку.
Обычное возражение против выборки по настенным часам состоит в том, что измерения будут неточными из-за разделения машины с другими процессами.
Но это не имеет значения , потому что для поиска временных затрат не требуется точность измерений.
Требуется точность местоположение .
То, что вам нужно, - это точное расположение кода и сайты вызовов, которые находятся в стеке с нормальной долей фактического времени, что определяется выборкой из стека, не связанной с состоянием программы.
Конкуренция с другими процессами не меняет долю времени, в течение которого сайты вызовов находятся в стеке, на достаточно большую величину, чтобы привести к отсутствию проблем.