gpt4 book ai didi

c++ - 如何提高我的 C++ 程序读取分隔文本文件的速度?

转载 作者:太空狗 更新时间:2023-10-29 23:28:49 34 4
gpt4 key购买 nike

我将向您展示执行相同作业的 C# 和 C++ 代码:读取由“|”分隔的相同文本文件并以“#”分隔的文本保存。

当我执行C++程序时,耗时是169秒。

更新 1:感谢 Seth(编译:cl/EHsc/Ox/Ob2/Oi)和 GWW 在循环外更改字符串 s 的位置,耗时减少到 53 秒。我也更新了代码。

更新 2:您有任何其他增强 C++ 代码的建议吗?

当我执行C#程序时,耗时是34秒!

问题是,与 C# 相比,如何提高 C++ 的速度?

C++程序:

int main ()
{
Timer t;
cout << t.ShowStart() << endl;

ifstream input("in.txt");
ofstream output("out.txt", ios::out);
char const row_delim = '\n';
char const field_delim = '|';
string s1, s2;

while (input)
{
if (!getline( input, s1, row_delim ))
break;
istringstream iss(s1);
while (iss)
{
if (!getline(iss, s2, field_delim ))
break;
output << s2 << "#";
}
output << "\n";
}

t.Stop();
cout << t.ShowEnd() << endl;
cout << "Executed in: " << t.ElapsedSeconds() << " seconds." << endl;
return 0;
}

C#程序:

    static void Main(string[] args)
{
long i;
Stopwatch sw = new Stopwatch();
Console.WriteLine(DateTime.Now);
sw.Start();
StreamReader sr = new StreamReader("in.txt", Encoding.Default);
StreamWriter wr = new StreamWriter("out.txt", false, Encoding.Default);
object[] cols = new object[0]; // allocates more elements automatically when filling
string line;
while (!string.Equals(line = sr.ReadLine(), null)) // Fastest way
{
cols = line.Split('|'); // Faster than using a List<>
foreach (object col in cols)
wr.Write(col + "#");
wr.WriteLine();
}
sw.Stop();
Console.WriteLine("Conteo tomó {0} secs", sw.Elapsed);
Console.WriteLine(DateTime.Now);
}

更新 3:

嗯,我必须说我很高兴收到帮助,因为我的问题得到了满意的回答。

我稍微更改了问题的文本以使其更具体,并测试了好心提出的 Molbdlino 和 Bo Persson 的解决方案。

为编译命令保留 Seth 指示(即 cl/EHsc/Ox/Ob2/Oi pgm.cpp):

Bo Persson 的解决方案平均需要 18 秒才能完成执行,考虑到代码接近我喜欢的内容,这确实是一个很好的解决方案。

Molbdlino 解决方案平均耗时 6 秒,真是太神奇了!! (也感谢康斯坦丁)。

学习永远不晚,我从问题中学到了有值(value)的东西。

我最诚挚的问候。

最佳答案

正如 Constantine 建议的那样,使用 read 一次读取大块。

我将一个 129M 文件的时间从 ~25s 缩短到 ~3s,在 100,000 行中有 5M 个“条目”(每个条目 26 字节)。

#include <iostream>
#include <fstream>
#include <sstream>
#include <algorithm>

using namespace std;

int main ()
{
ifstream input("in.txt");
ofstream output("out.txt", ios::out);

const size_t size = 512 * 1024;
char buffer[size];

while (input) {
input.read(buffer, size);
size_t readBytes = input.gcount();
replace(buffer, buffer+readBytes, '|', '#');
output.write(buffer, readBytes);
}
input.close();
output.close();

return 0;
}

关于c++ - 如何提高我的 C++ 程序读取分隔文本文件的速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7102087/

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