【问题标题】:Fast input/output in c++c++中的快速输入/输出
【发布时间】:2012-05-26 01:24:12
【问题描述】:

我需要在一道编程题中输入1到10000范围内的大量数字。题目建议使用快速I/O方法。

我查看了Fast input/output in competitive programming,但它太复杂了。所以有人可以告诉我一个更简单的方法来获得快速 io。

另外请告诉我使用gets 然后执行atoi() 是否比使用scanf(%d) 将数字作为输入更快。

【问题讨论】:

  • atoiscanf 用于不同的事物,并没有真正的可比性。
  • 我很想知道问题提出者对快速 IO 和慢速 IO 方法的看法...
  • > 另外请告诉我使用gets 然后执行atoi() 是否比使用scanf() 更快。我不相信任何人会告诉我什么更快,请根据您的用例对其进行衡量,然后做出自己的决定。

标签: c++ c


【解决方案1】:

为了回答你问题的第二部分,对我来说,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 滴答声,但一般来说,CPU 滴答声最多的函数会更慢。它还为我们提供了一种测量函数原始速度的方法,尽管有点不正常(例如,睡眠会搞砸)。我使用-Os 只是因为它是Xcode 所说的最快的,但我会用-O3 重试并显示结果。
【解决方案2】:

没有用于快速输入/输出的特定库。 您可以关闭同步,这将一起输入并一起打印输出。

在 main() 中添加以下代码行以关闭同步:

int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        // Your code ................
}

【讨论】:

    【解决方案3】:

    C/C++ 中没有任何用于 FASTIO 的特殊库。

    在 C/C++ 中打印输出的最快方法是 stdio.h 库中的 fwrite 或 fwrite_unlocked。

    也没有任何特殊/直接功能可以一次打印输出。

    间接地,它可以使用 cplusplus 中的 append 函数(将所有输出字符串附加到一个字符串并打印最终字符串)甚至 string.h lib 中的 strcat 函数来实现,但性能方面,“Appending or concat + printing” ,比 printf 慢,甚至远慢。

    所以c/c++中最快的方法是:直接以原始形式读取流,提取所需信息。同时将原始形式的输出放在一个巨大的缓冲区中,最后使用fwrite显示。

    请尝试通过此链接中的解决方案进行快速 IO。(http://www.codechef.com/viewsolution/244848)

    【讨论】:

      【解决方案4】:

      参考这个博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html

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

      不过,scanf 也非常快,即使在竞争性编程世界中,我们必须使用 getchar_unlocked 的情况也很少发生。

      【讨论】:

        猜你喜欢
        • 2017-09-20
        • 2012-08-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        • 2017-11-10
        • 2021-01-07
        • 1970-01-01
        相关资源
        最近更新 更多