![]()
文本排版这事儿,绝大多数实现都在做一件蠢事——逐个字符往前扫,累加宽度直到超界。一万字的文档拆500行,每个字符至少被摸500遍。更糟的是,getWidth()每次调用都可能触发内存分配,Canvas的measureText返回全新TextMetrics对象,DOM测量还会强制同步重排。
![]()
有个叫ZeroText的排版引擎换了个思路:前缀和+二分查找。先花O(n)扫一遍,把每个位置的累计宽度存成数组。之后任意子串宽度变成小学减法:prefixSum[b-1] - prefixSum[a-1]。找换行点?转成"找最后一个不超过目标值的元素",标准upper-bound二分,O(log n)搞定。
![]()
作者的原话很直白:「500行只需要约6500次比较,外加13步的二分查找。」复杂度从O(n×lines)掉到O(n + lines×log n)。但Float64Array的分配怎么解决?预分配一块固定内存,用cursor重置代替垃圾回收—— arena池化,零GC压力。
这个技巧不挑场景,任何需要按累计权重切分序列的地方都能用。作者把代码扔了出来,评论区有人已经开始往自己的编辑器里搬了。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.