codemirror diff-match-match 不同设备、不同设备状态下的对比结果不稳定

news/2025/3/16 3:24:42/文章来源:https://www.cnblogs.com/azoux/p/18343141

今天遇到一个问题,在使用codemirror对两条文本内容进行对比时,有同事反馈在它的电脑上会显示成:前面一半是正常显示差异内容,而后面就变成了全部是新增的。

像这样:

预期的对比结果是这样:

我们观察用于对比的两个文本,实际上上面的文本都是去掉后面括号中的内容,对比结果不应该表现成全部删除全部新增。

于是我开始在本地尝试复现,很不幸,有时候可以,有时候不行

接着我开始查找codemirror使用的对比库,diff-match-patch,这个库的对比方法的构造函数如下:

/*** Class containing the diff, match and patch methods.* @constructor*/
var diff_match_patch = function() {// Defaults.// Redefine these in your program to override the defaults.// Number of seconds to map a diff before giving up (0 for infinity).this.Diff_Timeout = 0.5;// Cost of an empty edit operation in terms of edit characters.this.Diff_EditCost = 4;// At what point is no match declared (0.0 = perfection, 1.0 = very loose).this.Match_Threshold = 0.5;// How far to search for a match (0 = exact location, 1000+ = broad match).// A match this many characters away from the expected location will add// 1.0 to the score (0.0 is a perfect match).this.Match_Distance = 1000;// When deleting a large block of text (over ~64 characters), how close do// the contents have to be to match the expected contents. (0.0 = perfection,// 1.0 = very loose).  Note that Match_Threshold controls how closely the// end points of a delete need to match.this.Patch_DeleteThreshold = 0.5;// Chunk size for context length.this.Patch_Margin = 4;// The number of bits in an int.this.Match_MaxBits = 32;
};

看到这个bug,我首先怀疑是由于阈值,所以尝试修改 Diff_ThresholdMatch_Distance 尝试将它们调小,看是否能够复现。很不幸,也不行。

接着我又去查了 diff-match-patch的文档

注意到了 Diff_Timeout这个参数,文档中解释了为什么会有这个参数,主要是为了避免对比所耗费的时间,默认值是1s,超过1s为完成对比,剩余部分就会以新增/删除来返回。

引用一段文档中的解释:

尽管此函数中使用了大量优化,但diff的计算可能需要一段时间。Diff_Timeout属性可用于设置任何Diff的探索阶段可能需要多少秒。默认值为1.0。值为0会禁用超时,并让diff运行直到完成。如果diff超时,返回值仍然是一个有效的差值,尽管可能不是最佳值。

所以这个bug不一定所有人的设备都能复现,即使是同一个的设备,在不同的设备状况(cpu使用率、内存占用)等情况下,也会有区别。在知道原因后,通过手动修改 Diff_Timeout 的值来尝试复现bug就能成功了。

那么如何解决呢,根据文档,我们可以设置一个较大的超时时间,来确保diff可以完成。或者设置为 0这样就会让diff运行直到结束。实际代码可以通过对DiffMatchPatch构造函数做一层包裹来实现:

  window.diff_match_patch = function () {const dmp = new DiffMatchPatch()// https://github.com/google/diff-match-patch/wiki/API#diff_maintext1-text2--diffs// 设置超时时间为0,禁用超时设置,直至diff运行结束dmp.Diff_Timeout = 0return dmp};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/778125.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【YashanDB数据库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 托管数据库时检查报错OM的IP是127.0.0.1,不支持托管到YCMOM 问题的风险及影响 导致数据库无法托管监控 问题影响的版本问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env…

图像降噪算法概述

图像降噪是图像预处理中非常重要的一步,旨在去除图像中的噪声,以提高图像质量并为后续的图像分析提供更好的基础。图像降噪算法可以根据其原理和技术进行分类,主要包括以下几个大类: 1. 空域滤波方法 这些方法直接在像素级别上操作,通常涉及邻域内像素值的加权平均。均值…

面向零基础初学者的现代-C---教程-全-

面向零基础初学者的现代 C++ 教程(全)原文:Modern C++ for Absolute Beginners 协议:CC BY-NC-SA 4.0一、介绍 亲爱的读者: 恭喜你选择学习 C++ 编程语言,感谢你拿起这本书。我叫 Slobodan Dmitrovi,是一名软件开发人员和技术作家,我将尽我所能向您介绍一个 C++ 的美丽世…

面向-Windows-程序员的-C---软件互操作教程-全-

面向 Windows 程序员的 C++ 软件互操作教程(全)原文:C++ Software Interoperability for Windows Programmers 协议:CC BY-NC-SA 4.0一、准备 介绍 本章介绍了软件互操作性项目。我们先简要了解一下先决条件。接下来是项目概述。最后,我们描述了项目的主要组成部分以及它们…

Echarts 实现圆角环形图

第一种方式:使用 bar 实现 想要的效果:代码实现:const chartData = {title: {text: 97, // 圆环中间数字textStyle: {color: #222222,fontSize: 20,},subtext: 成功数,subtextStyle: {color: #222222,},itemGap: 10, // 主副标题距离left: center,top: center,},angleAxis: …

PlayCover Mac电脑全屏运行ios应用软件 for Mac免费下载

PlayCover是一款功能强大的软件,主要用于在Mac平台上运行iOS应用程序和Android应用程序(取决于具体版本)。对于iOS应用,PlayCover通过模拟iOS环境,让用户能够在Mac上直接运行iPhone和iPad应用,无需虚拟机或双重启动,支持多点触控、传感器模拟等特性,提供舒适的使用体验…

Android开发_android studio 重写类的方法

按快捷键 Ctrl+O,弹出以下对话框选择相应的方法。作者: CH520 出处: 博客园资源分享中心

《数据资产管理核心技术与应用》读书笔记-第一章:认识数据资产

《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采集与存储、数据血缘、数据质…

【攻防技术系列+权限维持】Windows开机启动项

一、简介 在我们的计算机开机的时候,总是会有一些程序和服务自动启动,这其中包括Windows操作系统运行所必需的程序和其他用户程序。这是操作系统给用户提供的功能,意在为用户开机启动程序提供方便,我们不必每次启动时都手动的打开一些必须打开的程序。 二、常见开机启动项 …

多坐席智能分配的客服系统(附使用教程)

​ 轮流分配就像是排班表,每个客服都有机会接待客户,这样大家都不会太忙也不会太闲,公平得很。 按空闲度分配呢,就是看谁现在手头上的活少,就先让谁接待新客户,这样客户就不用等太久,效率杠杠的。 熟客分配,这个好理解,就像老朋友来了,直接找上次聊得来的客服继续聊,…

【日记】这个人居然一个小时就学会了自行车……(2627 字)

正文每次周末有事,都没时间写。这周末跑斯那里去,只有一个目的:让他把自行车学会。而这个目的很快就达成了,让人非常意外。连我都没有想到,他居然一个小时就能学会。周五晚上坐火车过去,他让我直接到超市。单位给他发了 500 块钱的超市购物卡,作为生日礼物。那天晚上我们…