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

こんにちは私は上記の関数をさまざまなコーディングコンテストで使用していましたが、なぜそれが速いのか理解できませんでした。私はその論理を知っていますが、堅牢さの概念を知らないのです。たとえば、この行は "#define getcx getchar_unlocked"を実行しています。また、私は#definegetcxが非ロック文字読み取り機能である機能getchar_unlocked()、ために短い手可能にするためにプリプロセッサを使用していますので、任意の高速出力機能もある高速入力出力機能

+0

このトピックに関する別の質問があります:http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

関数名はスレッドセーフではないことを示しているので、スレッドセーフです同期メカニズムを使用した入力機能は、これと比較してかなりのパフォーマンスオーバーヘッドを持つ可能性があります。 –

+0

ひどくぎっしりしたコードの書式設定で判断すると、正しく書かれた関数よりも書いたほうが速いと推測しています。したがって、「速い」です。 – Lundin

答えて

3

任意の高速出力機能を知りません。

C.

のこの非常に基本的な部分を理解せずに、私は上記にリンクされているマニュアルページはほとんど同じことのようですが、出力のための音putc_unlocked()に言及それはあなたがいくつかのコーディングコンテストに出場してきたことを少し素晴らしいです。

3

getchar_unlocked()getchar_unlocked()速いようだという理由は、それは文字を取得することになっているところからの入力ストリーム上のすべてのロックをチェックしませんということですgetchar()のスレッド危険なバージョンです。したがって、別のスレッドが入力ストリームをロックしている場合、このスレッドはsupposed to wait till lock count has come to zeroです。しかし、この関数は気にしないので、スレッド間の同期が破壊されます。

しかし、同期の欠如があなたに危害を与えないと確信しているなら、この機能はあなたが少し速くなるのを助けるかもしれません。

advisedまた、呼び出すスレッドがflockfile()(またはftrylockfile())を使用してstdinをロックしている場合にのみ、安全に使用できます。

2

読み取り中にロックが使用されないように、getcxと呼ばれるマクロを定義します。あなたは、スレッドの安全性を心配していない場合、これは安全ではなく速くスレッドされていません:それはより速くなるよう

#define getcx getchar_unlocked 

はインラインとしてinpを定義します。

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

乗算nを10で(8を計算するためにシフトを使用して* nは速いかもしれません+ 2 * nを、):スレッドの安全性が問題にならないとき

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

あなたはより高速な出力機能を持つようにputchar_unlockedを使用することができます。

+3

コンパイラ、CPU、最適化、およびその他の多くの要因によっては、*高速であるかもしれない8 * n + 2 * nを計算するシフトを使用する** *高速**、または遅くなる可能性があります。 –

関連する問題