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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50
#1

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

23.02.2013, 15:30. Просмотров 225. Ответов 2
Метки нет (Все метки)

Всем доброго времени суток.

Решал я простенькую задачку и решил для интереса посмотреть профайлером как оно там работает. Столкнулся с полным несоответствием тому, что я ожидал увидеть.
Есть примерно такой код:
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++ Не могу разобраться с интерфейсом
С циклом for не могу разобраться C++
C++ Не могу разобраться с qmake
C++ Не могу разобраться с ООП
Не могу разобраться с gotoxy(y,x) C++
Не могу разобраться с dynamic_cast C++
C++ Не могу разобраться с _getch
Не могу разобраться с сортировками C++
Не могу разобраться с оператором while C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6548 / 3968 / 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     Не могу разобраться с отчётом профайлера
Ответ Создать тему
Опции темы

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