Я предполагаю, что вы используете таймер, как, скажем, 10 вычислений в секунду, потому что в противном случае вы просто используете 100% ЦП (если вы также не выполняете ввод / вывод).
Можете ли выустановить прерывание будильника, чтобы оно срабатывало с некоторой разумной частотой, например, 10 или 100 Гц, независимо от того, что еще делает программа, и даже особенно во время ввода-вывода или другого заблокированного времени?
Тогда для каждогоБлок просто ведет счет того, сколько раз из последних 100 прерываний он был активен.Это ваш процент, и стоимость его приобретения минимальна.
Вызывают ли блоки друг друга как подпрограммы?В этом случае при каждом прерывании может потребоваться захватить стек вызовов между блоками, и блок «активен», если он находится где-то в стеке, и он «хрустит», если он находится в конце стека (не в процессе вызова другого блока, и не в I / O).Затем у вас есть выбор в каждом блоке указывать процент времени, когда он «хрустит» (который не будет превышать 100% при суммировании по блокам) или «активен» (который, вероятно, будет превышать 100% при суммировании по блокам).
Значение последнего числа в том, что оно не говорит вам так много «где» время потрачено, оно говорит вам «почему».Это может ответить на такие вопросы, как «Я вижу, что foo занимает много времени, но как я получил там ?»То же самое для ввода / вывода.Это тоже процесс, он просто происходит на другом оборудовании.Вы не хотите игнорировать это, потому что если вы это сделаете, вы можете в конечном итоге сказать: «Почему я использую только небольшую часть процессора? Что за задержка?»