首页 > 其他分享 >codemirror diff-match-match 不同设备、不同设备状态下的对比结果不稳定

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

时间:2024-08-05 14:30:16浏览次数:10  
标签:patch Match Diff diff codemirror 对比 match

今天遇到一个问题,在使用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 = 0

    return dmp
  };

标签:patch,Match,Diff,diff,codemirror,对比,match
From: https://www.cnblogs.com/azoux/p/18343141

相关文章

  • 我用AI绘画Stable Diffusion设计建筑户型图,速度又快画的又好!AI打工不惧内卷了!
    大家好,我是程序员晓晓户型图设计是地产公司的常规工作,逐个房间填色摆放家具,忙忙碌碌一天才能完成一个户型,现在用我总结的AI设计工作流程,只要5分钟!现在普通人也能从事户型图设计工作。今天我们通过一个具体的工程案例,一起使用AI绘图工具快速精通户型图设计工作流程。我们先......
  • Stable Diffusion AI 4.8.7软件安装包下载及安装教程
    软件下载1.软件名称:StableDiffusionAI2.软件版本:4.8.73.软件大小:16.52GB4.安装环境:win7/win10/win11(64位)5.百度网盘下载地址:提示:建议先转存后下载,主页可获取更多行业软件和办公黑科技及素材等!软件介绍StableDiffusionAI是一款先进的以文本生成图像的AI工具,能......
  • Scalable Diffusion Models with Transformers(DIT)代码笔记
    完整代码来源:DiTDiT模型主要是在diffusion中,使用transformer模型替换了UNet模型,使用class来控制图像生成。根据论文,模型越大,patchsize越小,FID越小。模型越大,参数越多,patchsize越小,参与计算的信息就越多,模型效果越好。模型使用了Imagenet训练,有1000个分类,class_labe......
  • 【人工智能】如何选择AI绘画工具?Midjourney VS Stable Diffusion
    文章目录......
  • Python:match()和search()的区别
    在Python中,match()和search()函数通常与正则表达式(regularexpressions)一起使用,特别是在re模块中。尽管它们都用于搜索字符串中的模式,但它们在搜索行为上有关键的区别。re.match()re.match()函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()......
  • PHP8中match表达式的强劲功能
    hp8中match表达式的强劲功能,让你写代码更加灵活PHP8是PHP语言的最新版本,带来了很多新功能和优化,其中一个最令人振奋的功能是新的match表达式。这个表达式与switch语句类似,但比switch语句更加强大和灵活,使开发人员写代码更加方便,而且代码清晰易读。在本文中,我们将深入研究match表......
  • C++ STL adjacent_difference 用法
    一:功能    计算相邻两个元素的差(默认),也可以使用其他自定义运算函数,比如计算相邻两个元素的和。二:用法#include<iostream>#include<vector>#include<numeric>intmain(){std::vector<int>data{2,3,5,7,11,13};//前两个参数指定输入的范围,第......
  • 劝你先别更新!!最新Stable Diffusion WebUI 1.10已来!WebUI终于支持SD3大模型了!你跑起来
    你的SD3大模型在SDWebUI1.10.0中跑起来了么?今天发现StableDiffusionWebUI于昨日推出了最新SDWebUI1.10.0版本。令人比较兴奋的是该版本支持了SD3大模型,同时也新增了DDIMCFG++采样器。主要更新内容如下:最新版本地址:更新后重启,可在WebUI设置中开启对T5文本的支持,......
  • 一文详解Denoising Diffusion Implicit Models(DDIM)
    目录0前言1DDIM2总结0前言  上一篇博文我们介绍了目前流行的扩散模型基石DDPM,并且给出了代码讲解,有不了解的小伙伴可以跳转到前面先学习一下。今天我们再来介绍下DDPM的改进版本。DDPM虽然对生成任务带来了新得启发,但是他有一个致命的缺点,就是推理速度比较慢,......
  • Stable Diffusion 使用详解(4)---- 制作情景文本
    目录背景制作流程绘制底图书写提示词选底模常规参数设置controlNet处理CandycontrolNet设置DepthcontrolNet设置输出效果改进适当修改提示词适当修改controlNet适当修改底模背景制作情景文本,将文本较好的融入背景图片。首先要符合设计的场景,其次要凸显......