【问题标题】: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,你认为这会是瓶颈吗?

标签: c++ optimization stack


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2015-07-15
    • 1970-01-01
    • 2013-07-05
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-04-17
    相关资源
    最近更新 更多