1

我想知道在大多数或大量硬件/系统上,代码 A 是否可能比代码 B 更快。

代码一:

for(i = 0; i < 4; i ++)
    file.write(array[i], 1);

代码 B:

// for(i = 0; i < 1; i ++)
    file.write(array[i], 4);

我问的原因是因为我希望能够将一个非常长的 64 位连续整数文件写入磁盘。

目前我面临的问题是我的数组,它实际上是一个缓冲区,包含 8 个字节长的对象,而不是 1 个字节的对象,我可以很容易地使用类似的东西编写:

file.write((char*)(array), size_of_array);

我想到了一些解决方案,但它们似乎都非常缺乏想象力并且对我来说很困难。

第一个是迭代 8 个字节:

for(j = 0; j < size_of_array; j ++)
    for(i = 0; i < 8; i ++) // 8 == sizeof(uint64_t)
        file.write((char*)(array + i + j), 1);

然后我想,为什么不欺骗 write() 为我写 8 个字节呢?我可以这样做吗?

for(j = 0; j < size_of_array; j ++)
    file.write((char*)(array + j), 8);

然后我想,好吧......再进一步:

file.write((char*)(array), 8 * size_of_array);

所以我的问题是,将大量数据写入磁盘的最快方法是什么?

总的来说,我建议写一个包含 400 万个对象的缓冲区,然后重新填充缓冲区并再次写入,可能会创建一个几十 GB 大小的文件。

对于那些感兴趣的人,这是一个并行处理实验。第一步是生成数据。这就是我现在的位置。步骤1...

4

1 回答 1

0

我不知道您是否知道这一点,但是您应该了解有关以这种方式流式传输对象的一些事项:

  1. 这只应针对 POD 类型进行。

    普通旧数据类型是没有构造函数的类型。原因是有可能设置资源的逻辑。如果没有分配资源,可以使用统一初始化来初始化 POD。

  2. POD 类型不应包含引用或指针。

    这是因为如果你写一个指向磁盘的指针然后读回它,它实际上会指向你期望的正确的东西吗?在某些情况下,这可能是真的,但在大多数情况下并非如此。

  3. 您应该使用 sizeof() 运算符,而不是直接将大小指定为常量。

    类/结构可以在对象内进行填充,以更改对象的大小以提高访问性能。

  4. 生成的二进制文件是特定于字节序的。

    读取通过这种方式生成的文件,如果不经过另一个系统的转换,将无法以相同的方式读取。

  5. 生成的二进制文件是编译器特定的。

    同样,这与填充有关。不同的编译器可能会将填充放在不同的位置。

如果考虑到这些,是的,您可以按照您所说的去做,并且随着您减少函数调用的数量,它应该会稍微快一些。

于 2013-06-26T16:01:50.387 回答