gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:41:19 30 4
gpt4 key购买 nike

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

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com