我向您展示执行相同作业的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)
好吧,我必须说我很高兴收到的帮助,因为我的问题的答案已经得到满足.
我稍微改变了问题的内容,以便更具体,我测试了那些善意提出Molbdlino和Bo Persson的解决方案.
保持编译命令的Seth指示(即cl/EHsc/Ox/Ob2/Oi pgm.cpp):
Bo Persson的解决方案平均需要18秒才能完成执行,考虑到代码接近我的喜好,真的是一个很好的解决方案.
Molbdlino解决方案平均需要6秒,非常棒!(感谢康斯坦丁也).
从来没有太晚学习,我用我的问题学到了有价值的东西.
我最诚挚的问候.
正如君士坦丁建议的那样,一次读取大块的东西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)