2012-08-22 8 views
5
#define getcx getchar_unlocked 
inline void inp(int &n)//fast input function 
{ 
    n=0; 
    int ch=getcx();int sign=1; 
    while(ch < '0' || ch > '9'){if(ch=='-')sign=-1; ch=getcx();} 

    while( ch >= '0' && ch <= '9') 
      n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); 
    n=n*sign; 
} 

Hola He estado utilizando la función anterior para la entrada en varios concursos de codificación, pero nunca pude entender por qué es rápido. Conozco la lógica, pero no conozco el concepto de su solidez. Por ejemplo, ¿qué está haciendo esta línea? #define getcx getchar_unlocked ". Además no conozco a ninguna función de salida rápida todo, hay una función de salida rápida tambiénFunción de salida de entrada rápida

+0

Aquí hay otra pregunta sobre este tema: http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

Como el nombre de la función sugiere que no es seguro para subprocesos, un subproceso seguro la función de entrada que utiliza un mecanismo de sincronización puede tener una sobrecarga de rendimiento significativa frente a esta. –

+0

A juzgar por el formato de código horriblemente complicado, supongo que fue más rápido para escribir que una función escrita correctamente ... por lo tanto, es "rápido". – Lundin

Respuesta

3

El #define utiliza el preprocesador para hacer getcx ser una abreviatura para la función getchar_unlocked(), que es un elemento de bloqueo función de caracteres de lectura .

Es un poco increíble que ha competido en varios concursos de codificación sin entender esta pieza bastante básico de C.

La página del manual he vinculado anteriormente menciones putc_unlocked() que suena como más o menos lo mismo, pero para la salida .

3

getchar_unlocked() es el hilo insegura versión de getchar() La razón por la que parece getchar_unlocked() más rápido es que no comprueba ningún bloqueo en el flujo de entrada desde donde se supone que debe buscar un carácter. Entonces, si otro hilo ha bloqueado el flujo de entrada, este hilo es supposed to wait till lock count has come to zero. Pero a esta función no le importa, destruyendo la sincronización entre hilos.

Pero si está seguro de que la falta de sincronización no le hará daño, esta función puede ayudarlo a ser un poco más rápido.

También, es advised que puede usarlo de forma segura solo cuando el hilo que invoca ha bloqueado stdin usando flockfile() (o ftrylockfile()).

2

Defina una macro llamada getcx para que no se utilicen bloqueos durante la lectura. Esto no es hilo de seguridad, pero más rápido si no está preocupado por la seguridad de rosca:

#define getcx getchar_unlocked 

Definir inp como en línea de modo que es más rápido:

inline void inp(int &n)//fast input function 
{ 
    n=0; 
    int ch=getcx();int sign=1; 
    while(ch < '0' || ch > '9'){if(ch=='-')sign=-1; ch=getcx();} 

Multiplica n por 10 (usando turno para calcular 8 * n + 2 * n, que podría ser más rápido):

while( ch >= '0' && ch <= '9') 
      n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); 
    n=n*sign; 
} 

Usted puede utilizar putchar_unlocked tener una función de salida más rápido cuando la seguridad hilo no es un problema.

+3

"* usando shift para calcular 8 * n + 2 * n, que es más rápido *" - que ** podría ser más rápido **, o podría ser más lento, dependiendo de su compilador, CPU, optimización y muchos otros factores. –

Cuestiones relacionadas