我正在尝试向文件中写入很多x / y双点。
我提出以下功能是最快的解决方案。
还有其他方法可以加快这一过程吗?
首先写入stringstream,然后打开文件,可以大大提高速度。
bool printPoints(const vector <pair <double,double> > &points, const string &file)
{
if(points.empty())
return false;
vector <pair <double,double> > const_iterator i;
if(file != "")
{
stringstream ss;
for(i=points.begin(); i != points.end();++i )
{
ss << i->first << " " << i->second << "\n";
}
ofstream out(file.c_str());
if(out.fail())
{
out.close();
return false;
}
out << ss.str();
out.close();
}
return true;
}
我测试了这个。写信给stringstream
您买东西几乎没有。使用FILE *
代替fstream
确实给出了合理的改进。
这是我的测试代码:
#include <vector>
#include <utility>
#include <fstream>
#include <iostream>
#include <sstream>
#include <cstdio>
using namespace std;
bool printPoints(const vector <pair <double,double> > &points, const string &file)
{
if(points.empty())
return false;
vector <pair <double,double> >::const_iterator i;
if(file != "")
{
stringstream ss;
for(i=points.begin(); i != points.end();++i )
{
ss << i->first << " " << i->second << "\n";
}
ofstream out(file.c_str());
if(out.fail())
{
out.close();
return false;
}
out << ss.str();
out.close();
}
return true;
}
bool printPoints2(const vector <pair <double,double> > &points, const string &file)
{
if(points.empty())
return false;
vector <pair <double,double> >:: const_iterator i;
if(file != "")
{
ofstream out(file.c_str());
if(out.fail())
{
out.close();
return false;
}
for(i=points.begin(); i != points.end();++i )
{
out << i->first << " " << i->second << "\n";
}
out.close();
}
return true;
}
bool printPoints3(const vector <pair <double,double> > &points, const string &file)
{
if(points.empty())
return false;
vector <pair <double,double> >:: const_iterator i;
if(file != "")
{
FILE *out = fopen(file.c_str(), "w");
if(!out)
{
return false;
}
for(i=points.begin(); i != points.end();++i )
{
fprintf(out, "%f %f", i->first, i->second);
}
fclose(out);
}
return true;
}
static __inline__ unsigned long long rdtsc(void)
{
unsigned hi, lo;
__asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
int main()
{
vector <pair <double,double> > v;
unsigned long long t1, t2;
for(int i = 1; i <= 10000000; i++)
{
v.push_back(make_pair<double, double>((double)i, 1.0/i));
}
t1 = rdtsc();
printPoints(v, "points.txt");
t2 = rdtsc();
cout << "time = " << t2 - t1 << endl;
t1 = rdtsc();
printPoints2(v, "points2.txt");
t2 = rdtsc();
cout << "time = " << t2 - t1 << endl;
t1 = rdtsc();
printPoints3(v, "points3.txt");
t2 = rdtsc();
cout << "time = " << t2 - t1 << endl;
}
Results:
time = 55363637480
time = 54413392112
time = 33069402767
显然,结果可能会有所不同,具体取决于处理器类型,内存类型,硬盘系统(或网络驱动器存储)等。但是我过去已经对此进行了测试,并且发现了类似的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句