如何在读取分隔文本文件时提高C++程序的速度?

Tri*_*tan 2 c++ c#-4.0

我向您展示执行相同作业的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;
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

更新3:

好吧,我必须说我很高兴收到的帮助,因为我的问题的答案已经得到满足.

我稍微改变了问题的内容,以便更具体,我测试了那些善意提出Molbdlino和Bo Persson的解决方案.

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

Bo Persson的解决方案平均需要18秒才能完成执行,考虑到代码接近我的喜好,真的是一个很好的解决方案.

Molbdlino解决方案平均需要6秒,非常棒!(感谢康斯坦丁也).

从来没有太晚学习,我用我的问题学到了有价值的东西.

我最诚挚的问候.

mol*_*ilo 7

正如君士坦丁建议的那样,一次读取大块的东西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;
}
Run Code Online (Sandbox Code Playgroud)