在现代系统上,通过压缩输出流可以提高本地硬盘写入速度吗?
这个问题源于我正在使用的一个案例,其中一个程序连续生成并将1-2GB的文本记录数据转储到硬盘上的原始文本文件中,我认为它是IO绑定的.我希望能够通过在数据进入磁盘之前压缩数据来减少运行时间,还是压缩的开销会占用我可以获得的任何增益?有空闲的第二个核心会影响这个吗?
我知道这将受到用于生成数据的CPU数量的影响,因此需要多少空闲CPU时间的经验法则是好的.
我记得一个视频谈话,有人使用压缩来提高数据库的读取速度,但IIRC压缩比解压缩更加耗费CPU.
是的,是的,是的,绝对的.
以这种方式看待它:以每秒兆字节为单位获取最大连续磁盘写入速度.(继续测量它,计算一个巨大的fwrite或其他东西.)让我们说100mb/s.现在以CPU为单位,以兆赫为单位; 让我们说3Ghz = 3000mhz.将CPU速度除以磁盘写入速度.这是CPU占用空闲的周期数,您可以在压缩时每字节消耗.在这种情况下,每个字节3000/100 = 30个周期.
如果你有一个算法可以将你的数据压缩25%以获得有效的125mb/s写入速度,那么每个字节就有24个周期来运行它并且它基本上是免费的,因为CPU无论如何都不会做任何事情.在等待磁盘流失时.每字节24个周期=每个128字节高速缓存线3072个周期,轻松实现.
我们在阅读光学媒体时一直这样做.
如果你有一个闲置的第二个核心,那就更容易了.只需将日志缓冲区移交给该核心的线程,只要它喜欢压缩数据就可以,因为它没有做任何其他事情!唯一棘手的一点是你想要实际拥有一个缓冲区环,这样你就没有生成器线程(生成日志的那个)在互斥锁上等待消费者线程(将其写入磁盘的那个)的缓冲区持有.