17

我的 java 程序大部分时间都花在读取一些文件上,我想优化它,例如,通过使用并发、预取、内存映射文件等。

没有基准的优化是无意义的,所以我进行基准测试。然而,在基准测试期间,整个文件内容被缓存在 RAM 中,这与实际运行不同。因此,基准测试的运行时间要小得多,而且很可能与现实无关。

我需要以某种方式告诉操作系统(Linux)不要缓存文件内容,或者最好在每次基准测试运行之前清除缓存。或者可能会消耗大部分可用 RAM (32 GB),因此只有一小部分文件内容适合。怎么做?

我正在使用卡尺进行基准测试,但在这种情况下,我认为没有必要(它绝不是微基准),我不确定这是一个好主意。

4

2 回答 2

5

清除 Linux 文件缓存

sync && echo 1 > /proc/sys/vm/drop_caches

创建一个使用所有 RAM 的大文件

dd if=/dev/zero of=dummyfile bs=1024 count=LARGE_NUMBER

(完成后不要忘记删除dummyfile)。

于 2012-07-23T10:07:16.347 回答
2

您可以创建一个非常大的文件,然后将其删除。这将清除磁盘缓存。

另一种测试性能的方法是读取大于主内存的文件。

无论哪种方式,您要测试的是硬件的性能。要改善这一点,您需要改进硬件,在软件方面您能做的只有这么多。例如,多线程不会使您的磁盘旋转得更快。;)


Windows NT http://research.microsoft.com/pubs/68479/seqio.doc

在进行顺序扫描时,NT 会发出 64KB 的预取请求

来自 Linux http://www.ece.eng.wayne.edu/~sjiang/Tsinghua-2010/linux-readahead.pdf

顺序预取,在 Linux 中也称为预读,是一种广泛部署的技术,用于弥合存储设备的特性与其应用程序使用效率低下的方式之间的巨大差距

于 2012-07-23T10:05:02.940 回答