- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我对DLR操作解析方法的理解有误,请指正
DLR 有一些称为调用站点缓存的东西。给定“a+b”(其中 a 和 b 都是整数),第一次它将无法理解 +(加号)运算符以及操作数。因此它将解析操作数,然后解析运算符,并在构建适当的规则后缓存在级别 1 中。
下次以后,如果找到类似的匹配(操作数是整数类型,运算符是+类型),它会查找缓存并返回结果,此后性能将得到提升。
如果我的理解是正确的(如果你认为我的基本理解不正确,请纠正),我有以下问题正在寻找答案
a) What kind of operations happen in level 1 , level 2
and level 3 call site caching in general
( i mean plus, minus..what kind)
b) DLR caches those results. Where it stores..i mean the cache location
c) How it makes the rules.. any algorithm.. if so could you please specify(any link or your own answer)
d) Sometime back i read somewhere that in level 1 caching , DLR has 10 rules,
level 2 it has 20 or something(may be) while level 3 has 100.
If a new operation comes, then I makes a new rule. Are these rules(level 1 , 2 ,3) predefined?
e) Where these rules are kept?
f) Instead of passing two integers (a and b in the example),
if we pass two strings or one string and one integer,
whether it will form a new rule?
谢谢
最佳答案
a) 如果我正确地理解了这一点,那么目前所有的级别都有效地工作 - 他们运行一个委托(delegate)来测试对规则重要的参数,然后执行操作或记录失败(失败由任一记录在调用站点上设置一个值或对更新方法进行尾调用)。因此每条规则的工作方式如下:
public object Rule(object x, object y) {
if(x is int && y is int) {
return (int)x + (int)y;
}
CallSiteOps.SetNotMatched(site);
return null;
}
并且在 L0、L1 和 L2 缓存中使用此方法的委托(delegate)。但是这里的行为可能会改变(并且在开发过程中确实改变了很多次)。例如,在某个时间点,L2 缓存是一棵基于参数类型的树。
b) L0 缓存和L1 缓存存储在CallSite 对象上。 L0 缓存是一个单一的委托(delegate),它总是最先运行的。最初这被设置为一个代表,它只是第一次更新网站。其他调用尝试执行调用站点看到的最后一个操作。
L1 缓存包括调用站点看到的最后 10 个操作。如果 L0 缓存失败,将尝试 L1 缓存中的所有委托(delegate)。
L2 缓存位于 CallSiteBinder 上。 CallSiteBinder 应该在多个调用站点之间共享。例如,假设所有添加都是相同的,通常应该有一个并且只有一个 additiona 语言的调用站点 Binder 。如果 L0 和 L1 将搜索 L2 缓存中的所有可用规则。目前二级缓存上限为128。
c) 规则最终可以通过两种方式产生。一般的解决方案是创建一个 DynamicMetaObject,它包括要执行的操作的表达式树以及确定它是否适用的限制(测试)。这类似于:
public DynamicMetaObject FallbackBinaryOperation(DynamicMetaObject target, DynamicMetaObject arg) {
return new DynamicMetaObject(
Expression.Add(Expression.Convert(target, typeof(int)), Expression.Convert(arg, typeof(int))),
BindingRestrictions.GetTypeRestriction(target, typeof(int)).Merge(
BindingRestrictions.GetTypeRestriction(arg, typeof(int))
)
);
}
这创建了将两个整数相加的规则。这不是真的正确,因为如果你得到的不是整数,它会无限循环——所以通常你会做一堆类型检查,为你能处理的事情产生加法,如果你不能处理则产生错误处理添加。
制定规则的另一种方法是直接提供委托(delegate)。这是更高级的,可以启用一些高级优化来避免一直编译代码。为此,您需要重写 CallSiteBinder 上的 BindDelegate,检查参数,并提供一个类似于我在上面键入的 Rule 方法的委托(delegate)。
d) 在 b) 中回答
e) 我相信这和 b) 是同一个问题
f) 如果您设置了适当的限制,则可以(您必须对标准 Binder 执行此操作)。因为限制会失败,因为您没有两个整数,所以 DLR 将探测缓存,当它没有找到规则时,它会调用 Binder 来生成新规则。这条新规则将带着一组新的限制回来,将安装在 L0、L1 和 L2 缓存中,然后将从那时起对字符串执行操作。
关于dynamic-language-runtime - 关于DLR call site缓存的一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622527/
我在一个较大的 C# 项目的一小部分中使用 DLR,IronPython 是有问题的语言。 对于系统的某些部分,用户可以输入一个小脚本来为它们定制行为。我想要做的是能够限制他们使用无副作用的纯函数或在
首先,我已经阅读Making a CLR/.NET Language Debuggable,但是仍然难以实现。 我编写了一种玩具语言,该语言可以通过生成Linq表达式,然后调用LambdaExpres
.Net 4 将具有 DLR(动态语言运行时)。我知道它将用于 Iron Python 和 Iron Ruby 之类的东西。但这就是它的全部好处吗? DLR 有什么用处? DLR 是如何工作的? 最佳
是否可以从非托管代码(例如 C++ 或 Delphi)调用托管代码,特别是 IronRuby 或 IronPython? 例如,我们有一个用 Delphi 编写的应用程序正在迁移到 C#.NET。我们
我到处都读到 .net 4 中的新 DLR,他们说它的一个很好的用途是反射,并且总是显示的代码片段类似于 dynamic d = GetSomeObject(); d.DoSomething(); d
我打算创建一个 Web 服务,以尽可能快的速度执行大量手动指定的计算,并且一直在探索 DLR 的使用。 抱歉,如果本文很长,请随意浏览并了解总体要点。 我一直在使用 IronPython 库,因为它使
我正在考虑限制使用 C# 的 dynamic 关键字。我的initial time trials令人惊讶 - 100,000 次迭代的性能下降不到一秒(可能是由于 DLR 缓存)。 不过,我无权访问内
我需要 DLR 的帮助。我正在实现 IDynamicMetaObjectProvider 和 DynamicMetaObject,但我在获取预期的返回类型时遇到了一些问题。我在元对象中覆盖了 Bind
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
随着 .NET 4.0 测试版的推出,以及 .NET 动态语言运行时的更广泛的可用性,我猜这些类型的主题将变得“更热”。 我对 DLR 和 PowerShell 之间的概念差异感到困惑。在我看来,如果
我使用 Antlr 编写了一个 DSL,用于从我的语法文件生成词法分析器和解析器。解析器生成一个抽象语法树,其中包含我可以计算的各种节点(例如函数节点)。在函数节点的代码中,我负责绑定(bind)——
我目前正在使用 DLR 执行以下操作来创建和执行简单的 Python 计算: ScriptRuntime runtime = Python.CreateRuntime(); ScriptEngine
我需要指出正确的方向。我已将 Iron Python 脚本宿主嵌入到一个简单的 C# 应用程序中,但现在我需要了解锁定用户生成的 IronPython 或 IronRuby 脚本的安全性的最佳实践。
DLR 层的职责是什么? 最佳答案 来自 http://msdn.microsoft.com/en-us/library/dd233052.aspx 处的文档. The purpose of the
我正在尝试学习如何在 DLR 之上编写简单的脚本语言,方法是使用一个名为 ToyScript 的非常古老的 DLR 示例。但是 ToyScript 似乎不支持以下脚本结构,我想在我的实现中使用它: p
我对 DynamicMethods、表达式树和 DLR 之间的交互和关系有一些疑问。 我知道 LambdaExpression.Compile 在内部使用 ILGenerator 来创建委托(dele
我必须为 .NET 的静态类型语言开发一个编译器,我正在考虑为此使用 DLR,而不是构建所有部分(词法分析器/解析器、语法、语义、代码生成)。 DLR 是否适合这种情况?或者直接为 .NET 构建编译
我刚刚开始尝试更多地了解 .Net VM 基础,但立即被某些东西抛弃了。我知道有一个叫做 DLR 的新东西,它允许 C# 中的所有动态内容和 IronX 语言的运行。但是现在我正在阅读有关这种称为 B
我正在构建一个针对 .NET 的编译器,并且我之前已经直接生成了 CIL,但是生成 DLR 树将使我的生活变得更加轻松。我支持一些动态功能,即运行时函数创建和鸭子类型,但绝大多数代码是完全静态的。 既
来自维基百科关于 DLR 的条目, 看起来 DLR 的目的是为了使用 Python、Ruby 等语言。这就是 DLR 的全部吗?还有其他好处吗?为什么要为 ASP.net 项目或 Winform 应用
我是一名优秀的程序员,十分优秀!