我正在开发一个非常耗时的应用程序,我想加快一点。我使用ctime库的clock()函数分析了单个部件的运行时间并发现了一些东西,这对我来说并不完全清楚。
我在方法的外部和内部打印时间,我们称之为Method1。 Method1中的打印包括它的整个主体,当然只有浮动的返回。嗯,问题是,外面的打印状态是Method1内打印时间的两到三倍。很明显,外面的印刷品应该说明更多的时间,但差异对我来说似乎很大。
我的方法如下所示,我使用引用和指针作为参数来防止数据复制。请注意,数据向量包含330.000指向实例的指针。
float ClassA::Method1(vector<DataClass*>& data, TreeClass* node)
{
//start time measurement
vector<Mat> offset_vec_1 = vector<Mat>();
vector<Mat> offset_vec_2 = vector<Mat>();
for (int i = 0; i < data.size(); i++)
{
DataClass* cur_data = data.at(i);
Mat offset1 = Mat();
Mat offset2 = Mat();
getChildParentOffsets(cur_data, node, offset1, offset2);
offset_vec_1.push_back(offset1);
offset_vec_2.push_back(offset2);
}
float ret = CalculateCovarReturnTrace(offset_vec_1) + CalculateCovarReturnTrace(offset_vec_2);
//end time measurement
return ret;
}
是否有任何“明显”的方式来提高通话速度?出于可读性原因,我更倾向于保留该方法,因此,我可以更改任何内容以加快速度吗?
我很感激任何建议!
答案 0 :(得分:2)
不试图声称其他人对OP提出的任何评论......
(1)简短答案可能是,“不。”这个功能看起来很清楚,并且它做了很多工作30,000次。然后,它正在对“所有数据”进行计算。
(2)考虑重新使用“offset1”和“offset2”矩阵,而不是为每次迭代创建全新的矩阵。当然,还有待观察,这实际上是否会更快。 (无论如何,见下文,它相当于“使用代码。”)
(3)因此,借用编程风格元素:“不要'拖拽'代码使其更快:找到更好的算法。”在这种情况下,可能不会有一个。您可能需要通过“向其投掷芯片”来解决运行时问题,并且我建议首先要做的是尽可能多地为此计算机添加RAM。 “处理大量数据”的过程非常容易受到虚拟内存页面错误的影响,每个错误需要大约*毫秒才能解决。 (那些百分之一秒的加法很快。)
我个人没有看到任何明确错误的代码,也没有任何断然使其运行得更快。我也不会主张从你现在非常明确的表达中重写(“diddling”)代码。
答案 1 :(得分:2)
根据您更新的代码,结束时间测量和函数调用后的测量之间的唯一代码是函数中构造对象的析构函数。这是每个330,000 Mat
s的两个向量。这可能需要一些时间,具体取决于每个Mat
使用的资源。