【问题标题】:Fast input output function快速输入输出功能
【发布时间】:2012-08-17 21:44:15
【问题描述】:
#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" 。另外我不知道任何快速输出功能,所以也有任何快速输出功能

【问题讨论】:

  • 这是关于此主题的另一个 SO 问题:stackoverflow.com/questions/9052757/…
  • 正如函数名称所暗示的那样,它不是线程安全的,与此相比,使用同步机制的线程安全输入函数可能会产生显着的性能开销。
  • 从可怕的 icky 代码格式来看,我猜它比正确编写的函数更快......因此它是“快”。

标签: c++ c coding-style operating-system


【解决方案1】:

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

但是如果您确定缺少同步不会对您造成伤害,那么此功能可能会帮助您更快一点。

另外,它的advised 只有在调用线程使用flockfile()(或ftrylockfile())锁定标准输入时才能安全使用它。

【讨论】:

    【解决方案2】:

    #define 使用预处理器使getcx 成为函数@987654321@ 的简写,这是一个非锁定字符读取函数。

    你参加了几场编码比赛,却不了解这个非常基本的 C 部分,这有点令人敬畏。

    我在上面链接到的手册页提到了putc_unlocked(),这听起来几乎是一样的东西,但用于输出。

    【讨论】:

      【解决方案3】:

      定义一个名为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(使用 shift 计算 8*n+2*n,可能更快):

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

      当线程安全不是问题时,您可以使用putchar_unlocked 来获得更快的输出功能。

      【讨论】:

      • "使用 shift 计算 8*n+2*n,更快" - 可能更快,或者可能更慢,取决于您的编译器、CPU、优化和许多其他因素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 2017-09-02
      • 1970-01-01
      • 2012-04-02
      • 2017-09-20
      相关资源
      最近更新 更多