Форум программистов, компьютерный форум CyberForum.ru

Не могу разобраться с отчётом профайлера - C++

Восстановить пароль Регистрация
 
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
23.02.2013, 15:30     Не могу разобраться с отчётом профайлера #1
Всем доброго времени суток.

Решал я простенькую задачку и решил для интереса посмотреть профайлером как оно там работает. Столкнулся с полным несоответствием тому, что я ожидал увидеть.
Есть примерно такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// ввод n
 
for (int i = 0; i <= n; ++i) 
    if (is_palindrome(i) && is_palindrome(i*i))
        // вывести число-палиндром, квадрат которого тоже палиндром
 
// ...
 
int number_length(long n) { /* ... */  }
 
bool is_palindrome(long n) 
{   
    if (n < 10) 
        return false;
 
    int len = number_length(n);
    
    // ...
}
Скомпилировал я его gcc (MinGW) с ключом -pg и при n = 100 получаю следующие результаты:
Код
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00      110     0.00     0.00  is_palindrome(long)
  0.00      0.00     0.00      100     0.00     0.00  number_length(long)
Т.е., как и ожидалось, вызовов number_length() на 10 меньше, чем is_palindrome(). Но почему is_palindrome() вызывается всего 110 раз, если она дважды вызывается в цикле на сто итераций?

Дальше - больше. Вводим n = 100 000 и смотрим результат:
Код
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  ns/call  ns/call  name    
 75.00      0.03     0.03   101090   296.77   395.69  is_palindrome(long)
 25.00      0.04     0.01   100764    99.24    99.24  number_length(long)
Т.е. is_palindrome() была вызвана на 2 * 100 000 - 101 090 = 98 910 раз меньше ожидаемого, к тому же в этот раз и у number_length() "пропали вызовы".

Объясните, пожалуйста, с чем связаны таки результаты?
У меня предположение, что компилятор сам встраивает некий механизм кеширования, оно имеет отношение к действительности?

Добавлено через 8 минут
Небольшая поправка (не могу уже отредактировать оригинальное сообщение).
В цикле предполагалось i < n.
Соответственно, отчёты профайлера будут слегка иными.
Суть проблемы от этого, впрочем не меняется.
Приношу извинения за такую путаницу.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 15:30     Не могу разобраться с отчётом профайлера
Посмотрите здесь:

C++ не могу разобраться
C++ Не могу разобраться в С++
C++ не могу разобраться
C++ не могу разобраться
не могу разобраться с написанием 3 программ. не могу никак, лабы сдавать надо. Спасибо заранее! C++
Не могу разобраться C++
не могу разобраться C++
C++ Не могу разобраться

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.02.2013, 15:42     Не могу разобраться с отчётом профайлера #2
Цитата Сообщение от shau-kote Посмотреть сообщение
Т.е., как и ожидалось, вызовов number_length() на 10 меньше, чем is_palindrome(). Но почему is_palindrome() вызывается всего 110 раз, если она дважды вызывается в цикле на сто итераций?
a && b - если выражение а ложно, выражение b не вычисляется
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
23.02.2013, 16:34  [ТС]     Не могу разобраться с отчётом профайлера #3
Я идиот! >_<
Весь интернет перерыл в поисках особенностей оптимизации gcc, а про обычные ленивые вычисления логических выражений и не подумал.
Спасибо, Jupiter.
Yandex
Объявления
23.02.2013, 16:34     Не могу разобраться с отчётом профайлера
Ответ Создать тему
Опции темы

Текущее время: 19:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru