用于测试C和C++分配器的基准测试?

Vie*_*iet 8 c c++ memory benchmarking memory-management

请建议用于测试C和C++分配器的基准测试?满足以下任何方面的基准被认为:

  1. 速度
  2. 碎片
  3. 并发

谢谢!

Pat*_*ick 7

几年前我自己测试了几个分配器,我的经验是结果都取决于测试类型.如果您想自己编写一些基准测试,请考虑以下情况:

  • 分配大量单个内存,然后释放所有内存
  • 分配大量不同大小的内存,然后释放所有内存
  • 只分配几块内存,释放它们,并重复这个循环几次(重复相同大小的块和不同大小的块)
  • 分配大量不同大小的内存,免费分配一半(例如偶数分配),然后在循环中分配和释放内存
  • 使用两个线程并行分配内存
  • 使用三个,四个,五个......线程并行分配内存

您会注意到每次测试的结果都不同.在一种情况下非常好的分配器在其他情况下可能是坏的.

在实践中,这意味着最好在您的应用程序中,在实时/现实情况下对其进行测试.


Ara*_*raK 5

您可以下载nedmalloc并尝试将分配器与它进行比较.它有一个test.c使用源代码调用的测试,您可以根据您的分配器重写它.


小智 4

如果您询问 C/C++ 程序的通用分配器,那么我找到了这篇论文Hoard:用于多线程应用程序的可扩展内存分配器,它考虑了这个问题。这是该文档的引用

目前还没有用于评估多线程分配器的标准基准套件。据我们所知,没有任何基准测试专门强调服务器应用程序(例如 Web 服务器 1 和数据库管理器)的多线程性能。我们选择了其他论文中描述的和以其他方式发布的基准(Larson 和 Krishnan [22] 的 Larson 基准以及 MicroQuill, Inc. [26] 的 shbench 基准),两个多线程应用程序,其中包括基准(BEMengine [7] 和 barnes-hut) [1, 2]),并编写了一些我们自己的微基准测试来强调内存分配性能的不同方面(线程测试、主动错误、被动错误)。

这张纸有点旧了。然而,我最近看到了 HP-UX 的分配器(MallocNextGen),并且 HP 也无法确保它适用于所有可能的应用程序。它说:

人们普遍期望新的分配器能够提高应用程序的性能。但是,某些应用程序的性能可能会下降。因此,建议用户在生产环境中使用新分配器之前,使用 libc 中的默认内存分配器和 libmallocng 中的分配器对其应用程序进行基准测试。

至于速度和并发性,我自己的经验是,您必须测量自己的程序的性能才能比较两个不同的分配器。如果我们谈论 Linux,您可以使用 LD_PRELOAD 来加载不同的分配器。