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

Merhaba Çeşitli kodlama yarışmalarında giriş için yukarıdaki işlevi kullanıyorum ama neden hızlı olduğunu asla anlayamadım. Mantığı biliyorum ama haslık kavramını bilmiyorum. Örneğin bu satır "#define getcx getchar_unlocked" şeklindedir. Ayrıca bu kadar herhangi hızlı çıkış fonksiyonu daHızlı giriş çıkış işlevi

+0

Bu konuyla ilgili başka bir soru: http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

İşlevin adı, iş parçacığı için güvenli olmadığını, iş parçacığı güvenliğini öneriyor Bir senkronizasyon mekanizması kullanarak giriş fonksiyonu, buna kıyasla önemli bir performans yüküne sahip olabilir. –

+0

Korkunç icky kod biçimlendirmesine bakılırsa, yazmanın daha hızlı yazılmış bir işlevden daha hızlı olduğunu tahmin ediyorum ... bu yüzden 'hızlı'. – Lundin

cevap

3

#define orada herhangi hızlı çıkış fonksiyonunu biliyorum getcx olmayan bir kilitleme karakter okuma fonksiyonudur fonksiyonu getchar_unlocked() için kısa el olmak yapmak için ön işlemci kullanan yok .

Size

Yukarıda bağlantılı manuel sayfa hemen hemen aynı şey gibi ama çıkış için sesler putc_unlocked() bahseder C Bu oldukça basit bir parça anlamadan birkaç kodlama yarışmalarda yarıştı ettik biraz müthiş .

3

getchar_unlocked()getchar_unlocked() hızlı buna bir karakteri getirmesi gerekiyordu yerden giriş akışı üzerinde herhangi kilitleri kontrol olmamasıdır görünüyor konuyu getchar() nedeni arasında güvensiz versiyonunu olduğunu. Yani başka bir iş parçacığı giriş akışını kilitlediyse, bu iş parçacığı supposed to wait till lock count has come to zero'dur. Ancak bu işlev, bununla ilgilenmez, böylece dişler arasındaki senkronizasyonu yok eder.

Ancak, senkronizasyon eksikliğinin size zarar vermeyeceğinden eminseniz bu işlev biraz daha hızlı olmanıza yardımcı olabilir. güvenle çağıran iş parçacığı kullanarak Stdin kilitlediğini yalnızca kullanabilirsiniz Ayrıca

, onun advised flockfile() (veya ftrylockfile()).

2

getcx adlı bir makroyu, okunurken hiçbir kilit kullanılmayacak şekilde tanımlayın.

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();} 
vardiya kullanılarak 10 (tarafından

Çarp n 8 hesaplamak için: daha hızlı olacak şekilde

#define getcx getchar_unlocked 

satır içi olarak inp tanımlayın: iplik güvenliğinden endişe değilse bu güvenli ama daha hızlı parçacığı uyumlu değil Daha hızlı olabilir * n + 2 * n,): iplik güvenlik sorunu olmadığı zaman

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

Daha hızlı bir çıkış fonksiyonuna sahip olmak putchar_unlocked kullanabilirsiniz.

+3

"* 8 * n + 2 * n hesaplamak için vardiya kullanarak * daha hızlı *" - hangi ** daha hızlı olabilir ** veya derleyici, CPU, optimizasyon ve diğer birçok faktöre bağlı olarak daha yavaş olabilir. –

İlgili konular