概要
iOS でよく使用される非同期画像ダウンロードライブラリの SDWebImage と PINRemoteImageを比較しました。
SDWebImage
は色々なアプリに使用されていて知っていましたが PINRemoteImage
は今日知りました。 どっちのほうが良いのかよくわからなかったのでベンチマークを取ってみました。
時間とバッテリー残量が少ないので雑にまとめます。
結果
PINRemoteImage の方が高速でした。
下で詳しく下記ますがベンチマークの処理が終わるまでに SDWebImage は 15 ms かかりましたが、 PINRemoteImage では 14ms で終わりました。 微妙な差ですが PINRemoteImage の勝ちです。
また、メモリ使用量が異常に少なかったです。 Xcode のメモリ使用量のところでは正確に計測できていない可能性もありますが、とりあえずメモリは全然使用しませんでした。
ベンチマークの方法
imagemagick で画像を500枚生成しました。
その画像を nodejs で作ったサーバーをローカルで起動して配信しました。
ベンチマークに使ったアプリはシミュレータで動かしました。
アプリは先程生成した 500枚の画像を4回ダウンロードしてそれにかかった時間を出力するようにしました。
合計で2000枚の画像をダウンロードしていますが、実際はライブラリ側でキャッシュが行われるため501枚目の画像からはネットワーク通信は行われません。
ソースコード
ベンチマークに使用したプロジェクトはここに公開しました。
このファイルがベンチマークの全てです。 https://github.com/mironal/AsyncImageBench/blob/master/AsyncImageBench/ViewController.swift
詳しい結果
時間, 終了時のメモリ使用量
SDWebImage
- 15.459992945194244 ms, 305.4 MB
- 15.180207014083862 ms, 305.9 MB
- 14.194296956062317 ms, 306.4 MB
- 15.525336980819702 ms, 305.5 MB
- 15.591868042945862 ms, 305.4 MB
キャッシュが行われていない状態の時は凄く画面がチラつきました。 その様子は https://youtu.be/8Xu9O-7AmLU にアップロードしてあります。
追記: SDWebImageDelayPlaceholder
を指定することでチラつかなくなりました。
PINRemoteImage
- 13.661346018314362 ms, 34.7 MB
- 13.862448990345001 ms, 35.7 MB
- 14.107374012470245 ms, 35.8 MB
- 13.682069957256317 ms, 34.4 MB
- 15.576615989208221 ms, 35.1 MB
SDWebImage のようなチラつきは発生しませんでした。 https://www.youtube.com/watch?v=T0jDrUqnlxU
まとめ
- PINRemoteImage の方が速くてやけにメモリ使用量が少なかった
- これから選ぶなら PINRemoteImage
- SDWebImage を使ってるプロジェクトも切り替えていきたい
- API のインターフェースが殆ど同じなので移行は楽そう