是否有任何方法可以为编译器提示某些对象可能具有更静态的行为,并在堆栈而不是堆上分配东西? 例如,字符串对象在某些函数中可能具有一种常量大小。 我问这个是因为我试图通过使用OpenMP来提高应用程序的性能。我已经将串行部分从50秒提高到20秒,并且并行性提升到12秒(提到大多数代码可以并行运行)。我正在努力继续改进。我认为一个限制与同一进程内的动态内存的连续分配和释放有关。 到目前为止,串行优化与合并到更多ANSI C方法有关,更复杂的硬编码分配(它们是动态分配的,但考虑到最坏情况,所以一切都分配一次)。 现在我几乎陷入困境,因为我已经达到了很多C ++方法的部分代码。
答案 0 :(得分:1)
标准std::basic_string模板(其中std::string
是一个特化)接受一个分配器作为它的第三个参数,你可能提供自己的基于堆栈的分配器而不是std::allocator,但是这将是脆弱和棘手的(您可以使用alloca(3)并确保所有分配都内联;如果它们不是alloca
将无法按您的意愿工作。)。我不推荐这种方法。
更可行的方法可能是拥有自己的arena or region based分配器。见std::allocator_traits
你可以简单地在足够大的本地缓冲区上使用C snprintf(3)(例如char buf[128];
)
答案 1 :(得分:0)
我认为你正在寻找一个小的缓冲区优化。 可以找到详细说明Here。 基本思想是在类中添加一个union,它将保存缓冲区:
class string
{
union Buffer
{
char* _begin;
char[16] _local;
};
Buffer _buffer;
size_t _size;
size_t _capacity;
// ...
};
答案 2 :(得分: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/