0

私はコードシステムを設計しようとしています..

問題は、サイズが10〜20行のaddPeer、removePeerなどの場合、システムが正常に動作することです..

しかし、5000行ほどのコマンドファイルでテストすると.

最初の数百はかなり高速でしたが、プログラムがロードする行が増えるにつれて、遅くなり始めます..

プログラムの要件はプログラム設計をテストすることであるため、スレッドを使用できません。

ポインターは物事をより速く行うための良い方法だと聞きましたが、私の場合、ポインターをどのように使用すればよいでしょうか。

これは私のクラスヘッダーです..

class chord 
{
public:
chord();
~chord();

struct fingerTable {
int index;
int key;
};

struct node {
int nodeid;
vector<fingerTable> fTable;
vector<string> data;
};

void addPeer(int);

vector<node> cNode;
vector<fingerTable> fTable;

/* SOME more functions ..*/
};

これは私のaddPeer関数です

void chord::addPeer(int id)
{
//id = node ID
int fIndex,nextNode;
node newNode;
vector<fingerTable> ft1;
vector<string> data1;
//increment indexCounter
//indexCounter++;

newNode.nodeid = id;
//insert a blank fingerTable first.
newNode.fTable = ft1;
//insert a blank data first.
newNode.data = data1;

//push back node to vector chord Index Node
cNode.push_back(newNode);
//indexCounter++;
//perform finger table computation

//sort it base on its NodeID
sort(cNode.begin(),cNode.end(),sortByNodeID);

for(int i=0;i<cNode.size();i++)
{
if(cNode[i].nodeid==id)
{
fIndex=i;
}
}//end for loop to loop finding index of node

if(fIndex!=cNode.size()-1)
{
//if not last element
nextNode=fIndex+1;
}
else
{
nextNode=0;
}

//now we get the message vector of the next node and do a datashift on it.
data1 = cNode[nextNode].data;
//clear its data away so we can empty it and re-arrange it.
cNode[nextNode].data.clear();
//performing data shift function
dataShift(data1,fIndex-1);

if(id!=0)
{
cout << "PEER " << id << " inserted."<< endl;
}

}//end addPeer

私の質問は、この関数 addPeer のどの部分を即興で作成して、プログラム全体の行をより高速に実行できるかということです。数百行を実行すると非常に遅くなるからです。

4

2 に答える 2

1

常にソートしているため、これは遅くなります。あなたはプロブする必要があります。のようなソートされた構造を使用しstd::map<int,node>ます。

于 2013-02-16T18:24:57.343 に答える
0

コンテナを変更します。

を使用すると、アルゴリズムはコードを間違ったstd::vector場所にコピーすることにほとんどの時間を費やします。

コードを並べ替えたい場合は、std::set代わりに を使用することを検討してくださいstd::vector

于 2013-02-16T17:54:08.000 に答える