这个问题比较模糊,我并不是真的需要一个答案,但是我非常好奇答案可能是什么,所以我还是要问一下。
我有一个生成大量矩阵的算法。稍后它会运行第二个算法来生成解决方案。我运行了100次,平均需要约17秒。
第二个算法几乎完全相同,唯一的区别是在每个矩阵生成时就运行第二个算法,这样它们实际上不需要存储在任何地方。这种变体显然需要更少的空间,这也是我制作它的原因,但对于同一个问题,它只需要平均约2秒钟。
我没有预料到它会运行得更快,尤其是那么多。
代码相当复杂,所以我将尝试用类似伪代码的方式概述差异。
在递归填充后,循环运行checkAlgorithm来检查缓存中的所有元素。两个算法除了我未在代码中包含的内容之外完全相同。我猜存储在向量中是耗费所有时间的原因,但如果我记得正确的话,C++向量的大小每次超出限制时都会翻倍,所以重新分配不应该发生太频繁。 有什么想法吗?
我有一个生成大量矩阵的算法。稍后它会运行第二个算法来生成解决方案。我运行了100次,平均需要约17秒。
第二个算法几乎完全相同,唯一的区别是在每个矩阵生成时就运行第二个算法,这样它们实际上不需要存储在任何地方。这种变体显然需要更少的空间,这也是我制作它的原因,但对于同一个问题,它只需要平均约2秒钟。
我没有预料到它会运行得更快,尤其是那么多。
代码相当复杂,所以我将尝试用类似伪代码的方式概述差异。
recursiveFill(vector<Matrix> &cache, Matrix permutation) {
while(!stopCondition) {
// generate next matrix from current permutation
if(success)
cache.push_back(permutation);
else
recursiveFill(cache, permutation);
// some more code
}
}
recursiveCheck(Matrix permutation) {
while(!stopCondition) {
// alter the matrix some
if(success)
checkAlgorithm(permutation);
else
recursiveCheck(permutation);
// some more code
}
}
在递归填充后,循环运行checkAlgorithm来检查缓存中的所有元素。两个算法除了我未在代码中包含的内容之外完全相同。我猜存储在向量中是耗费所有时间的原因,但如果我记得正确的话,C++向量的大小每次超出限制时都会翻倍,所以重新分配不应该发生太频繁。 有什么想法吗?
cachegrind
是valgrind
的缓存检查工具,你可以通过在命令行中添加--tool=cachegrind
来激活它。它对你的两个代码有何评价? - cmaster - reinstate monica