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