LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2976|回复: 25

推荐大家使用libjpeg-turbo替代libjpeg

[复制链接]
发表于 2010-11-30 12:51:31 | 显示全部楼层 |阅读模式
速度上提升非常多,哪怕针对libjpeg8来说,对libjpeg6来说就更多了。arch讨论贴:https://bbs.archlinux.org/viewtopic.php?id=99147

我自己也测试了一下:

  • 下载一张分辨率高一点的图片比如http://media.xiph.org/BBB/BBB-1080-png/big_buck_bunny_01065.png
  • 使用软件转换格式,当然最好是分辨率提升到更高,否则处理时间太短看不出效果。我使用gimp将分辨率调整到了5000x2813,文件大小大概有40m。
  • 然后使用time来计算时间,time不是bash自带的time,而是需要pacman -S time。
    1. #编码测试:
    2. for i in {1..50}; do /usr/bin/time -f %e cjpeg big_buck_bunny_01065.ppm > /dev/null; done
    3. #解码测试:
    4. for i in {1..50}; do /usr/bin/time -f %e djpeg big_buck_bunny_01065.jpg > /dev/null; done
    复制代码
    记录下时间,我这里不知道如何保存,只能手动复制。
  • 计算总和,可以使用bc。


结果如下:

    1. arch  libjpeg: djpeg 47.98s ejpeg 70.48s
    2. turbo libjpeg: djpeg 13.64s ejpeg 20.67s
    复制代码
  • 可以看到提升幅度非常大,3-4倍,使用看图软件打开jpeg的时候效果也很明显。


如何使用:

  • 建议使用AUR里面的libjpeg-turbo-svn,至于如何替换系统里面的libjpeg,可以使用--prefix=/usr --with-jpeg8编译。如下,使用了个把月了,目前为止,没有发现不兼容的软件。

  • PKGBUILD:
    1. pkgname=libjpeg-turbo-svn
    2. pkgver=296
    3. pkgrel=1
    4. pkgdesc="A high-speed version of libjpeg for x86 and x86-64 processors which uses SIMD instructions"
    5. arch=('i686')
    6. url="http://libjpeg-turbo.virtualgl.org/"
    7. license=('BSD' 'custom:wxWindows Library Licence')
    8. groups=('lh')
    9. depends=(glibc)
    10. makedepends=('subversion' 'gcc' 'nasm')
    11. provides=('libjpeg-turbo' 'libjpeg=8.0.2')
    12. conflicts=('libjpeg' 'libjpeg-turbo')
    13. replaces=()
    14. backup=()
    15. options=()
    16. install=
    17. source=()
    18. noextract=()
    19. md5sums=() #generate with 'makepkg -g'
    20. _svntrunk=https://libjpeg-turbo.svn.sourceforge.net/svnroot/libjpeg-turbo/trunk
    21. _svnmod=libjpeg-turbo
    22. build() {
    23.   cd "$srcdir"
    24.   if [ -d $_svnmod/.svn ]; then
    25.     (cd $_svnmod && svn --config-dir ../ up -r $pkgver)
    26.   else
    27.     svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod
    28.   fi
    29.   msg "SVN checkout done or server timeout"
    30.   msg "Starting make..."
    31.   rm -rf "$srcdir/$_svnmod-build"
    32.   cp -r "$srcdir/$_svnmod" "$srcdir/$_svnmod-build"
    33.   cd "$srcdir/$_svnmod-build"
    34.   autoreconf -fiv
    35.   ./configure --prefix=/usr --with-jpeg8
    36.   make || return 1
    37. }
    38. package(){
    39.   cd "$srcdir/$_svnmod-build"
    40.   make DESTDIR="$pkgdir" install
    41.   install -D $srcdir/$_svnmod-build/LICENSE.txt $pkgdir/usr/share/licenses/libjpeg-turbo/LICENSE
    42. }
    复制代码
发表于 2010-11-30 13:40:44 | 显示全部楼层
這個用上一段時間了
提昇效果確實非常明顯
我直接覆蓋升級,沒有任何不良的問題
回复 支持 反对

使用道具 举报

发表于 2010-11-30 14:16:40 | 显示全部楼层
特别是编译firefox,--with-system-jpeg
回复 支持 反对

使用道具 举报

发表于 2010-11-30 14:44:08 | 显示全部楼层
看起来很不错~

为了方便大家测试, 写了个测试脚本:

先准备两张图片, bbb.ppm和bbb.jpg:
  1. #!/bin/bash
  2. wget "http://media.xiph.org/BBB/BBB-1080-png/big_buck_bunny_01065.png" -O- | \
  3. convert png:- -resize 5000x bbb.ppm
  4. convert bbb.ppm bbb.jpg
复制代码

然后测试cjpeg/djpeg性能:
  1. #!/bin/bash
  2. # To test against alternative libjpeg.so
  3. # export LD_LIBRARY_PATH="/tmp/libjpeg-turbo/lib":$LD_LIBRARY_PATH
  4. log=libjpeg.txt
  5. ttc=0 ttd=0
  6. for i in {1..50}; do
  7.   tc=$(/usr/bin/time -f %e cjpeg bbb.ppm 3>&1 1> /dev/null 2>&3 3>&-)
  8.   td=$(/usr/bin/time -f %e djpeg bbb.jpg 3>&1 1> /dev/null 2>&3 3>&-)
  9.   ttc=$(bc <<< "scale=2;${ttc}+${tc}")
  10.   ttd=$(bc <<< "scale=2;${ttd}+${td}")
  11.   printf "%05.2f    %05.2f\n" $tc $td >> "${log}"
  12. done
  13. printf "%s\n%05.2f    %05.2f\n" -------------- $ttc $ttd >> "${log}"
  14. echo "cjpeg    djpeg"
  15. printf "%s\n%05.2f    %05.2f\n" -------------- $ttc $ttd
复制代码
查看结果:
  1. cjpeg    djpeg
  2. --------------
  3. 50.20    36.41 (8.0.2)
  4. 14.86    10.21 (turbo)
复制代码

另外我还试了一下
  1. $ feh bbb.jpg
  2. $ LD_LIBRARY_PATH=./lib feh bbb.jpg
复制代码
载入速度明显感觉到有很大差别...
回复 支持 反对

使用道具 举报

发表于 2010-12-1 09:35:08 | 显示全部楼层
我也刚用上,使用上没感觉到有啥提升,先用着吧
回复 支持 反对

使用道具 举报

发表于 2010-12-1 10:31:33 | 显示全部楼层
谢谢了哦, 可能会用到.
回复 支持 反对

使用道具 举报

发表于 2010-12-1 19:10:51 | 显示全部楼层
如何代替 libjpeg6?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-12-1 19:23:25 | 显示全部楼层
本身就是libjpeg6,除非加--with-jpeg{7,8}
回复 支持 反对

使用道具 举报

发表于 2010-12-1 19:33:21 | 显示全部楼层
Post by jarryson;2121770
本身就是libjpeg6,除非加--with-jpeg{7,8}

有什么办法同时替换libjpeg6和libjpeg8?
回复 支持 反对

使用道具 举报

发表于 2010-12-1 20:11:14 | 显示全部楼层
Post by 沙漠之子;2121771
有什么办法同时替换libjpeg6和libjpeg8?

临时搞定(虽然不怎么优雅)
[PHP]pkgname=libjpeg-turbo-svn
pkgver=305
pkgrel=1
pkgdesc="A high-speed version of libjpeg for x86 and x86-64 processors which uses SIMD instructions"
arch=('i686')
url="http://libjpeg-turbo.virtualgl.org/"
license=('BSD' 'custom:wxWindows Library Licence')
groups=('lh')
depends=(glibc)
makedepends=('subversion' 'gcc' 'nasm')
provides=('libjpeg-turbo' 'libjpeg=8.0.2' 'libjpeg6=6b')
conflicts=('libjpeg' 'libjpeg-turbo' 'libjpeg6')
replaces=()
backup=()
options=()
install=
source=()
noextract=()
md5sums=() #generate with 'makepkg -g'

_svntrunk=https://libjpeg-turbo.svn.sourceforge.net/svnroot/libjpeg-turbo/trunk
_svnmod=libjpeg-turbo

build() {
  cd "$srcdir"

  if [ -d $_svnmod/.svn ]; then
    (cd $_svnmod && svn --config-dir ../ up -r $pkgver)
  else
    svn co $_svntrunk --config-dir ./ -r $pkgver $_svnmod
  fi

  msg "SVN checkout done or server timeout"
  msg "Starting make..."

  rm -rf "$srcdir/$_svnmod-build"
  cp -r "$srcdir/$_svnmod" "$srcdir/$_svnmod-build"
  cd "$srcdir/$_svnmod-build"

  autoreconf -fiv
    ./configure --prefix=/usr
  make || return 1
  make DESTDIR="$pkgdir" install

  ./configure --prefix=/usr --with-jpeg8
  make || return 1
  make DESTDIR="$pkgdir" install

  rm $pkgdir/usr/lib/libjpeg.{a,la,so}
  rm $pkgdir/usr/lib/libturbojpeg.{a,la,so}
  install -D $srcdir/$_svnmod-build/LICENSE.txt $pkgdir/usr/share/licenses/libjpeg-turbo/LICENSE
}
[/PHP]
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表