1

是否有任何方法可以向编译器提示某些对象可能具有更静态的行为,并在堆栈而不是堆上分配东西?例如,字符串对象可能在某些函数中具有某种恒定大小。我问这个是因为我试图通过使用 OpenMP 来提高应用程序的性能。我已经将串行部分从 50 秒提高到了 20 秒,并行性提高到了 12 秒(提到大部分代码可以并行运行)。我正在努力继续改进。我认为一个限制与同一进程内动态内存的连续分配和释放有关。到目前为止,串行优化与合并到更 ANSI C 的方法有关,变量分配更硬编码(它们是动态分配的,但考虑到最坏的情况,所以一切都分配一次)。现在我几乎被卡住了,因为我已经到达了有很多 C++ 方法的代码的一部分。

4

3 回答 3

1

标准的std::basic_string模板(它std::string是一个特化)接受一个分配器作为它的第三个参数,你可以提供你自己的基于堆栈的分配器而不是std::allocator,但这将是脆弱和棘手的(你可以使用alloca(3)并确保所有分配都是内联的;如果不是,alloca则不会按您的意愿工作。)。我不推荐这种方法。

更可行的方法可能是拥有自己的基于竞技场或区域的分配器。见std::allocator_traits

您也许可以在足够大的本地缓冲区(例如)上简单地使用 C snprintf(3char buf[128]; )

于 2014-11-04T09:24:16.497 回答
0

我认为您正在寻找一个小的缓冲区优化。详细说明可以在这里找到。基本思想是在类中添加一个联合,它将保存缓冲区:

class string
{
  union Buffer
  {
    char*    _begin;
    char[16] _local;
  };

  Buffer _buffer;
  size_t _size;
  size_t _capacity;
  // ...
};
于 2014-11-04T09:33:10.660 回答
0

所以您正在通过使用静态分析来查找性能回归来寻找缺陷?

这是个好主意,cppcheck 有其中的一些,但这些都是非常初级的。到目前为止,我不知道有任何工具可以做到这一点。

然而,有一些工具可以做不同的事情:

杰马洛克

jemalloc有一个分配分析器。(参见: http: //www.canonware.com/jemalloc/)也许这对您有所帮助。到目前为止,我自己还没有尝试过,但我希望它能够发布对象生命周期以及对分配器产生最大压力的对象(首先找到最有害的部分)。

缓存研磨

Valgrind 还有一个缓存和分支预测模拟器。http://valgrind.org/docs/manual/cg-manual.html

铿锵检查

如果您发现自己有太多空闲时间,您可以尝试使用clang-check.

谷歌性能工具

google perf 工具也有一个堆分析器。https://code.google.com/p/gperftools/

于 2014-11-04T09:47:26.283 回答