在编程问题中,我需要输入1到10000范围内的大量数字。问题建议使用快速I/O方法。我看着Fast input/output in competitive programming但它太复杂了。那么任何人都可以告诉我一个简单的方法来获得快速的io。C++中的快速输入/输出
也请告诉我,如果使用gets
,然后做atoi()
比使用scanf(%d)
以数字作为输入更快。
在编程问题中,我需要输入1到10000范围内的大量数字。问题建议使用快速I/O方法。我看着Fast input/output in competitive programming但它太复杂了。那么任何人都可以告诉我一个简单的方法来获得快速的io。C++中的快速输入/输出
也请告诉我,如果使用gets
,然后做atoi()
比使用scanf(%d)
以数字作为输入更快。
要回答您的问题的第二部分,对我而言,看起来atoi
约快两倍。考虑以下几点:
#define ITERS 1000000
clock_t testAtoi()
{
char buffer[64];
clock_t start = clock();
for (int i = 0; i < ITERS; i++) {
sprintf(buffer, "%i", i);
int l = atoi(buffer);
}
return clock() - start;
}
clock_t testScanf()
{
char buffer[64];
clock_t start = clock();
for (int i = 0; i < ITERS; i++) {
sprintf(buffer, "%i", i);
int l = 0;
sscanf(buffer, "%i", &l);
}
return clock() - start;
}
int main()
{
printf("clocks for atoi: %lu\n", testAtoi());
printf("clocks for sscanf: %lu\n", testScanf());
return 0;
}
对于我来说,使用gcc和-O0
(所以我的变量没有被优化掉),该程序的输出:
的时钟的atoi:222011点
的时钟的sscanf: 392409
但是,如果你使用的是FILE *
,那么也许fscanf
会更快。我现在没有时间比较两者,但对于原始字符串,大部分我只会使用atoi
。
'clock'可能不是衡量这一点的恰当函数,因为它测量的是cpu利用率,而不是花费的时间。而且,为什么你使用'-Os'而不是'-O3'? –
@JensGustedt虽然我意识到'clock'只显示CPU ticks,一般来说,CPU ticks数量最多的函数会比较慢。它也为我们提供了一种测量功能的原始速度的方法,尽管它有点出乎意料(例如,睡眠会混乱)。我使用'-Os'只是因为它是Xcode所说的最快的,但我会用'-O3'重试并显示结果。 –
FASTIO在C/C++中没有任何特殊的库。
用C/C++打印输出的最快方法是在stdio.h库中使用fwrite或fwrite_unlocked。
此外,还没有任何特殊/直接功能一次打印输出。
间接地,可以使用append函数(将所有输出字符串附加到单个字符串并打印最终字符串)实现在cplusplus中,甚至在string.h lib中使用strcat函数,但性能明智:“附加或concat +打印“比较慢,甚至比printf慢得多。
因此,在c/C++中最快的方法是:直接读取原始表单中的流,并提取所需的信息。还将原始形式的输出放入一个巨大的缓冲区中,并最终使用fwrite显示它。
并请尝试去通过这个链接快速IO解决方案(http://www.codechef.com/viewsolution/244848)
请参阅本博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html
最快在C/C++中进行输入的方法是从输入缓冲区中读取每个字符,并将它们推送到结果变量中,直到达到分隔符。
但是,scanf的速度也很快,即使在竞争性编程的世界里,我们也不得不使用getchar_unlocked。
'atoi'和'scanf'用于单独的东西,并没有真正的可比性。 –
我很想知道什么问题poser认为快速IO和慢IO方法... – sarnold
>也请告诉我,如果使用get然后做atoi()比使用scanf()更快。 我不会相信任何人告诉我什么是更快的,衡量它的用例,然后做出自己的决定。 –