C++ C++;:从stdin读取字符串的最快方法
我们可以使用getchar_unlocked从stdin中快速读取整数,方法是操作如下字符:C++ C++;:从stdin读取字符串的最快方法,c++,input,getchar,C++,Input,Getchar,我们可以使用getchar_unlocked从stdin中快速读取整数,方法是操作如下字符: int scan_d() { int ip = getchar_unlocked(), ret = 0, flag = 1; for(; ip < '0' || ip > '9'; ip = getchar_unlocked()) { if(ip == '-') { flag = -1;
int scan_d()
{
int ip = getchar_unlocked(), ret = 0, flag = 1;
for(; ip < '0' || ip > '9'; ip = getchar_unlocked())
{
if(ip == '-')
{
flag = -1;
ip = getchar_unlocked();
break;
}
}
for(; ip >= '0'&& ip <= '9'; ip = getchar_unlocked())
ret = ret * 10 + ip - '0';
return flag * ret;
}
int scan_d()
{
int ip=getchar_unlocked(),ret=0,flag=1;
对于(;ip<'0'| | ip>'9';ip=getchar_unlocked())
{
如果(ip='-')
{
flag=-1;
ip=getchar_unlocked();
打破
}
}
对于(;ip>='0'&&ip
有没有一种方法可以使用上面的东西快速地从stdin读取字符串
当然可以。如果您更清楚地了解它的作用,我们甚至可以提供代码
gets比cin/scanf更快,但同时具有对空格的关键处理能力
cin
和scanf
也可以做到这一点:和
我曾想过修改上面的字符串代码,但遇到了空格的问题
什么问题
此外,逐个读取字符串中的每个字符似乎会更慢
比块读取慢?当然。但是,一次读取一个字符实际上是判断字符串结尾位置的唯一方法。您可以将读取的数据块读入缓冲区并旋转它以找到字符串的结尾,这称为缓冲。但是stdin
已经被缓冲,因此再次缓冲会使它变慢,而不是变慢没有比使用getchar\u unlocked
一次读取一个字符更快的读取空格分隔字符串的方法了
有没有一种方法可以使用上面的东西快速地从stdin读取字符串
当然可以。如果您更清楚地了解它的作用,我们甚至可以提供代码
gets比cin/scanf更快,但同时具有对空格的关键处理能力
cin
和scanf
也可以做到这一点:和
我曾想过修改上面的字符串代码,但遇到了空格的问题
什么问题
此外,逐个读取字符串中的每个字符似乎会更慢
比块读取慢?当然。但是,一次读取一个字符实际上是判断字符串结尾位置的唯一方法。您可以将读取的数据块读入缓冲区并旋转它以找到字符串的结尾,这称为缓冲。但是stdin
已经被缓冲,因此再次缓冲会使它变慢,而不是变慢没有比使用getchar\u unlocked
一次读取一个空格分隔的字符串更快的方法了。不确定我的基准测试是否正确..这是我第一次真正测试速度
不管怎样,下面是:
输出:
getchar_unlocked took: 436 nano-seconds.
getchar took: 330 nano-seconds.
getline took: 619 nano-seconds.
scanf took: 522 nano-seconds.
fgets took: 44 nano-seconds.
cinread took: 67 nano-seconds.
不确定我的基准测试是否正确这是我第一次测试速度真的
不管怎样,下面是:
输出:
getchar_unlocked took: 436 nano-seconds.
getchar took: 330 nano-seconds.
getline took: 619 nano-seconds.
scanf took: 522 nano-seconds.
fgets took: 44 nano-seconds.
cinread took: 67 nano-seconds.
由于人类的速度比计算机慢,因此没有快速的方法将用户输入到程序中
如果用户以每分钟1个字母的速度键入,您的程序将等待1分钟,等待下一个字符。句点。无法读取更快的字符
如果您的程序每秒可以从用户处读取1个字符,而我的程序需要1毫秒才能读取一个字符,那么这两个程序最终都会等待60000毫秒,等待下一个用户的字符。我的程序快吗?是的。这有什么不同吗?不。您是否比我更快地驶向红色信号灯
根据我的经验,所有关于用户输入的优化都已关闭。不用麻烦了
如果您的程序需要30秒来执行操作,它仍然需要再等待30秒,用户才能输入下一个字符
而应专注于稳健性:
- 用户是否可以输入无效值
- 您的程序如何告诉用户该值无效
- 用户能否输入超出缓冲区支持的字符数
如果必须,请阻止从用户处读取,或使用getline
读取字符串。由于人的速度比计算机慢,因此没有快速的方法将用户输入到程序中
如果用户以每分钟1个字母的速度键入,您的程序将等待1分钟,等待下一个字符。句点。无法读取更快的字符
如果您的程序每秒可以从用户处读取1个字符,而我的程序需要1毫秒才能读取一个字符,那么这两个程序最终都会等待60000毫秒,等待下一个用户的字符。我的程序快吗?是的。这有什么不同吗?不。您是否比我更快地驶向红色信号灯
根据我的经验,所有关于用户输入的优化都已关闭。不用麻烦了
如果您的程序需要30秒来执行操作,它仍然需要再等待30秒,用户才能输入下一个字符
而应专注于稳健性:
- 用户是否可以输入无效值
- 您的程序如何告诉用户该值无效
- 用户能否输入超出缓冲区支持的字符数
如果必须,请阻止从用户处读取,或使用getline
读取字符串。这有点过早优化的味道。getchar\u unlocked
看起来也是一个非标准函数。在中没有任何方法类似于getchar\u unlocked()
方法,你在说什么?@πάταῥεῖ 因为他指的是getchar_unlocked()
,我猜这意味着它是一个没有同步的getchar
版本。std::cin
必须跨线程同步,并且默认情况下也与cstdio同步。当您添加每个字符的虚拟调用开销时,使用std::cin
的哪个方法并不重要,它们都会同步要比getchar\u unlocked
.OTOH慢,这纯粹是过早的优化。”有没有一种方法可以使用类似
getchar_unlocked took: 436 nano-seconds.
getchar took: 330 nano-seconds.
getline took: 619 nano-seconds.
scanf took: 522 nano-seconds.
fgets took: 44 nano-seconds.
cinread took: 67 nano-seconds.