当前位置:网站首页 / WPF / 正文

2020 WPF 取经之路第6天 - Markdig主库故事

时间:2020年03月19日 | 作者 : aaronyang | 分类 : WPF | 浏览: 314次 | 评论 0

作者评估了这几个库

MarkdownSharp和github上的fork:由StackOverflow使用(或至少已开发),主要基于原始PERL实现进行移植,基于Regex,没有太多扩展。

Marked.NET,JavaScript的Marked端口,基于正则表达式,很少扩展。

MarkdownDeep:完整的解析器,但是代码回购有些粗糙,有些扩展。

CommonMark.NET:完整解析器,cmark的端口,无扩展名(在主服务器上)

在现有的.NET库中,其中两个脱颖而出:MarkdownDeep和CommonMark.NET,但它们仍然缺少作者想要的东西:

image.png

对于CommonMark.NET,在pipe_tables分支中有对语法分析器的完全重写,还不是正式的,还没有完成? 作者还花了一些时间来评估这一点,但是作者对某些设计决策(例如,在语法树的简单继承方案上仅使用合成)以及插件架构的通用性不足表示不满意。

 总体而言,CommonMark.NET是一个非常可靠的库,在性能和代码质量方面都是明智的。 为了促进开发,作者将其某些解码原语重新用于Markdig(例如HTML Entity解码)


因此,作者开始挑战是否可以编写一个完全兼容CommonMark的解析器,并考虑到我的所有功能和梦想。

作者认为string.IndexOf 字符啥的很快,IndexOfAny其实不快,还有匹配开头的字符啥的

在Markdig中广泛使用了CharacterMap <T>类来预先计算char和关联的数据实例之间的映射。 首先使用以下方法IndexOfOpeningCharacter替换switch/case

public unsafe int IndexOfOpeningCharacter(string text, int start, int end)
{
    var maxChar = isOpeningCharacter.Length;
#if SUPPORT_FIXED_STRING
    fixed (char* pText = text)
#else
    var pText = text;
#endif
    fixed (bool* openingChars = isOpeningCharacter)
    {
        if (nonAsciiMap == null)
        {
            for (int i = start; i <= end; i++)
            {
                var c = pText[i];
                if (c < maxChar && openingChars[c])
                {
                    return i;
                }
            }
        }
        else
        {
            for (int i = start; i <= end; i++)
            {
                var c = pText[i];
                if ((c < maxChar && openingChars[c]) || nonAsciiMap.ContainsKey(c))
                {
                    return i;
                }
            }
        }
    }
    return -1;
}

作者字符串处理(AY觉得都是细节)

在读取输入的Markdown文档时,我通过使用TextReader.ReadLine()开始了实现。这种方法的实现的伟大之处在于它们通常足够快。

例如,内部使用StringBuilder池对StreamReader.ReadLine进行了很好的优化。

StringReader.ReadLine还仅对原始字符串上的换行符和子字符串执行快速扫描。

这些方法的唯一缺点是您丢失了换行符的关键信息(是\ r或\ r \ n还是\ n?),因此,如果要提供准确的字符,则会丢失流中的偏移量原始流中的位置。

Markdig不再使用这些方法,而是将整个Markdown文档加载到一个字符串中并与StringSlice一起使用,因为我意识到将文档一次加载到一个字符串中而不是在一个新的字符串中加载每一行会更有效。此方法还可以更好地处理精确的源代码位置(例如,语法突出显示)。

当试图从字符串处理中挤出一些性能时,令人沮丧的一件事是FastAllocateString的内部可访问性,它允许在堆上分配一个字符串而不将其置零,这非常有用,在.NET框架的许多地方都使用过但是很不幸,我们无法进入…:(


取经 17

数组Array 比List访问快

内部用List <T>替换Dictionary <XXX,TTT> 场景,速度提升


取经18 基准测试 Benchmarks

基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。



这是针对各种实现的基准测试的早期预览:

C实现:

cmark(版本:0.25.0):CommonMark的参考C实现,不支持扩展

Moonshine(版本::流行的C Markdown处理器


.NET实现:

Markdig(版本:0.5.x):本身

CommonMark.NET(master)(版本:0.11.0):. NET的CommonMark实现,不支持扩展名,cmark的端口

CommonMark.NET(pipe_tables):CommonMark.NET的演进,支持扩展,尚未发布

MarkdownDeep(版本:1.5.0):另一个.NET实现

MarkdownSharp(版本:1.13.0):Markdown处理器的开源C#实现,基于Stackreg,基于regexp。

原始marked.js项目的Marked.NET(版本:1.0.5)端口

docfx项目使用的Microsoft.DocAsCode.MarkdownLite(版本:2.0.1)


JavaScript / V8实现:

在Google V8(不基于.NET)中运行的Strike.V8(版本:1.5.0)marked.js


Markdig比MarkdownSharp快约100倍,比docfx快30倍

在最好的CPU中,具有极强的竞争力,并且通常比其他实现更快(不具有等效功能)

分配和GC压力减少15%至30%

由于Marked.NET,MarkdownSharp和DocAsCode.MarkdownLite的运行速度太慢,因此以下图表中未包含它们:

image.png

最后奉上作者,所以C#也可以和其他语言混搭,玩一些高级的东西,佩服大神,他目前在游戏引擎 Unity公司上班。


image.png














推荐您阅读更多有关于“wpf share,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘.NET,Web前端,有想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果,私活合作请qq联系我

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表