一直找不到好用的 diff 模块,于是花了两天的时间将 Python 标准库中的 difflib 移植到了 JavaScript 上。做了详尽的测试,同时也将原文档也按照 JavaScript 的风格修改了。希望能对各位有用 :)
13 回复
@guilin 确定瓶颈是在 diff 上么,我刚才拿 sina 的主页做了下 benchmark,总共 10244 行 html, 我复制一份并修改其中的10行,然后分别用 python 和 node 跑了100 遍 diff,代码如下:
node:
var fs = require('fs')
var difflib = require('difflib')
var a = fs.readFileSync('a').toString().split('\n')
var b = fs.readFileSync('b').toString().split('\n')
for (var i = 0; i < 100; ++i) {
difflib.unifiedDiff(a, b)
}
python:
import difflib
a = open('a').readlines()
b = open('b').readlines()
for i in range(100):
list(difflib.unified_diff(a, b))
测试结果如下:
$ time node diff.js
real 0m6.333s
user 0m6.316s
sys 0m0.077s
$ time python diff.py
real 0m7.923s
user 0m7.913s
sys 0m0.007s
可见,对于 sina 的这个 10000+ 行的巨型 html ,平均每个 diff 的耗时也仅为 0.06 秒,而且在这个测试中 node 的性能要优于 python 。另外值得注意的是, python 的 difflib 从 2001 年开始便是标准库之一,其代码质量和性能都绝对有所保证。