The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! xintrea, 12-Ноя-14, 17:02  [смотреть все]
  • Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! skb7, 18:28 , 12-Ноя-14 (1)
    Не знаю как в C++, но в чистом C "inline" -- это лишь рекомендация компилятору встраивать эти функции. Компилятор часто игнорирует эту рекомендацию (когда функция больше 1-2 строк). Единственный способ реально инлайнить функции, который я знаю, -- это макросы (#define). Даже attribute((always_inline)) на помогает, он просто говорит сохранять смысл inline (рекомендация на встраивание) при отключенных оптимизациях (-O0).

    Смотрим http://en.wikipedia.org/wiki/Inline_function :


    The compiler may ignore the programmer’s attempt to inline a function, mainly if it is particularly large.

    Например вот код:


    #include <stdio.h>
    #include <stdlib.h>

    inline int f1(int a)
    {
        return a + 1;
    }

    inline int f2(int a)
    {
        int i;

        for (i = 0; i < 10; ++i) {
            if (a < 5)
                a += 2;
            else
                a += 3;
        }

        printf("f2 done\n");

        return a;
    }

    int main(void)
    {
        int x = 5;

        x = f1(x);
        x = f2(x);

        printf("x = %d\n", x);

        return EXIT_SUCCESS;
    }

    Компилируем и смотрим какие функции заинлайнились, а какие нет:


    $ gcc -Wall -O2 main.c
    $ objdump -DCS a.out | less

    Видем следующую картину:


    0000000000400450 <main>:
      400454:       bf 06 00 00 00          mov    $0x6,Мi
      400459:       e8 22 01 00 00          callq  400580 <f2>
      ...

    Т.е. компилятор вообще соптимизировал вызов f1(), на этапе компиляции выполнив "5+1=6", а вот f2() уже не инлайнил и она действительно вызывается.

    Вывод: проверяйте через objdump, какие функции заинлайнились, а какие нет. Соответственно те, которые не заинлайнились, gprof может видеть.
    Вывод 2: если реально нужно инлайнить, попробуйте always_inline, а есть не поможет, то используйте макросы через #define

    • Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! pavlinux, 03:38 , 13-Ноя-14 (4)
      • Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! skb7, 13:23 , 13-Ноя-14 (7)
        > static inline int f1(int a) __attribute__((always_inline));
        > static inline int f2(int a) __attribute__((always_inline));

        Я вам даже больше скажу, если удалить эти строки, функции всё равно заинлайнятся. Они у вас инлайнятся, потому что они у вас static, а не always_inline. always_inline только и позволяет что инлайнить с отключенными оптимизациями. Если хотите инлайнить всегда -- смотрите в сторону атрибута flatten. И то может не заинлайниться. Поэтому #define рулит :)

        Отсюда https://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/Function-Attrib... :


        always_inline
            Generally, functions are not inlined unless optimization is specified. For functions declared inline, this attribute inlines the function even if no optimization level was specified.

        flatten
            Generally, inlining into a function is limited. For a function marked with this attribute, every call inside this function will be inlined, if possible. Whether the function itself is considered for inlining depends on its size and the current inlining parameters.


  • Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! skb7, 18:50 , 12-Ноя-14 (2)
    А еще хотелось бы покритиковать вашу функцию :) Которая RC5_GetByteFromWord().
    1. Функция легко упрощается до формы:

    inline unsigned char RC5Simple::RC5_GetByteFromWord(RC5_TWORD w, int n)
    {
    switch (n) {                                                                                  
    case 0:
        return w & 0x000000FF;
    case 1:
        return (w & 0x0000FF00) >> 8;
    case 2:
        return (w & 0x00FF0000) >> 16;
    case 3:
        return (w & 0xFF000000) >> 24;
    default:
        return 0;
    }

    2. И вообще, то что вы хотите сделать, делается в одну строку :)

    inline unsigned char RC5Simple::RC5_GetByteFromWord(RC5_TWORD w, int n)
    {
        return (w >> (n*8)) & 0xff;
    }

    Тогда может и заинлайнится функция, а если нет, то:


    #define GET_BYTE(w, n) ((w) >> ((n)*8) & 0xff)

    Только у макроса свои недостатки, на которые можно напороться.

  • Должны ли быть видны в inline-функции в профиляторе Gprof ?, !*! pavlinux, 03:52 , 13-Ноя-14 (6)



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру