c++ - 为什么 getchar_unlocked() 比其他方法更快?

标签 c++ getchar

我知道这段代码是如何工作的,但我找不到为什么这段代码比其他输入/输出方法更快???

int read_int() {
  char c = getchar_unlocked();
  while(c<'0' || c>'9') c = getchar_unlocked();
  int ret = 0;
  while(c>='0' && c<='9') {
    ret = 10 * ret + c - 48;
    c = getchar_unlocked();
  }
  return ret;
}

最佳答案

scanf("%d\n", &x) 必须解析格式字符串并在读取前后锁定流。

std::cin >> x 也可能会进行锁定,并且它可能必须与 stdin 同步,并且可能需要经过一些抽象层。

有了上面的内容,您只进行一种类型的输入解析(因此无需解析格式字符串并根据它决定要做什么),最重要的是,您不会锁定流。

锁定流由 POSIX 和 glibc 强制要求使用递归互斥来防止多个线程(即使在单线程环境中)同时访问 stdin FILE(这会破坏它)。 这些互斥量非常昂贵(您的 read_int 应该比 scanf("%d",&x) 快几倍(fivish?))。


关于您的实现,除了解决魔数(Magic Number)问题外, 您也应该检测 getchar_unlocked 中的故障,并通过单独的 channel 报告这些故障——例如,通过传入的指针返回解析的整数并使用返回状态进行错误报告。

如果你想要线程安全,你仍然可以使用 getchar_unlocked 来获得比 getchar 更快的速度,但是你必须 flockfile(stdin);funlock(stdin); 在您的 read_int 函数的开头和结尾(分别)。

关于c++ - 为什么 getchar_unlocked() 比其他方法更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37434793/

相关文章:

C++11接口(interface)纯虚析构函数

c++ - 我的法线映射有什么问题?我认为这是我的切线

c++ - OpenCV CommandLineParser 未指定的参数

c - getchar() 如何在 While 循环中工作?

c - 在 C 中使用 getchar()

字符数组读取 3 个输入而不是 c 中的 5 个输入?

c++ - 无法理解此 boost 条件变量示例

C getchar() 刽子手游戏

c - 使用 "getchar()"和 "EOF"期间出现无意义的输出流

python - 将原始数字写入磁盘