堆栈保留大小和堆栈提交大小的增加会提高应用程序性能吗



我有一个应用程序,可以最大限度地使用递归函数。基本上它是一个字符串解析器,它使用哈希映射作为数据结构。我们面临的问题是,对于复杂而长的字符串,性能会受到严重打击。由于担心回归,我们不敢碰散列函数。已经观察到的是大量递归函数调用,我们怀疑这是导致性能问题的原因。该应用程序是在VS 2008 中开发的基于C++(Windows)的应用程序

堆栈保留大小和堆栈提交大小的增加会提高应用程序性能吗?或它会避免我们遇到的内存不足问题吗,但不会经常出现

堆栈保留大小和堆栈提交大小的增加会提高应用程序性能吗?

几乎可以肯定,它不会对性能产生明显的影响。

它会避免我们遇到的内存不足问题吗?

否。如果堆栈空间不足,则会出现堆栈溢出错误,而不是内存不足。

堆栈使用本身不会显著影响性能。函数调用(恰好是递归调用)的成本可能是哈希函数运行时的重要组成部分,如果是这样,迭代版本可能会更快。

C++中递归的最大使用可能效率低下,而且也有些危险,因为堆栈大小有限。例如,

size_t hash(const std::string &s) {
if (s.size() == 0) return 0;
return s[0] + 31 * hash(s.substr(1));
}

由于两个原因(调用开销和它分配字符串负载的可能性),这可能效率低下,并且当传递足够长的字符串时,也会因堆栈溢出而崩溃。

我们不敢碰哈希函数,因为担心回归

即使不考虑性能,为了便于维护,哈希映射中使用的哈希函数也应该是隔离的——一个代码副本,而不需要在其他任何地方假设使用了任何特定的哈希算法。

如果你能隔离散列函数,那么你就敢碰它。这样你就可以很容易地比较不同的散列算法和不同的实现(包括递归/非递归),看看它们是否解决了你的整体性能问题。

如果你不能隔离散列函数,那么你已经学到了关于代码设计的一课。不过,在不确定代码是否正确的情况下,您仍然可以替换它,并了解它是否会影响性能。如果你能让它更快,那么值得尝试让它正确(通过修改代码的其余部分来隔离哈希函数,然后替换它)。如果你能想出的最好的哈希函数不是更快,那么它是否正确并不重要,因为没有理由使用它

相关内容

最新更新