我目前正在设计一个缓存实现,用于与最短路径图算法一起使用的论文项目。该图算法的运行时间相当不一致,因此对整个算法进行基准测试太麻烦了。我必须专注于仅基准测试缓存。
我需要基准测试的缓存大约有十几种
我在如何将数据加载到内存中方面遇到了概念性问题。可以创建一个查询日志,它只是一个按照顺序排列的所有查询键的磁盘上的列表(它们是10个字符的字符串标识符),这些查询键在算法的一个运行中被查询。这个文件非常大。我想到的另一个想法是将日志分成1-5百万个查询的块,并按以下方式进行基准测试:
记住访问模式很重要!例如,有一些具有移动到前启发式的哈希表,可以重新排序表的内部结构。多次运行单个块或无序地运行块是不正确的。这使得预热CPU缓存和HotSpot变得更加困难(我还可以保留一个用于预热但不计时的辅助虚拟缓存)。
如何在巨大的数据集上进行微基准测试的良好实践是什么?
我需要基准测试的缓存大约有十几种
Map
接口的实现。这些缓存旨在与给定的访问模式(从上述算法中查询键的顺序)良好地配合使用。但是,在“小”问题的运行中,会有数百亿个查询。我需要运行几乎所有的查询才能对基准测试结果有信心。我在如何将数据加载到内存中方面遇到了概念性问题。可以创建一个查询日志,它只是一个按照顺序排列的所有查询键的磁盘上的列表(它们是10个字符的字符串标识符),这些查询键在算法的一个运行中被查询。这个文件非常大。我想到的另一个想法是将日志分成1-5百万个查询的块,并按以下方式进行基准测试:
- 加载1-5百万个键
- 将开始时间设置为当前时间
- 按顺序查询它们
- 记录经过的时间(当前时间-开始时间)
记住访问模式很重要!例如,有一些具有移动到前启发式的哈希表,可以重新排序表的内部结构。多次运行单个块或无序地运行块是不正确的。这使得预热CPU缓存和HotSpot变得更加困难(我还可以保留一个用于预热但不计时的辅助虚拟缓存)。
如何在巨大的数据集上进行微基准测试的良好实践是什么?
System.currentTimeMillis
,而应该使用System.nanoTime()
:System.currentTimeMillis vs System.nanoTime。 - Luiggi Mendoza