我有一个文本文件,格式如下 -
1 2
3 4
5 6
所以直到5密耳行。我正在使用此代码进行输入 -
ifstream fin;
fin.open("abc.txt");
while(!fin.eof()){
fin>>vert>>adj;
cout<<vert << " "<<adj;
}
该程序大约需要15分钟来处理输入。有没有办法加快处理速度。
答案 0 :(得分:1)
您最有可能使用调试版本或标准库的非常糟糕的实现。注意:
cout
更快。std::endl
强制文件刷新,因此非常慢。不要这样做,而是输出换行符'\n'
。while(! fin.eof())
是wrong。永远不要那样做。以下是我的结果:
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
t1=3.00009s
t2=10.9166s
t3=18.1806s
测试用例:
// https://github.com/KubaO/stackoverflown/tree/master/questions/ios-timing-40304260
#include <fstream>
#include <iostream>
#include <chrono>
using namespace std;
int main() {
const int N = 5000000;
const char kFile1[] = "tmp1.txt", kFile2[] = "tmp2.txt";
auto start = chrono::system_clock::now();
{
ofstream fOut;
fOut.open(kFile1);
for (int i = 0; i < N; ++i)
// !! DO NOT use endl here!
fOut << i-N << ' ' << N-i << '\n';
}
auto t1 = chrono::system_clock::now();
cerr << "t1=" << chrono::duration<double>(t1-start).count() << "s" << endl;
double vert, adj;
{
ifstream fIn;
ofstream fOut;
fIn.open(kFile1);
fOut.open(kFile2);
while (fIn >> vert && fIn >> adj)
// !! DO NOT use endl here!
fOut << vert << ' ' << adj << '\n';
}
auto t2 = chrono::system_clock::now();
cerr << "t2=" << chrono::duration<double>(t2-t1).count() << "s" << endl;
{
ifstream fIn;
fIn.open(kFile1);
while (fIn >> vert && fIn >> adj)
// !! DO NOT use endl here!
cout << vert << ' ' << adj << '\n';
}
auto t3 = chrono::system_clock::now();
cerr << "t3=" << chrono::duration<double>(t3-t2).count() << "s" << endl;
}