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

8
请您提供用于测试C和C++分配器的基准测试?满足以下任一方面的基准测试均可考虑:

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

谢谢!


你想测试它的哪个方面,速度、碎片化等? - Andreas Brinck
3个回答

8
我几年前亲自测试了几个内存分配器,我的经验是结果都取决于测试的类型。如果你想自己编写一些基准测试,请考虑以下情况:
  • 分配大量相同大小的内存,然后全部释放
  • 分配大量不同大小的内存,然后全部释放
  • 仅分配少量内存块,释放它们,并重复执行此循环多次(对于相同大小的块和不同大小的块分别重复)
  • 分配大量不同大小的内存,释放其中一半(例如偶数分配),然后在循环中分配和释放内存
  • 使用两个线程并行分配内存
  • 使用三个、四个、五个……线程并行分配内存
你会发现每个测试的结果都不同。在一个情况下表现良好的内存分配器,在另一个情况下可能表现糟糕。
实际上,这意味着最好在应用程序中以实时/实际情况进行测试。

5
您可以下载 nedmalloc 并尝试将您的分配器与其进行比较。它有一个名为 test.c 的测试,其中包含源代码,您可以根据自己的分配器进行重写。

4
如果你询问C/C++程序的通用分配器,那么我找到了这篇论文Hoard: A Scalable Memory Allocator for Multithreaded Applications来考虑这个问题。这是该文件的一句引用。

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

这篇论文已经有些过时了。然而,我最近看到了一个适用于HP-UX的分配器(MallocNextGen),但是惠普也不能保证它适用于所有可能的应用程序。它说:
新的分配器通常预计会改善应用程序的性能。然而,可能会有一些应用程序性能会下降。因此,建议用户在使用生产环境中的新分配器之前,先使用libc中的默认内存分配器和libmallocng中的分配器对其应用程序进行基准测试。
至于速度和并发性,我的经验是您必须测量自己程序的性能,以比较两个不同的分配器。如果我们谈论Linux,则可以使用LD_PRELOAD加载不同的分配器。

+1。是的,如果没有标准基准测试,我们应该以什么为依据来理解和解释结果呢? - Viet
据我所知,一种想法是测量您自己的应用程序性能。另一方面,您可以选择一组真实的程序和自己的测试,以比较分配器。 - user184968

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接