Roslyn的发布版本如何实现不可变树?

bri*_*ght 10 c# tree immutability roslyn

据我所知,Roslyn的预发布版本实现了不可变树,正如Eric Lippert撰写的这篇优秀博客文章所述.但是,该帖子的结尾是:

"成本是这个系统很复杂,如果"红色"外墙变大,可能会占用大量内存.我们目前正在做实验,看看我们是否可以在不损失优惠的情况下降低部分成本."

我想问一下发布版本的结果.我已经开始检查Roslyn 代码,但代码相当复杂.

我感兴趣的是关于上述成本的低级设计结果.

  1. 红色/绿色节点的单个编辑成本是多少?
  2. 对其他操作进行了哪些优化(例如删除,撤消)?

Jos*_*rty 8

在讨论论坛上,VSadov对Roslyn的表现和不可变树的实现有了很好的了解:https://roslyn.codeplex.com/discussions/541953

在高层次上,他讨论了并发,绿色节点的重复数据删除,终端的重复数据删除以及这些树中字符串的重复数据删除.

他还谈到了红树的懒惰.不是在每次文本更改后计算红树,而是仅在有人请求时才计算红树.

最后,他讨论了红树以及它的弱点这一事实.我从来没有使用或看过这个WeakReference类,VSadov提供了如何在红树中使用它的一个很好的概述.基本上,允许垃圾收集器清理红树的部分,如果需要,可以在以后重新创建它们.我对实现并不熟悉,但Eric Lippert指出红树外观会导致大量内存占用.我想这些WeakReferences有助于在某种程度上缓解这个问题.

  • 关于弱参考的假设是正确的. (4认同)
  • [github](https://github.com/KirillOsenkov/Bliki/wiki/Roslyn-Immutable-Trees) 上有用的讨论副本 (2认同)