Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:从stdin读取字符串的最快方法_C++_Input_Getchar - Fatal编程技术网

C++ C++;:从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;

我们可以使用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;
            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.