读书人

帮小弟我优化一下代码 这个执行速度太

发布时间: 2012-03-24 14:00:47 作者: rapoo

帮我优化一下代码 这个执行速度太长了
#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刷新缓冲区把数据显示到屏幕上

读书人网 >C++

热点推荐