可以做些啥来优化离开方法和清空局部变量堆栈所需的时间?

Posted

技术标签:

【中文标题】可以做些啥来优化离开方法和清空局部变量堆栈所需的时间?【英文标题】:What can be done to optimize the amount of time it takes to leave a method and empty out the stack of local variables?可以做些什么来优化离开方法和清空局部变量堆栈所需的时间? 【发布时间】:2012-12-11 16:27:27 【问题描述】:

我有一个方法负责获取 openGl 三角形网格并将其转换为 3ds 文件。此方法称为exportShape()。为了执行这个转换exportShape() 创建了一堆非常大的向量和 hash_maps。目前,从exportShape() 的最后一行到调用exportShape() 的下一行代码最多可能需要5 分钟。我确信所有这些时间都花在清空非常大的局部变量堆栈上,因为如果我将所有局部向量和 hash_maps 移动到全局范围,该方法会立即存在,正如我所期望的那样。

为什么我能够在几秒钟内填充所有这些本地数据结构,而将它们从堆栈中弹出需要几分钟?如何优化离开exportShape() 并清除堆栈的过程?

编辑:

被删除的对象只包含字符串、双精度和整数——没有自定义析构函数。

我几乎解决了我自己的问题。在发布模式下运行是巨大的性能提升(~20 倍)。尽管如此,该过程仍会挂起几秒钟。还有什么可以做的吗?

【问题讨论】:

大部分时间可能是在破坏vectors/hash_maps 的元素。所以也许你应该告诉我们你在里面放了什么,以及这些对象是否有昂贵的析构函数。 所以,你应该给我们一个SSCCE 你的函数exportShape() 如果您将堆栈对象移动到全局范围,它们的析构函数将在程序退出之前不会被调用 - 这解释了性能差异。 "被删除的对象只包含字符串、双精度和整数 - 没有自定义析构函数。" - 字符串有一个自定义析构函数。 @Mysticial,你认为这会是瓶颈吗? 【参考方案1】:

第一个实例的问题是您使用的是调试分配器,它用位模式(例如0xfdfdfdfd)标记释放的内存,以帮助检测对释放内存的访问。这显然需要时间,因为它必须遍历所有释放的内存。

为了进一步加快速度,您可以使用范围分配器,例如Boost Pool Library;另见Creating a scoped custom memory pool/allocator?

【讨论】:

以上是关于可以做些啥来优化离开方法和清空局部变量堆栈所需的时间?的主要内容,如果未能解决你的问题,请参考以下文章

查询在数据库中花费了更多时间,尽管在连接条件中使用了索引列,那么我们可以在代码中做些啥来优化

我应该做些啥来让它显示变量而不是值?

我可以做些啥来加快这个 SQL 查询的速度?

可以做些啥来防止类似论坛的应用程序中的垃圾邮件?

我的代码有点脏,我想不出改进它的方法,我能做些啥来获得更紧凑和更好的解决方案?

查询很慢,我可以做些啥来改进?