首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-24 
帮我优化一下代码这个执行速度太长了#includeiostream#includestring#includefstream#includevecto

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

热点排行