大文本对比:200 万字符上限与 4000 行渲染
对比大文本有两个瓶颈,不是同一个:算差异是 CPU 密集,渲染结果是 DOM 密集。前者靠 Worker 挪出主线程,后者靠「只渲染前 4000 行」——两件事都做,页面才在百万字符下仍然可用。
为什么要把算法挪进 Worker
差异算法(编辑距离一类)的时间复杂度随文本长度快速上升。在主线程里算,页面会直接冻住:按钮点不动、滚动卡死、输入延迟几百毫秒。
放进 Worker 后,主线程只负责渲染,输入框始终可响应。新输入到来时会终止旧任务——否则连续修改会排出一串早已过期的计算,越算越慢。
为什么只渲染 4000 行
差异结果里每个字符都可能是一个高亮节点。十万行结果意味着几十万个 DOM 元素,浏览器光是布局就要几秒,滚动时还会持续重绘。
只渲染前 4000 行是取舍:绝大多数实际对比在前几百行就能看出结论;完整统计(新增/删除/修改/相同行数)仍然基于全部结果计算,所以「总量」是准的,只是不逐行展示。
需要看后面的部分,建议把文本切成几段分别对比。
200 万字符是怎么来的
这是单侧上限,按浏览器可用内存与计算时间估出来的。超过后不处理,而不是「试着算然后崩掉」——崩掉会丢掉你已经粘贴的内容。
200 万字符大约相当于 3–4 万行代码。超过这个量级,命令行工具(diff、git diff、delta)更合适:它们不需要 DOM,也不受标签页内存限制。
上传文件的限制
左右都可以上传文本文件,读取在本地完成。上传前会检查 5 MiB 大小、UTF-8 编码、NUL 字节:
- 超过 5 MiB 直接拒绝,避免读进内存后才发现处理不了。
- 非 UTF-8 文件会提示编码问题,而不是显示一堆乱码再让你猜。
- 含 NUL 字节说明是二进制文件(图片、压缩包被改了后缀),同样拒绝。
复制结果超过 100 万字符时会截断并明确提示,避免占满剪贴板与浏览器内存。
上面这些都不用装软件,也不用注册:打开页面就能用。
打开文本对比 →常见问题
为什么统计说有很多处差异,下面只显示一部分?
渲染上限是 4000 行,统计基于完整结果。看总量用统计区,看具体内容用渲染出的部分;需要全部内容请分段对比。
对比 100 万字符要多久?
取决于差异密度。几乎相同的文本很快;差异极多时接近最坏情况,可能需要十几秒。期间页面不会卡死,可以继续编辑。
能对比二进制文件吗?
不能。工具只处理 UTF-8 文本,含 NUL 字节的文件会被拒绝。二进制对比需要专门的工具(如 hexdump diff)。