2012-05-26 67 views
-3

在编程问题中,我需要输入1到10000范围内的大量数字。问题建议使用快速I/O方法。我看着Fast input/output in competitive programming但它太复杂了。那么任何人都可以告诉我一个简单的方法来获得快速的io。C++中的快速输入/输出

也请告诉我,如果使用gets,然后做atoi()比使用scanf(%d)以数字作为输入更快。

+2

'atoi'和'scanf'用于单独的东西,并没有真正的可比性。 –

+0

我很想知道什么问题poser认为快速IO和慢IO方法... – sarnold

+1

>也请告诉我,如果使用get然后做atoi()比使用scanf()更快。 我不会相信任何人告诉我什么是更快的,衡量它的用例,然后做出自己的决定。 –

回答

3

要回答您的问题的第二部分,对我而言,看起来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

+1

'clock'可能不是衡量这一点的恰当函数,因为它测量的是cpu利用率,而不是花费的时间。而且,为什么你使用'-Os'而不是'-O3'? –

+1

@JensGustedt虽然我意识到'clock'只显示CPU ticks,一般来说,CPU ticks数量最多的函数会比较慢。它也为我们提供了一种测量功能的原始速度的方法,尽管它有点出乎意料(例如,睡眠会混乱)。我使用'-Os'只是因为它是Xcode所说的最快的,但我会用'-O3'重试并显示结果。 –

-1

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)

0

请参阅本博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html

最快在C/C++中进行输入的方法是从输入缓冲区中读取每个字符,并将它们推送到结果变量中,直到达到分隔符。

但是,scanf的速度也很快,即使在竞争性编程的世界里,我们也不得不使用getchar_unlocked。