|
|
1
13
你发布的组件显示mjwills的评论正如预期的那样是正确的。正如链接文章所指出的,抖动在某些比较中可能是聪明的,这就是其中之一。 让我们看看你的第一个片段:
rcx是成员函数调用的“此指针”。本例中的“this pointer”将是某个CLR预分配对象的地址,具体我不知道。
现在我们调用该对象上的某个成员函数;我不知道是什么。这个 最近的 您有调试信息的公共函数是InstallCustomModule,但很明显,我们这里不调用InstallCustomModule;我们正在调用距离InstallCustomModule 0x2320字节的函数。 看看InstallCustomModule+0x2320上的代码有什么作用会很有趣。 不管怎样,我们进行调用,返回值以rax表示。接下来:
这看起来像是在获取
剩下的代码非常普通:将比较的bool结果移动到返回寄存器中。 简而言之,第一个片段相当于:
显然,这里有一个有根据的猜测,常量对象和未知函数是特殊用途的助手,可以快速获取常用的类型对象,比如typeof(int)。 第二个有根据的猜测是,抖动本身决定了模式“将类型字段与(某物)类型进行比较”可以最好地作为对象之间的直接参考比较。 现在你可以亲眼看到第二个片段的作用了。只是:
它所做的只是调用一个助手方法来比较两种类型的值是否相等。回想起 CLR不能保证所有等效类型对象的引用相等 .
现在应该很清楚为什么第一个碎片更快了。
抖动对第一个片段的了解要多得多
例如,它知道typeof(int)将始终返回相同的引用,因此可以进行廉价的引用比较。它知道typeof(int)永远不会为空。它知道
准确的
类型类型类型(int)——记住,
在第二个片段中,抖动只知道它有两个类型的操作数
看来缺乏这些知识会让你付出巨大的代价。。。半纳秒。我不会担心的。 |
|
|
2
2
如果您很好奇,还可以查看jit使用的逻辑,请参阅 gtFoldTypeCompare . jit可以做很多事情来简化甚至消除类型比较。它们都需要了解被比较类型的创建。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |