C++ C++;如何加快我的程序设计

C++ C++;如何加快我的程序设计,c++,C++,我正试图设计一个和弦系统 问题是我的系统工作正常,如果大小像10-20行addPeer、removePeer等 但是当我用5000行命令文件测试它时 前几百行非常快,但随着程序加载越来越多的行,它开始变慢 由于程序的要求是测试我的程序设计,我不能使用线程 我听说指针是更快完成任务的好方法,但我如何在我的案例中使用指针呢 这是我的班级 class chord { public: chord(); ~chord(); struct fingerTable { int index; int key

我正试图设计一个和弦系统

问题是我的系统工作正常,如果大小像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 ..*/
};
类和弦
{
公众:
和弦();
~chord();
结构指表{
整数指数;
int键;
};
结构节点{
int-nodeid;
向量可折叠;
矢量数据;
};
void addPeer(int);
向量cNode;
向量可折叠;
/*还有一些功能*/
};
这是我的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
void chord::addPeer(int-id)
{
//id=节点id
int fIndex,nextNode;
节点newNode;
载体ft1;
矢量数据1;
//增量索引计数器
//indexCounter++;
newNode.nodeid=id;
//首先插入一个空白的fingerTable。
newNode.fTable=ft1;
//首先插入一个空白数据。
newNode.data=data1;
//将节点推回到向量和弦索引节点
cNode.推回(新节点);
//indexCounter++;
//执行手指表计算
//根据节点ID对其进行排序
排序(cNode.begin()、cNode.end()、sortByNodeID);
对于(int i=0;i更改容器

通过使用
std::vector
,您的算法花费了大部分时间将和弦复制到错误的位置


如果你希望你的和弦被排序,考虑使用<代码> STD::设置<代码> STD::向量

< p>这是因为你在不断地排序。你应该先使用一个排序结构,比如<代码> STD::MAP< /代码> .< /P>,你在每个<代码> AddoPeer-<代码>上做线性工作,所以当然它会很慢。(总时间:二次)。您是否考虑过为什么在添加对等节点时需要执行所有这些工作?因为当我添加对等节点时,下一个节点会受到影响,因此我需要重新安排其数据,以检查数据是否有任何更改应属于哪个节点。但我会再次仔细查看我的代码。感谢您的反馈。您需要首先进行基准测试,以了解哪些更改属于哪个节点t实际上很慢。如果不是算法:输入/输出通常是一个可能的候选者。忘记在打开优化的情况下编译也是如此。下一件事是在事先知道大小的情况下使用
vector::reserve
最小化分配。@pmr,我可以取消每次运行的变量设置吗,这样变量就不会保持增量,例如2临时雇员vector@user2017011首先进行基准测试。始终。当你不知道速度慢的部分在哪里时,永远不要进行优化。对瓶颈的直觉通常是错误的。谢谢,这是一个很好的反馈。我认为我真的需要改变我的容器,我能做些什么使它更快。它仍然太慢吗?答案永远是“是的,你可以做一些事情来加快速度”。