Googleが最新の実行ファイルのアップデート方法を発表した。
[google.com]、
[sourceforge.jp]、
[mycom.co.jp]
Chromeのアップデートの際に旧版と最新版の差分をこれまでは純粋にバイナリのdiffとして配信していた。新方式に移行することで例えば190.1->190.4への移行に際して以下のようにデータ量を1/10程に出来るという。
| Full update | 10,385,920 |
| bsdiff update | 704,512 |
| Courgette update | 78,848 |
ではこの新方式とはいったいなんであろう?
Google Chromeの公式ブログには以下のような説明がある。
server:
asm_old = disassemble(original)
asm_new = disassemble(update)
asm_new_adjusted = adjust(asm_new, asm_old)
asm_diff = bsdiff(asm_old, asm_new_adjusted)
transmit asm_diff
client:
receive asm_diff
asm_old = disassemble(original)
asm_new_adjusted = bspatch(asm_old, asm_diff)
update = assemble(asm_new_adjusted)
※ここでoriginalとは旧バージョンのことと思われる。
まず、サーバ側では旧版、新版ともに逆アセンブルを行い、実行ファイルにコンパイルされる直前のデータに起こしてから、その差分を転送する。
クライアント側では手元にある旧版を逆アセンブルし、ダウンロードしたパッチをあて、アセンブルする。
最適化が施され、大きくなりがちなバイナリ差分よりも、その手前のデータの方が
差分が小さくなるというのは納得しやすい。
デメリットはクライアント側に逆アセンブル、アセンブルを行うプログラムを仕込まなければならないことと、その実行時間がせっかく短縮したダウンロード時間を相殺するのではないかということくらい。
これくらい複雑な仕組みを導入するに足る、転送量が減るということは大きなメリットだ。Chromeはバックグラウンドでアップデートを行うため、CPUを使うのはいいが、ダウンロードは帯域使用によってユーザの環境をも圧迫する。
ところで、Linuxのアップデートに使われるyumにはそのような差分アップデート機能はない。常にフルアップデートだ。そろそろどうにかならないものか。
そういえば
7zipと同じ圧縮方式のxzをGNUが採用したらしい。
ringサーバにはcoreutils-7.4.tar.xzがあるとのこと。
coreutils-7.4.tar.gz - 9708910B
coreutils-7.4.tar.xz - 4048924B
gzipの半分以下とは…。
とにかく、Googleのスピード狂、チューニング狂っぷりには執念を感じるほどだ。
Page Speedもある。そういった部分、単純に尊敬する。