【问题标题】:Buffering putc write缓冲 putc 写入
【发布时间】:2017-05-22 13:00:33
【问题描述】:

我是 C++ 新手,正在制作一个使用大量 putc 将数据写入输出文件的应用程序。由于高写入速度慢,我以前在Delphi中编码,所以我知道如何解决它,比如每次我们需要写入输出时创建一个内存流并写入它,如果内存流的大小更大超过我们想要的缓冲区大小,将其写入输出并清除内存流。我应该如何使用 C++ 或任何更好的解决方案来做到这一点?

【问题讨论】:

  • 是否有特定原因使用putc 而不是已经缓冲的 I/O 函数(广义上的函数:STL 流、printf、...)?
  • 它有点聪明的处理器,所以 putc 对我来说似乎是最快的选择
  • 你可能想检查这个fwrite already buffered
  • 我质疑这个问题的前提:你为什么相信/你怎么知道你的应用程序是 I/O 受限的?您实际期望和看到的性能是什么?

标签: c++ buffer


【解决方案1】:

putc 已经缓冲,默认为 4 KB,您可以使用 setvbuf 更改该值:D

setvbuf

【讨论】:

    【解决方案2】:

    写入文件应该非常快。通常是清空缓冲区需要一些时间。考虑使用字符\n 而不是std::endl

    【讨论】:

    • 这是它的写入量:IO 写入:497 MB(在 127406 次写入中)并且它写入二进制数据。
    • 这应该不会花太长时间。如果您不手动刷新缓冲区,则速度应该接近您的最大磁盘读取速度。如果你真的卡住了,试着把所有东西都放到一个 std::stream 中(它应该会自动跳过缓冲区刷新),然后将流刷新到一个文件中。
    • 这里有一个很好的解释,还有一些微基准测试:youtube.com/watch?v=GMqQOEZYVJQ
    【解决方案3】:

    我认为您的问题的一个很好的答案在这里:Writing a binary file in C++ very fast

    答案在哪里:

    #include <stdio.h>
    const unsigned long long size = 8ULL*1024ULL*1024ULL;
    unsigned long long a[size];
    
    int main()
    {
        FILE* pFile;
        pFile = fopen("file.binary", "wb");
        for (unsigned long long j = 0; j < 1024; ++j){
            //Some calculations to fill a[]
            fwrite(a, 1, size*sizeof(unsigned long long), pFile);
        }
        fclose(pFile);
        return 0;
    }
    

    在您的情况下,最重要的是尽可能多地写入数据,同时尽可能减少 I/O 请求。

    【讨论】:

    • unsigned long long 是怎么回事?
    • 你需要最大的正整数(不是int)
    • 有什么用?如果您在谈论写入大小,则有一种专门用于此目的的类型,size_t。它由 C 中的 C99 标准定义(不记得 C++ 中的哪个标准),并保证能够容纳任何适合内存的对象的大小。您可以从stddef.h(旧版)或std::size_tcstddef 标头(当前)获得它作为::size_t。它们不一定相同。
    • 顺便说一句,整数的大小无关紧要。无论整数大小如何,您仍在将字节写入文件。重要的概念是将缓冲区写入文件。虽然底层代码确实缓冲了,但函数调用越少,代码越快。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2017-04-29
    相关资源
    最近更新 更多