gpt4 book ai didi

c# - 为什么 JIT 在这种情况下不使用只读标志进行优化?

转载 作者:行者123 更新时间:2023-11-30 12:45:24 26 4
gpt4 key购买 nike

我有一个由这个 CachePage 类的数组组成的调用站点缓存。缓存页面有一个 readonly token 数组,用于确定此页面是否是要使用的正确页面。

internal class CachePage
{
internal CachePage(Token[] tokens)
{
this.tokens = tokens;
}
private readonly Token[] tokens;
// other members don't matter...

为了简化问题,在类中我有几个 CheckTokens 方法,它们采用不同数量的参数,它们在 WLOG 中看起来都像这样。

public bool CheckTokens(Token g0, Token g1, Token g2)
{
return (g2 == tokens[2] && g1 == tokens[1] && g0 == tokens[0]);
}

我向后遍历数组的元素以仅进行一次绑定(bind)检查。或者我是这么想的。当我查看反汇编的输出时,我实际上看到每个比较实际上都在执行边界检查。

但是,如果我像这样改变方法,多余的边界检查就被消除了。

public bool CheckTokens(Token g0, Token g1, Token g2)
{
var t=tokens;
return (g2 == t[2] && g1 == t[1] && g0 == t[0]);
}

为什么要添加额外的绑定(bind)检查? readonly 标志不是告诉 JIT 这个私有(private)变量不能被改变吗?

这是一个低级缓存,因此确定这条路径是否正确所花费的时间越少越好。

编辑:这适用于 64 位 .net 4.5,同时尝试使用 ryuJIT 和普通 JIT。

最佳答案

我在实时交易领域工作并研究了这一点,同时试图从应用程序中榨取每一点性能。

正如 Hans 在问题评论中所说的那样,JITter 选择忽略一些优化。其中之一是注册 readonly 成员变量,这些变量在一个方法中被多次读取。虽然从概念上讲这看起来很容易实现,但认识到多次读取同一个成员变量并非易事。

简而言之,这是一种权衡,在绝大多数情况下,潜在的好处不值得 JITter 付出的代价。如果您的性能调整已经达到微优化的程度,那么明确启用 JITter 以通过手动将其提升到局部变量来注册成员变量。这具有使 JITter 执行其他优化(例如消除边界检查)的链式 react 。

关于c# - 为什么 JIT 在这种情况下不使用只读标志进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807282/

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