2012-08-22 6 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; 
} 

Hallo Ich habe die obige Funktion für die Eingabe in verschiedenen Codierung Wettbewerbe verwendet, aber war nie in der Lage zu verstehen, warum es schnell ist. Ich kenne die Logik, kenne aber das Konzept der Echtheit nicht. Zum Beispiel was macht diese Zeile "#define getcx getchar_unlocked". Ich weiß auch keine schnelle Ausgabe-Funktion, so gibt es eine schnelle Ausgabefunktion auchSchnelle Eingabe Ausgabefunktion

+0

Hier ist eine weitere SO Frage zu diesem Thema: http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

Wie der Name der Funktion suggeriert, ist es nicht Thread sicher, ein Thread sicher Eingabefunktion unter Verwendung eines Synchronisationsmechanismus kann einen erheblichen Leistungsaufwand gegenüber diesem aufweisen. –

+0

Nach der furchtbar ekligen Codeformatierung zu urteilen, war es schneller zu schreiben als eine richtig geschriebene Funktion ... daher ist es 'schnell'. – Lundin

Antwort

3

Die #define verwendet den Präprozessor getcx eine kurze Hand für die Funktion getchar_unlocked(), zu machen sein, die eine nicht sperr Charakter-Lesefunktion .

Es ist ein bisschen genial, dass man in mehreren Codierungs Wettbewerben ohne zu verstehen, diese ziemlich einfach Stück C.

Das Handbuch Seite, die ich oben erwähnt putc_unlocked() verbunden konkurrierten hat, die wie so ziemlich die gleiche Sache klingt, aber für die Ausgabe .

3

getchar_unlocked() ist der rote Faden unsicher Version von getchar() Der Grund, dass getchar_unlocked()scheint schneller ist, dass es nicht für alle Schlösser an der Eingangsstrom nicht überprüft, von denen angenommen wird, um ein Zeichen zu holen. Wenn also ein anderer Thread den Eingabestream gesperrt hat, lautet dieser Thread supposed to wait till lock count has come to zero. Aber diese Funktion kümmert sich nicht darum und zerstört dadurch die Synchronisation zwischen Threads.

Aber wenn Sie sicher sind, dass der Mangel an Synchronisation Ihnen nicht schaden wird, dann könnte diese Funktion Ihnen helfen, ein bisschen schneller zu sein.

Auch seine advised, dass Sie es sicher nur verwenden können, wenn der aufrufende Thread stdin mit flockfile() (oder ftrylockfile()) gesperrt hat.

2

Definieren Sie ein Makro mit dem Namen getcx, sodass beim Lesen keine Sperren verwendet werden. Dies ist Thread nicht sicher, aber schneller, wenn Sie über die Thread-Sicherheit nicht besorgt:

#define getcx getchar_unlocked 

inp als inline definieren, so dass es schneller ist:

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();} 

Multiply n von 10 (Verschiebung unter Verwendung von 8 zu berechnen * n + 2 * n, die) schneller sein könnten:

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

Sie können putchar_unlocked verwenden, um eine schnellere Ausgabefunktion zu haben, wenn die Thread-Sicherheit ist kein Problem.

+3

"* mit Verschiebung zu berechnen 8 * n + 2 * n, das ist schneller *" - was ** könnte schneller **, oder könnte langsamer sein, abhängig von Ihrem Compiler, CPU, Optimierung und vielen anderen Faktoren. –