PNG并非速度优先设计。它比JPEG更慢,而比TIFF文件大小还要大。如果您不得不使用PNG格式,其他任何优化都不会有所改变。
例如:
$ time vips avg wtc.tif
117.853995
real 0m0.525s
user 0m0.756s
sys 0m0.580s
$ time vips avg wtc.png
117.853995
real 0m3.622s
user 0m3.984s
sys 0m0.584s
“wtc”是一张10,000 x 10,000的RGB照片,tif格式是未压缩的条带格式,png也是未压缩的。这两张图片都在磁盘缓存中,“avg”会查找并打印出平均像素值。
Vips有自己的“.v”格式,它只是一个包含大量像素的缓冲区。这种格式可以使用mmap()并行读取,速度更快:
$ time vips avg wtc.v
117.853995
real 0m0.162s
user 0m0.460s
sys 0m0.092s
如果你的图片可以压缩,权衡就会有所变化。例如,JPEG通常会压缩10倍,因此解码速度比磁盘速度更重要。您需要使用类似于libturbojpeg的优化解码库并同时处理多个文件。
$ time vips avg wtc.jpg
117.853995
real 0m1.413s
user 0m1.696s
sys 0m0.564s
PNG使用libz,对于摄影图像而言,压缩率最多只能达到约2倍。即使在相同的压缩等级下,它的速度也比采用Deflate的TIF格式要慢得多:
$ time vips avg wtc.tif
117.853995
real 0m3.154s
user 0m3.496s
sys 0m0.540s
$ time vips avg wtc.png
117.853995
real 0m4.888s
user 0m5.196s
sys 0m0.556s
$ ls -l wtc.*
-rw-r
-rw-rw-r
-rw-rw-r
-rw-rw-r
我想另一个因素是你的处理时间。如果你正在进行一些密集的操作,阅读速度和解码速度就不那么重要了。