Discussion:
funciones inline
(demasiado antiguo para responder)
Guillermo
2005-12-27 20:06:55 UTC
Permalink
Hola
Estoy tratando de optimizar el código de un programa que estoy
haciendo. Resulta que el programa esta escrito en ANSI C y hace
millones de llamadas a un grupo de funciones. Yo deseo colocar estas
funciones inline para mejorar el tiempo de ejecución. El problema que
encuentro es que hay varios tipos de funciones inline. Está el inline,
static inline y el extern inline. Lei los manuales que encontre en
linea y la documentacion de gcc pero la verdad es que me resulta algo
confusa y a veces contradictoria. Probé con las 3 combinaciones y no
encontre diferencias, por lo que mi pregunta al foro es: Alguien me
puede dar una definición clara y precisa de los tipos de inline?
Gracias
Guillermo
Manuel Petit
2005-12-28 06:07:49 UTC
Permalink
Post by Guillermo
Hola
Estoy tratando de optimizar el código de un programa que estoy
haciendo. Resulta que el programa esta escrito en ANSI C y hace
millones de llamadas a un grupo de funciones. Yo deseo colocar estas
funciones inline para mejorar el tiempo de ejecución. El problema que
Estas enfocandolo de la manera equivocada. En vez de preocuparte por que
las funciones sean inline o no, deberías preocuparte por el número
monstruoso de llamadas y hacer tu código un poco mas "listo".
Post by Guillermo
encuentro es que hay varios tipos de funciones inline. Está el inline,
static inline y el extern inline. Lei los manuales que encontre en
linea y la documentacion de gcc pero la verdad es que me resulta algo
confusa y a veces contradictoria. Probé con las 3 combinaciones y no
encontre diferencias, por lo que mi pregunta al foro es: Alguien me
puede dar una definición clara y precisa de los tipos de inline?
Simplemente tienes un tipo: inline. Extern y static son "storage class
modifier". Inline es un "function specifier". Para mas detalles sobre la
semantica de combinarlos mirate la sección 6.7.4 del standard (ISO9899:1999)

En cualquier caso, inline es solo una sugerencia... el compilador puede
hacer caso omiso de ella cuando le parezca. Y tu problema parece que
esta mas asociado con la pobreza de algoritmos que con
micro-optimizaciones como inline. Ese tipo de optimizaciones solo tiene
efecto importante cuando la cantidad de trabajo que hace una función es
comparable al coste de llamarla; funciones del tipo:

int suma (int a, int b) { return a+b; }

Para funciones que hagan algún trabajo de verdad, pues te da lo mismo
que una función tarde 101 usecs que el que tarde 109.98 usecs gracias a
un inline, lo que tienes es que cambiar el algoritmo para que tarde 10
usecs.

El hecho de que digas "millones de llamadas a un grupo de funciones"
sugiere que tu código esta haciendo mas trabajo del necesario. El hecho
de que saltes directamente a inline sugiere que no has usado gprof,
quantify o cualquier otra herramienta similar para tener una vision
exacta de donde se va el tiempo. Y el hecho de que poniendolas como
inline no cambie nada, indica que esas funciones son lo suficientemente
complicadas como para que: (i) el compilador pase de ponerlas inline, o
(ii) estas ahorrando nanosegundos en una función que tarda cientos de
microsegundos, o (iii) sea practicamente imposible poner esas funciones
como inline (por ejemplo varia funciones mutuamente recursivas.)

En resumén y sin enrollarme mas, parece que estas optimizando a ciegas.


manuel,
Post by Guillermo
Gracias
Guillermo
Zara
2005-12-28 07:07:44 UTC
Permalink
Post by Guillermo
Hola
Estoy tratando de optimizar el código de un programa que estoy
haciendo. Resulta que el programa esta escrito en ANSI C y hace
millones de llamadas a un grupo de funciones. Yo deseo colocar estas
funciones inline para mejorar el tiempo de ejecución. El problema que
encuentro es que hay varios tipos de funciones inline. Está el inline,
static inline y el extern inline. Lei los manuales que encontre en
linea y la documentacion de gcc pero la verdad es que me resulta algo
confusa y a veces contradictoria. Probé con las 3 combinaciones y no
encontre diferencias, por lo que mi pregunta al foro es: Alguien me
puede dar una definición clara y precisa de los tipos de inline?
Gracias
Guillermo
Es igual que en otras funciones:
extern inline e inline describen una función global, mientras que
static inline define una función local.

Zara
Antoine Leca
2005-12-28 16:00:04 UTC
Permalink
Yo deseo colocar estas funciones inline para mejorar el tiempo de
ejecución.
Cuidado que los compiladores actuales saben cambiar funciones a inline por
si solo, sin que le dices nada. ¡Qué listos!


Si hay "zilliones de llamadas a un reducido número de funciones", es que no
has acabado los deberes: deberías saber la función la más utilizada (en
tiempo, no en veces), despues la siguiente, etc. Eso se llama perfilar (¿?)
Y después ver cómo mejorar el tiempo "perdido" en la primera, después la
segunda, etc.


Antoine

Loading...