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

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

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

谢谢!

如果你问一个C / C ++程序的通用分配器,那么我发现了这篇论文Hoard:一个用于multithreading应用程序的可扩展内存分配器,它考虑了这个问题。 这是本文档的引用

目前还没有用于评估multithreading分配器的标准测试套件。 我们知道没有专门强调服务器应用程序(如Web服务器1和数据库管理器)的multithreading性能的基准测试。 我们选择了其他论文中描述的基准测试和其他文章(来自Larson和Krishnan的Larson基准测试[22]和来自MicroQuill,Inc。的shbench基准测试[26]),两个multithreading应用程序,包括基准测试(BEMengine [7]和barnes-hut [1,2]),并写了一些我们自己的微基准来强调内存分配性能的不同方面(threadtest,active-false,passive-false)。

这篇论文有点陈旧。 但是我最近看到了HP-UX的分配器( MallocNextGen ),惠普也无法确保它适用于所有可能的应用程序。 它说:

通常期望新的分配器可以提高应用程序的性能。 但是,可能存在一些性能可能降低的应用程序。 因此,建议用户在使用生产环境中的新分配器之前,使用libc中的默认内存分配器和libmallocng中的分配器对其应用程序进行基准测试。

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

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

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

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

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

你可以下载nedmalloc并尝试比较你的分配器。 它有一个名为test.c的测试,带有源代码,你可以根据你的分配器重写它。