帮我优化一下代码 这个执行速度太长了
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<sstream>
using namespace std;
struct HEAD
{
string version;
string target_data;
string major_data;
string create_date;
};
struct INFO
{
string id;
string name;
string yomi;
string section;
string open_date;
string distance;
string prefecture;
string supplement;
string comment;
};
struct ANDL
{
string a1;
string a2;
string a3;
string a4;
string a5;
};
struct PART
{
string seq;
int nCount;
vector<ANDL> Andl;
};
struct GROP
{
struct INFO info;
int n_part;
vector<PART> Part;
int n_facil;
vector<string> Facil;
};
struct ANDL andl;
struct HEAD head;
struct PART part;
struct GROP grop;
int main()
{
vector<GROP> data;
string str,src,substr;
int nCount = 0, mCount = 0, pCount = 0;
int j;
string filename = "openroad.txt";
ifstream infile(filename.c_str());
if(infile.fail())
{
cerr<<"can,t not open fail";
return -1;
}
while(getline(infile, str))
{
int index = 0;
string::size_type m = str.find('\t');
src = str.substr(0,m);
if( src == "@info" )
{
j = 0;
data.push_back(grop);
grop.n_part = 0;
grop.n_facil = 0;
}
else if( src == "@part" )
{
index = 0;
grop.n_part++;
grop.Part.push_back(part);
}
else if( src == "@id" )
{
part.nCount = 0;
grop.info.id = str.substr(m);
}
else if( src == "@seq" )
{
// grop.n_part++;
part.seq = str.substr(m);
}
else if( src == "@l" )
{
stringstream ss(str);
while(getline(ss,substr,'\t'))
{
if(index == 0)
andl.a1 = substr;
if(index == 1)
andl.a2 = substr;
if(index == 2)
andl.a3 = substr;
if(index == 3)
andl.a4 = substr;
if(index == 4)
andl.a5 = substr;
index++;
}
// part.nCount++;
part.Andl.push_back(andl);
part.nCount++;
}
else if( src == "@facil" )
{
if(j == 0)
{
grop.n_part++;
grop.Part.push_back(part);
}
grop.n_facil ++;
grop.Facil.push_back(str.substr(m));
j++;
}
else if( src == "@name" )
grop.info.name = str.substr(m);
else if( src == "@yomi" )
grop.info.yomi = str.substr(m);
else if( src == "@section" )
grop.info.section = str.substr(m);
else if( src == "@open_date" )
grop.info.open_date = str.substr(m);
else if( src == "@distance" )
grop.info.distance = str.substr(m);
else if( src == "@prefecture" )
grop.info.prefecture = str.substr(m);
else if( src == "@comment" )
grop.info.comment = str.substr(m);
else if( src == "@version" )
head.version = str.substr(m);
else if( src == "@target_data" )
head.target_data = str.substr(m);
else if( src == "@major_data" )
head.major_data = str.substr(m);
else if( src == "@create_date" )
head.create_date = str.substr(m);
}
if(infile.eof())
{
// grop.Part.push_back(part);
data.push_back(grop);
}
cout<<"@header"<<endl;
cout<<"@version"<<head.version<<endl;
cout<<"@target_data"<<head.target_data<<endl;
cout<<"@major_data"<<head.major_data<<endl;
cout<<"@create_date"<<head.create_date<<endl<<endl;
for(vector<GROP>::iterator it =data.begin()+1; it != data.end(); ++it)
{
cout<<"@info"<<endl;
cout<<"@id"<<(*it).info.id<<endl;
cout<<"@name"<<(*it).info.name<<endl;
cout<<"@yomi"<<(*it).info.yomi<<endl;
cout<<"@section"<<(*it).info.section<<endl;
cout<<"@open_date"<<(*it).info.open_date<<endl;
cout<<"@distance"<<(*it).info.distance<<endl;
cout<<"@prefecture"<<(*it).info.prefecture<<endl;
cout<<"@supplement"<<(*it).info.supplement<<endl;
cout<<"@comment"<<(*it).info.comment<<endl<<endl;
vector<PART>::iterator is_begin = (*it).Part.begin()+mCount;
mCount += it->n_part;
vector<PART>::iterator is_end = (*it).Part.begin()+mCount;
for(;is_begin != is_end; is_begin++)
{
cout<<"@part"<<endl;
cout<<"@id"<<(*it).info.id<<endl;
cout<<"@seq"<<is_begin->seq<<endl;
vector<ANDL>::iterator IBegin = (*is_begin).Andl.begin()+nCount;
nCount += is_begin->nCount;
vector<ANDL>::iterator IEnd = (*is_begin).Andl.begin()+nCount;
for(; IBegin != IEnd; ++IBegin)
{
cout<<IBegin->a1<<"\t"<<IBegin->a2<<"\t"<<IBegin->a3<<"\t"<<IBegin->a4<<"\t"
<<IBegin->a5<<endl;
}
cout<<endl;
}
vector<string>::iterator f_begin = (*it).Facil.begin()+pCount;
pCount += it->n_facil;
vector<string>::iterator f_end = (*it).Facil.begin()+pCount;
for(; f_begin != f_end; ++f_begin)
{
cout<<"@facil"<<*f_begin<<endl;
}
cout<<endl;
}
return 0;
}
[解决办法]
用profiler看时间都消耗在哪儿。
[解决办法]
这得你自己优化。谁知道你的原始数据是什么,代码具体想做什么。
要优化的话,把main里的代码都删了,就留个return,保证飞快。
cout<<"@info"<<endl;
cout<<"@id"<<(*it).info.id<<endl;
cout<<"@name"<<(*it).info.name<<endl;
cout<<"@yomi"<<(*it).info.yomi<<endl;
cout<<"@section"<<(*it).info.section<<endl;
cout<<"@open_date"<<(*it).info.open_date<<endl;
cout<<"@distance"<<(*it).info.distance<<endl;
cout<<"@prefecture"<<(*it).info.prefecture<<endl;
cout<<"@supplement"<<(*it).info.supplement<<endl;
cout<<"@comment"<<(*it).info.comment<<endl<<endl;
一般来说,先把字符串在内存里组装好了,然后一次性输出比这么多cout要快些。
另外,看看你的算法选对了没?哪些地方做了无用功,哪些地方重复做了同样的事。
[解决办法]
endl会刷新缓冲区,显示大量内容的话不要一直调用endl,
把endl 换成"\n"
再在最后调用cout << flush刷新缓冲区把数据显示到屏幕上