После перехода на страницу github и просмотра руководства в формате pdf на сайте kde docs, я все еще растерялся. Предположим, что в тестовом коде есть две эти строки:
double a1 {asinh(1 / ep)}; // 5 instr.
double b1 {log((1 + sqrt(1 + ep*ep)) / ep)}; // 12 instr.
где ep
это некоторое значение, которое может быть предопределено. Комментарии мои и сделаны в Codeblocks, запустив отладчик с дизассемблером, затем терпеливо нажимая «следующую инструкцию» и считая. Они соответствуют тому, что говорит Какачегринд, если я установлю его, чтобы показать «Сбор инструкций». Я полагаю, это должно иметь смысл (я новичок в C ++, кстати). Но если я переключаюсь на «Оценка цикла», я получаю очень странные показания. Для текущего примера это 115
а также 122
, но другие, на вид похожие выражения, вроде:
double Ap {1.0};
double ep {0.9};
шоу 222
а также 2
(например, выборка показывает 2
для обоих)! Что здесь происходит? Может кто-нибудь объяснить, пожалуйста?
Я думаю, что нашел ответ после многих кликов и привыкнуть к Kcachegrind больше. Общая «оценка цикла» использует эту формулу:
CEst = Ir + 10 L1m + 100 LLm
где
Ir = Instruction Fetch
L1m = L1 Miss Sum
Llm = Last-level Miss Sum
Итак, для моего случая, где CEst
показал 2
а также 222
, но 2 Ir
каждый, первый имел 2
инструкция получает и не пропускает, в то время как другой имел 2
выборки инструкций, но также две ошибки каждого, =>
2*Ir + 10*2*L1m + 100*2*Llm = 2 + 20 + 200 = 222
Это соответствует всем кодам, которые я пробовал.
Других решений пока нет …