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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Пережитки С http://www.cyberforum.ru/cpp-beginners/thread793049.html
Добрый день. У меня вопрос по поводу пережитков языка С. Сегодня открыл чужой код и встретил такие конструкции: FILE *p_f = fopen(file_name, "filename"); fprintf(p_f, "VarName= %d\n", someVar);...
C++ ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? void Array::getArray() // вывод массива { for (int ix = 0; ix < size; ix++) cout << setw(5) << ptr; // вывод элементов массива на экран cout << std::endl; // новая строка } ... http://www.cyberforum.ru/cpp-beginners/thread793039.html
C++ Реализация while в своем компиляторе
В качестве курсовой делаю простенький компилятор. На входе он получает примерно подобный код: int y=10; float h=5.2; write(y); float x; x=0; x=x+read; Все работает. Но есть задание добавить...
Сделать функцию, которая принимает двумерный массив и возвращает индексы его максимального элемента(номер строки и столбца), с указателями, С++ C++
Сделать функцию, которая принимает двумерный массив и возвращает индексы его максимального элемента(номер строки и столбца), с указателями, С++
C++ Сделать функцию, которая принимает одномерный массив и возвращает индексы его максимального и минимального элементов, с указателями. С++ http://www.cyberforum.ru/cpp-beginners/thread793026.html
Сделать функцию, которая принимает одномерный массив и возвращает индексы его максимального и минимального элементов, с указателями. С++
C++ Цикл: Найти и напечатать все простые числа, меньше 100 Надо написать программу, которая находит и печатает все простые числа меньше 100, дайте, пожалуйста, пример, от которого можно отталкиваться. Заранее спасибо. подробнее

Показать сообщение отдельно
shau-kote
3 / 3 / 0
Регистрация: 24.06.2012
Сообщений: 50

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

23.02.2013, 15:30. Просмотров 246. Ответов 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.
Соответственно, отчёты профайлера будут слегка иными.
Суть проблемы от этого, впрочем не меняется.
Приношу извинения за такую путаницу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru