我有一个最大限度地使用递归函数的应用程序。基本上它是一个字符串解析器,它使用哈希映射作为其数据结构。我们正面临着一个问题,即对于复杂的长字符串,性能受到严重影响。我们不敢触及散列函数,因为害怕回归。观察到的是一个大规模的递归函数调用,我们怀疑它会导致性能问题。该应用程序是基于VS 2008开发的C ++(Windows)
堆栈保留大小和堆栈提交大小的增加是否会提高应用程序性能?要么 它会避免我们遇到的内存不足问题,但不经常发生
答案 0 :(得分:3)
堆栈保留大小和堆栈提交大小的增加是否会提高应用程序性能?
几乎可以肯定,它对性能没有明显的影响。
它会避免我们遇到的内存不足问题吗?
没有。如果用完堆栈空间,则会出现堆栈溢出错误,而不是内存不足。
答案 1 :(得分:1)
堆栈使用本身不会显着影响性能。进行函数调用(恰好是递归调用)的成本可能是哈希函数运行时的重要部分,如果是这样,迭代版本可能会更快。
C ++中递归的最大使用效率可能很低,并且由于堆栈大小有限,因此也有些危险。例如,
size_t hash(const std::string &s) {
if (s.size() == 0) return 0;
return s[0] + 31 * hash(s.substr(1));
}
对于两个原因(调用开销和分配字符串加载的可能性),这可能效率低下,并且在传递足够长的字符串时也会因堆栈溢出而崩溃。
我们不敢触及哈希函数,因为害怕回归
除了性能之外,哈希映射中使用的哈希函数应该被隔离以便于维护 - 代码的一个副本,并且在任何其他地方都没有使用任何特定哈希算法的假设。
如果您可以隔离哈希函数,那么您可以敢于触摸它。这样,您可以轻松地比较不同的哈希算法和不同的实现(包括递归/非递归),看看它们是否能解决您的整体性能问题。
如果您无法隔离哈希函数,那么您已经学习了有关代码设计的课程。但是,您可能仍然可以替换它,并了解它是否会影响性能,而不知道代码是否仍然正确。如果你可以加快速度,那么值得尝试使其正确(通过修改代码的其余部分来隔离哈希函数然后替换它)。如果你能提出的最好的哈希函数并不快,那么它是否正确并不重要,因为没有理由使用它。