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

C++ 堆栈保留大小和堆栈提交大小的增加是否会提高应用程序性能?,c++,windows,stack,C++,Windows,Stack,我有一个最大限度地利用递归函数的应用程序。基本上,它是一个字符串解析器,使用哈希映射作为其数据结构。我们面临的问题是,对于复杂的长字符串,性能会受到严重影响。我们不敢碰hash函数,因为害怕回归。我们观察到的是大量递归函数调用,我们怀疑这是导致性能问题的原因。该应用程序是在VS2008中开发的基于C++(Windows)的应用程序 堆栈保留大小和堆栈提交大小的增加是否会提高应用程序性能?或 它能避免我们经常遇到的内存不足问题吗 堆栈保留大小和堆栈提交大小的增加是否会提高应用程序性能 几乎可以肯定

我有一个最大限度地利用递归函数的应用程序。基本上,它是一个字符串解析器,使用哈希映射作为其数据结构。我们面临的问题是,对于复杂的长字符串,性能会受到严重影响。我们不敢碰hash函数,因为害怕回归。我们观察到的是大量递归函数调用,我们怀疑这是导致性能问题的原因。该应用程序是在VS2008中开发的基于C++(Windows)的应用程序

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

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

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

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

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

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

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

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


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

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

递归在C++中的最大使用可能是低效的,而且也有点危险,因为堆栈大小是有限的。比如说,

size_t hash(const std::string &s) {
    if (s.size() == 0) return 0;
    return s[0] + 31 * hash(s.substr(1));
}
这可能由于两个原因(调用开销和它分配字符串负载的可能性)而效率低下,并且当传递足够长的字符串时,也会因堆栈溢出而崩溃

我们不敢碰hash函数,因为害怕回归

即使除了性能之外,哈希映射中使用的哈希函数也应该被隔离以便于维护——一个代码副本,并且不假设在其他任何地方使用了任何特定的哈希算法

如果你能隔离散列函数,那么你就可以大胆去碰它。通过这种方式,您可以轻松地比较不同的哈希算法和不同的实现(包括递归/非递归),以查看它们是否解决了总体性能问题


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

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

递归在C++中的最大使用可能是低效的,而且也有点危险,因为堆栈大小是有限的。比如说,

size_t hash(const std::string &s) {
    if (s.size() == 0) return 0;
    return s[0] + 31 * hash(s.substr(1));
}
这可能由于两个原因(调用开销和它分配字符串负载的可能性)而效率低下,并且当传递足够长的字符串时,也会因堆栈溢出而崩溃

我们不敢碰hash函数,因为害怕回归

即使除了性能之外,哈希映射中使用的哈希函数也应该被隔离以便于维护——一个代码副本,并且不假设在其他任何地方使用了任何特定的哈希算法

如果你能隔离散列函数,那么你就可以大胆去碰它。通过这种方式,您可以轻松地比较不同的哈希算法和不同的实现(包括递归/非递归),以查看它们是否解决了总体性能问题


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

@James很难分析,因为模块是应用程序的核心,如果我们试图分析它,可能无法得到正确的结果picture@James由于模块是应用程序的核心,所以很难对其进行评测,如果我们尝试对其进行评测,可能无法获得正确的图片我不知道。我不知道你的程序在做什么。我刚刚回答了你问的问题。但是如果你正在解决内存问题,那么问题不是你的堆栈太小,它几乎肯定是这样,从C++编译器中获得尾调用优化是很少见的。通过查看反汇编很容易看出,如果在递归调用中看到调用而不是JMP,那么您将在迭代算法方面取得巨大的进步。@Hans u给我一些希望:)@David正在注册堆栈大小增加后所需的可执行文件?我的意思是,如果我将可执行文件发送到另一台机器,是否需要在该机器上注册该可执行文件?我不知道。我不知道你的程序在做什么。我刚刚回答了这个问题