- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在查看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<>
导致Queue
或Stack
只保存一个小的引用对象(StrongBox<>
,而不是可能占用大量内存的 IEnumerator<CommonSyntaxNode>
- 因此 - GC 正在清理 Queue
或 Stack
中包含的 IEnumerator<CommonSyntaxNode>
内存可能更快 - 减少应用程序总内存消耗。
请注意CommonSyntaxNode
的枚举器是一个结构体,直接使用它意味着深度复制整个结构体,它是一个小结构体,所以它不是很重,但仍然......
关于roslyn - StrongBox的具体用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21263729/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!