从文件读取/写入时出现内存和时间问题

时间:2018-12-27 12:06:01

标签: c++ file memory benchmarking file-read

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

问题陈述::从文件中读取自然数N和一个字符串,并在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; 
}

2 个答案:

答案 0 :(得分:1)

通常,在遇到这种类型的问题时,您应该配置文件自己的代码,以查看代码的哪部分正在消耗多少时间。多数情况下,可以通过在代码执行之前和之后向计时功能添加一些调用以查看其执行时间来完成。但是,这对于您的代码来说并不容易,因为最大的问题之一(优化方面)是您的char s[1000005];行。将在执行main()函数之前分配内存,该函数取决于操作系统(或者取决于所使用的libc和编译器)。

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

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

由于最大重复次数是1

答案 1 :(得分:0)

我不是c ++专家,但是当我使用c ++风格的文件流时遇到了类似的问题,经过一段时间的搜索后,我尝试切换到 c风格文件系统,这提高了我的性能很多原因是 c ++文件流将文件内容复制到内部缓冲区,这需要花费时间,您可以尝试使用c样式,但通常不建议在c ++中使用c。