C++加速方法调用
C++ speed up method call
我正在处理一个非常耗时的应用程序,我想加快它的速度。我使用 ctime 库的 clock() 函数分析了单个部件的运行时间,发现了一些我不太清楚的东西。
我在一个方法的外部和内部打印了时间,我们称它为 Method1。 Method1里面的print包括了它的全部内容,当然只排除了float的return。好吧,事实是,外部打印的时间是 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;
}
有什么"obvious"方法可以提高通话速度吗?出于可读性原因,我更愿意保留该方法,因此,我可以更改任何内容以加快速度吗?
我非常感谢任何建议!
不试图对其他人对 OP 发表的任何评论提出要求...
(1) 简短的回答可能是,"no." 这个函数看起来很清楚,它做了很多工作 30,000 次。然后,它正在对 "all that data."
进行计算
(2) 考虑重新使用 "offset1" 和"offset2" 矩阵,而不是为每次迭代创建全新的矩阵。当然,这是否真的会更快还有待观察。 (无论如何,见下文, 等于 "diddling the code.")
(3) 因此,借鉴 编程风格的要素: "Don't 'diddle' code to make it faster: find a better algorithm." 在这种情况下,可能没有。您可能需要 "throwing silicon at it," 解决 运行 时间问题,我建议首先要做的是为这台计算机添加尽可能多的 RAM。 "deals with a lot of data" 非常容易出现虚拟内存页面错误的进程,每个页面错误都需要 *milli-*seconds 的数量级来解决。 (百分之一秒加起来真的很快。)
我个人没有看到此代码有任何绝对错误,也没有任何绝对导致它运行的错误快点。我也不主张重写 ("diddling") 您现在拥有的非常清晰的代码表达方式。
根据您更新的代码,结束时间测量和函数调用后测量之间的唯一代码是函数中构造对象的析构函数。那是每个 330,000 Mat
的两个向量。这可能需要一些时间,具体取决于每个 Mat
所使用的资源。
我正在处理一个非常耗时的应用程序,我想加快它的速度。我使用 ctime 库的 clock() 函数分析了单个部件的运行时间,发现了一些我不太清楚的东西。
我在一个方法的外部和内部打印了时间,我们称它为 Method1。 Method1里面的print包括了它的全部内容,当然只排除了float的return。好吧,事实是,外部打印的时间是 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;
}
有什么"obvious"方法可以提高通话速度吗?出于可读性原因,我更愿意保留该方法,因此,我可以更改任何内容以加快速度吗?
我非常感谢任何建议!
不试图对其他人对 OP 发表的任何评论提出要求...
(1) 简短的回答可能是,"no." 这个函数看起来很清楚,它做了很多工作 30,000 次。然后,它正在对 "all that data."
进行计算(2) 考虑重新使用 "offset1" 和"offset2" 矩阵,而不是为每次迭代创建全新的矩阵。当然,这是否真的会更快还有待观察。 (无论如何,见下文, 等于 "diddling the code.")
(3) 因此,借鉴 编程风格的要素: "Don't 'diddle' code to make it faster: find a better algorithm." 在这种情况下,可能没有。您可能需要 "throwing silicon at it," 解决 运行 时间问题,我建议首先要做的是为这台计算机添加尽可能多的 RAM。 "deals with a lot of data" 非常容易出现虚拟内存页面错误的进程,每个页面错误都需要 *milli-*seconds 的数量级来解决。 (百分之一秒加起来真的很快。)
我个人没有看到此代码有任何绝对错误,也没有任何绝对导致它运行的错误快点。我也不主张重写 ("diddling") 您现在拥有的非常清晰的代码表达方式。
根据您更新的代码,结束时间测量和函数调用后测量之间的唯一代码是函数中构造对象的析构函数。那是每个 330,000 Mat
的两个向量。这可能需要一些时间,具体取决于每个 Mat
所使用的资源。