gpt4 book ai didi

c++ - 从文件读取/写入时的内存和时间问题

转载 作者:行者123 更新时间:2023-11-28 04:27:30 26 4
gpt4 key购买 nike

我正在尝试解决一个学校问题并且我做到了,但如果可能的话它应该运行得更快并且占用更少的内存 - 你能帮我实现这个目标吗?

问题陈述:从一个文件中读取一个自然数N和一个字符串,在另一个文件中输出相同的字符串N次。

输入文件示例:3个狗

输出文件示例:狗狗狗

限制:1 ≤ n ≤ 50,读取行的长度最大为1,000,000

时间限制:0.27秒

这是我试过的(但运行时间超过限制):

#include<fstream>

using namespace std;

ifstream cin("afisaren.in");
ofstream cout("afisaren.out");

short n;
char s[1000005];

int main() {
cin >> n;
cin >> s;
while(n) {
cout << s << '\n';
n--;
}
cin.close();
cout.close();
return 0;
}

最佳答案

通常,遇到此类问题时,您应该剖析 自己的代码,以查看代码的哪一部分消耗了多少时间。这主要可以通过在代码执行前后添加对计时函数的几次调用来完成,以查看它执行了多长时间。然而,这对于您的代码来说并不容易,因为最大的问题之一(优化方面)是您的 char s[1000005]; 行。内存将在执行 main() 函数之前分配,这取决于操作系统(或者更确切地说取决于所使用的 libc 和编译器)。

所以首先,不要使用预分配的字符数组。你正在使用 C++!为什么不简单地将文本读入 std::(w)string 或任何将执行动态内存分配的 C++ 类(如果行长超过 1,000,000 则不会使程序崩溃)。

其次,每次写入行结束字符时,c++ std::streams 通常会执行刷新到磁盘。这是非常低效的,除非您的文本大小与底层文件系统的 block 大小完全相同。要对此进行优化,请创建一个内存对象(即 std::string)并将您的文本复制到其中 k 次,其中 k = fs-block-size /文本长度。 fs-block-size 很可能是 1024、2048 或 4096 字节。有系统调用可以找出这一点,但是当写入 fs-block-size 的两倍(或 4 倍)时,性能通常不会受到太大影响,因此您可以安全地假设它是 4096 接近或最大-性能。

由于最大重复次数为 1 < n < 50,行长为 1,000,000(如果使用 ASCII,则约为 1 MiB),因此输出的最大文件大小为 50,000,000 个字符。您还可以将所有内容写入内存,然后在对 write() 的一次调用中写入所有内容。就磁盘事件而言,这可能是最有效的方法,但显然不是内存消耗。

关于c++ - 从文件读取/写入时的内存和时间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944803/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com