2012-08-22 171 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”。此外,我不知道任何快速输出功能,所以有没有快速输出功能也快速输入输出功能

+0

下面是关于此主题的另一个SO问题:http://stackoverflow.com/questions/9052757/getchar-unlocked-vs-scanf-vs-cin –

+0

由于函数的名称暗示它不是线程安全的,因此线程安全使用同步机制的输入函数与此相比可能会产生显着的性能开销。 –

+0

根据可怕的恶劣代码格式来判断,我猜测写入的速度比正确写入的函数要快,因此速度很快。 – Lundin

回答

3

#define采用预处理,使getcx是一个短手的功能getchar_unlocked(),这是一个非锁定字符阅读功能。

这是一个有点真棒,你已经在几个编码竞赛竞争不理解C.这个很基本的一块

的手册页我联系到上面提到putc_unlocked()这听起来像几乎同样的事情,但对于输出。

3

getchar_unlocked()是线程不安全版本的getchar()之所以getchar_unlocked()似乎更快的是,它不检查就从那里应该取一个字符输入流的任何锁。所以如果另一个线程锁定了输入流,这个线程是supposed to wait till lock count has come to zero。但是这个函数并不关心它,从而破坏了线程之间的同步。

但是如果你确定缺乏同步不会伤害你,那么这个功能可能会帮助你更快一点。

此外,它的advised只有当调用线程使用flockfile()(或ftrylockfile())锁定标准输入时,您才可以安全地使用它。

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

“*使用shift计算8 * n + 2 * n,这更快*” - 哪个**可能更快**,或者可能会更慢,这取决于您的编译器,CPU,优化以及许多其他因素。 –