gpt4 book ai didi

roslyn - StrongBox的具体用法

转载 作者:行者123 更新时间:2023-12-02 09:33:57 25 4
gpt4 key购买 nike

我正在查看Roslyn September 2012 CTP使用 Reflector,我注意到语法树的以下深度优先遍历:

private IEnumerable<CommonSyntaxNode> DescendantNodesOnly(TextSpan span,
Func<CommonSyntaxNode, bool> descendIntoChildren, bool includeSelf)
{
if (includeSelf && IsInSpan(span, FullSpan))
{
yield return this;
}

if ((descendIntoChildren != null) && !descendIntoChildren(this))
{
yield break;
}

var queue = new Queue<StrongBox<IEnumerator<CommonSyntaxNode>>>();
var stack = new Stack<StrongBox<IEnumerator<CommonSyntaxNode>>>();
stack.Push(new StrongBox<IEnumerator<CommonSyntaxNode>>(ChildNodes().GetEnumerator()));
while (stack.Count > 0)
{
var enumerator = stack.Peek();
StrongBox<IEnumerator<CommonSyntaxNode>> childEnumerator;
if (enumerator.Value.MoveNext())
{
var current = enumerator.Value.Current;
if (IsInSpan(span, current.FullSpan))
{
yield return current;

if ((descendIntoChildren == null) || descendIntoChildren(current))
{
childEnumerator = queue.Count == 0
? new StrongBox<IEnumerator<CommonSyntaxNode>>()
: queue.Dequeue();
childEnumerator.Value = current.ChildNodes().GetEnumerator();
stack.Push(childEnumerator);
}
}
}
else
{
childEnumerator = stack.Pop();
childEnumerator.Value = null;
queue.Enqueue(childEnumerator);
}
}
}

我猜测队列是为了缓解运行时分配和取消分配这么多 IEnumerator<CommonSyntaxNode> 实例的问题。 .

但是,我不知道为什么IEnumerator<CommonSyntaxNode>包裹在StrongBox<>中。包装涉及什么样的性能和安全权衡IEnumerator<CommonSyntaxNode> ,通常是引用类型 StrongBox<> 内的值类型?

最佳答案

CommonSyntaxNode是一个抽象类,包含很多值类型,可以继承到一个大对象中。

IEnumerator<CommonSyntaxNode>仅包含对 CommonSyntaxNode 的引用所以看起来像 CommonSyntaxNode 的大小不会影响Enumerator尺寸,因为它只是一个引用,但是:

IEnumerator<T> 的方法 MoveNext() 使用 yield return; Enumerator 中的每次迭代将导致该方法保存其状态直到下一次迭代。

因为整个方法状态足够重并且它可能包含 CommonSyntaxNode的属性,以便执行 MoveNext() 逻辑,比整体IEnumerator<CommonSyntaxNode>可能会占用大量内存。

使用 StrongBox<> 导致QueueStack只保存一个小的引用对象(StrongBox<>,而不是可能占用大量内存的 IEnumerator<CommonSyntaxNode> - 因此 - GC 正在清理 QueueStack 中包含的 IEnumerator<CommonSyntaxNode>内存可能更快 - 减少应用程序总内存消耗。

请注意CommonSyntaxNode的枚举器是一个结构体,直接使用它意味着深度复制整个结构体,它是一个小结构体,所以它不是很重,但仍然......

关于roslyn - StrongBox的具体用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com