Chrome的新differential压缩算法 - Courgette

598 views
Skip to first unread message

meta

unread,
Jul 16, 2009, 10:42:58 AM7/16/09
to pon...@googlegroups.com

Chromium Blog上提到的Google Chrome用于推送升级包的新的二进制differential 压缩算法Courgette.


文中举了一个Develper Channel从190.1到190.4的升级例子:
  • 完整升级包:10,385,920字节
  • 一般bsdiff算法:704,512字节
  • Courgette算法:78,848字节
很可怕的压缩率. 然后去看了看design document, 其中心思想和我们平时写代码所提倡的不要使用"magic number"有异曲同工之妙: 可以避免对源文件的大量重复修改. 这里是用一个disassembler 来将二进制文件中所有的internal pointer/reference的地址重新符号化, 然后再计算differential. patch文件到客户端进行re-link, 从而恢复成最新文件.

Linker

unread,
Jul 16, 2009, 12:37:01 PM7/16/09
to pon...@googlegroups.com
不明白. 难道和完整比得到不同的文件?

On 7/16/09, meta <carma...@gmail.com> wrote:
> <http://dev.chromium.org/developers/design-documents/software-updates-courgette>Chromium
> Blog
> <http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html>上提到的Google
> Chrome用于推送升级包的新的二进制differential
> 压缩算法Courgette<http://dev.chromium.org/developers/design-documents/software-updates-courgette>
> .
> 文中举了一个Develper Channel从190.1到190.4的升级例子:
>
> - 完整升级包:10,385,920字节
> - 一般bsdiff算法:704,512字节
> -
> Courgette<http://dev.chromium.org/developers/design-documents/software-updates-courgette>
> 算法:78,848字节
>
> 很可怕的压缩率. 然后去看了看design
> document<http://dev.chromium.org/developers/design-documents/software-updates-courgette>,


> 其中心思想和我们平时写代码所提倡的不要使用"magic number"有异曲同工之妙: 可以避免对源文件的大量重复修改.
> 这里是用一个disassembler
> 来将二进制文件中所有的internal pointer/reference的地址重新符号化, 然后再计算differential.
> patch文件到客户端进行re-link, 从而恢复成最新文件.
>

--
Sent from my mobile device

Regards,
Linker Lin
linker...@gmail.com

SevenCat

unread,
Jul 16, 2009, 7:20:42 PM7/16/09
to TopLanguage
应该是升级的时候不用再下发所有的内容,只需要变动的就行。

On 7月17日, 上午12时37分, Linker <linker.m....@gmail.com> wrote:
> 不明白. 难道和完整比得到不同的文件?
>

> On 7/16/09, meta <carmack....@gmail.com> wrote:
>
>
>
> > <http://dev.chromium.org/developers/design-documents/software-updates-...>Chromium


> > Blog
> > <http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html>上提到的Google
> > Chrome用于推送升级包的新的二进制differential

> > 压缩算法Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>


> > .
> > 文中举了一个Develper Channel从190.1到190.4的升级例子:
>
> > - 完整升级包:10,385,920字节
> > - 一般bsdiff算法:704,512字节
> > -

> > Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> > 算法:78,848字节
>
> > 很可怕的压缩率. 然后去看了看design
> > document<http://dev.chromium.org/developers/design-documents/software-updates-...>,


> > 其中心思想和我们平时写代码所提倡的不要使用"magic number"有异曲同工之妙: 可以避免对源文件的大量重复修改.
> > 这里是用一个disassembler
> > 来将二进制文件中所有的internal pointer/reference的地址重新符号化, 然后再计算differential.
> > patch文件到客户端进行re-link, 从而恢复成最新文件.
>
> --
> Sent from my mobile device
>
> Regards,
> Linker Lin

> linker.m....@gmail.com

Sisong Hou

unread,
Jul 16, 2009, 7:44:23 PM7/16/09
to pon...@googlegroups.com
几年前我也写过一个patch算法,不知道谁的更好:) (英文太差,看不懂他的)
我的算法有个简单的证明,在某个假设的框架下我的算法生成的是最优的补丁;
<一个高效的二进制数据补丁算法> : http://blog.csdn.net/housisong/archive/2006/04/11/658863.aspx

2009/7/17 SevenCat <BastE...@gmail.com>:

Mikster.Z

unread,
Jul 16, 2009, 9:27:34 PM7/16/09
to pon...@googlegroups.com
不是压缩算法吧~~
应该是升级包的比较算法,压缩这个词用得有点误导围观群众,但愿我没理解错


2009/7/16 meta <carma...@gmail.com>



--
EX - EMBEDDED SYSTEM DEVELOPER
SOFTWARE ENGINEER
Name : Mikster  
Corp: NokiaSiemensNetwork

DaiZW

unread,
Jul 16, 2009, 10:17:57 PM7/16/09
to pon...@googlegroups.com
好像算法是这样的, 理解不对的话请各位大大指出:

server:
asm_old = disassemble(original) // 把老文件Fo在 assembly
level上分解为pointer/reference和代码段/数据段的集合A
asm_new = disassemble(update) // 把新文件Fn在 assembly
level上分解为pointer/reference和代码段/数据段的集合B
asm_new_adjusted = adjust(asm_new, asm_old) //
按照A中pointer/reference的地址, 修改B中pointer/reference的地址,
得到调整后的集合C(这种调整应该不影响C的功能, 就是说把C组合为文件后和Fn的功能等价)
asm_diff = bsdiff(asm_old, asm_new_adjusted) // diff C 和 B
transmit asm_diff

client:
receive asm_diff
asm_old = disassemble(original)
asm_new_adjusted = bspatch(asm_old, asm_diff)
update = assemble(asm_new_adjusted)

之所以需要按A来调整B是因为调整之后可以更接近A, 从而得到更小的diff文件; 也就是说从功能上讲"调整"这步不是必须的.

2009/7/16 meta <carma...@gmail.com>:

Wei Hu

unread,
Jul 16, 2009, 10:20:46 PM7/16/09
to TopLanguage
这篇blog也可以参考一下 http://neugierig.org/software/chromium/notes/2009/05/courgette.html

On Jul 16, 10:42 am, meta <carmack....@gmail.com> wrote:
> <http://dev.chromium.org/developers/design-documents/software-updates-...>Chromium
> Blog <http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html>上提到的Google
> Chrome用于推送升级包的新的二进制differential
> 压缩算法Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> .
> 文中举了一个Develper Channel从190.1到190.4的升级例子:
>
> - 完整升级包:10,385,920字节
> - 一般bsdiff算法:704,512字节
> - Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> 算法:78,848字节
>
> 很可怕的压缩率. 然后去看了看design
> document<http://dev.chromium.org/developers/design-documents/software-updates-...>,

est

unread,
Jul 17, 2009, 6:39:13 AM7/17/09
to TopLanguage
Google的差分算法是先反汇编,然后直接diff新旧版本,得到一个patch
然后再patch比较旧版本,得到Courgette。。。貌似是这样的。。。。

这种一个很明显的优势就是在PE结构基础上再运算,比直接比较exe二进制效率肯定高多了。。。

On Jul 17, 7:44 am, Sisong Hou <housis...@gmail.com> wrote:
> 几年前我也写过一个patch算法,不知道谁的更好:) (英文太差,看不懂他的)
> 我的算法有个简单的证明,在某个假设的框架下我的算法生成的是最优的补丁;
> <一个高效的二进制数据补丁算法> :http://blog.csdn.net/housisong/archive/2006/04/11/658863.aspx
>

> 2009/7/17 SevenCat <BastEt.W...@gmail.com>:

tangl_99

unread,
Jul 18, 2009, 6:32:17 AM7/18/09
to TopLanguage
我记得,在自然语言里面有个叫做编辑距离,Edit Distance。经常被用来做判断key words的相似度。

它的意思就是计算一个字符串通过"替换,移动,删除,增加"这一系列操作最后变成另外一个字符串的最小步数。通过一个典型的动态规划的算法可以求解得
到。


On Jul 16, 10:42 pm, meta <carmack....@gmail.com> wrote:
> <http://dev.chromium.org/developers/design-documents/software-updates-...>Chromium
> Blog <http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html>上提到的Google
> Chrome用于推送升级包的新的二进制differential
> 压缩算法Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> .
> 文中举了一个Develper Channel从190.1到190.4的升级例子:
>
> - 完整升级包:10,385,920字节
> - 一般bsdiff算法:704,512字节
> - Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> 算法:78,848字节
>
> 很可怕的压缩率. 然后去看了看design
> document<http://dev.chromium.org/developers/design-documents/software-updates-...>,

nleven

unread,
Jul 18, 2009, 9:11:59 AM7/18/09
to TopLanguage
貌似就是新旧文件binary上的许多不同其实只是pointer/reference地址的变化,直接比较二进制会把这个信息重复表达。所以把这一块
不同单独搞出来处理。然后disassembler去搞定真正代码不同的变化。

On 7月16日, 下午10时42分, meta <carmack....@gmail.com> wrote:
> <http://dev.chromium.org/developers/design-documents/software-updates-...>Chromium
> Blog <http://blog.chromium.org/2009/07/smaller-is-faster-and-safer-too.html>上提到的Google
> Chrome用于推送升级包的新的二进制differential
> 压缩算法Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> .
> 文中举了一个Develper Channel从190.1到190.4的升级例子:
>
> - 完整升级包:10,385,920字节
> - 一般bsdiff算法:704,512字节
> - Courgette<http://dev.chromium.org/developers/design-documents/software-updates-...>
> 算法:78,848字节
>
> 很可怕的压缩率. 然后去看了看design
> document<http://dev.chromium.org/developers/design-documents/software-updates-...>,

raymond

unread,
Jul 19, 2009, 8:54:51 AM7/19/09
to TopLanguage
编辑距离可以衡量相似度,但是能利用其来进行patch恢复吗?望指教

Flier Lu

unread,
Aug 6, 2009, 11:33:22 PM8/6/09
to TopLanguage
:S 没有这么简单,Google 这个算法记得有至少有几个亮点,还是很猛的

1. 把可执行文件看作多个代码流单独进行比较,而不是整文件粒度比较;这样整体结构上的变化不会对单个代码流产生影响,类似的思路可以用在其他的结构
化文件中,例如zip或com结构化文件等等

2. 通过代码分析,把可能relocate的符号抽取出来单独处理;因为这些部分在每次编译时都有可能不同,但对整体代码流影响不大。说白了就是把变
化和不变的分离考虑,减少冗余的比较。

3. 结合反汇编代码流和编译后符号和整体文件分析,而不是只在某个层面比较;实际上这个思路在很多新兴项目里面都有应用,例如LLVM将整个程序生命
期都作为优化的不同阶段,而非传统的编译阶段。

之前也写过一些类似的代码,例如代码流一级的比较之类,但没有他怎么彻底和全面,还是水平有差距啊 :(

Reply all
Reply to author
Forward
0 new messages