复合格式中的装箱分配

问题描述 投票:0回答:1

在 Rider Resharper 中建议简化字符串插值。

执行此操作时,堆分配查看器插件会警告我有关装箱分配的信息。事实上,IL 代码是不同的,当运行秒表时,很明显简化的方法大约慢了 50%。

两个问题:

  1. 为什么 Rider 建议这种“改进”,而实际上它不会产生相同甚至性能更低的代码。
  2. 为什么编译器不将 :X8 转换为 ToString(x8) 以提高性能? :X8 有什么优点吗?
public string ToHexString1() => $"HexValue is: {uintVariable.ToString("X8")}"; //no boxing allocation
public string ToHexString2() => $"HexValue is: {uintVariable:X8}"; //boxing allocation
c# string resharper allocation boxing
1个回答
0
投票

主要是因为它的代码更简单。除非您处于紧密循环中,否则您不应该担心装箱分配。这根本不值得考虑。编写易于理解的代码,并在必要时进行优化。

但是,在 .NET 6+ 中,这实际上更好。你可以在SharpLab中看到反编译给你:

DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(13, 1);
defaultInterpolatedStringHandler.AppendLiteral("Hex Value is ");
defaultInterpolatedStringHandler.AppendFormatted(i, "X8");
return defaultInterpolatedStringHandler.ToStringAndClear();

没有拳击。

而在 .NET Framework 中你会得到

return string.Format("Hex Value is {0:X8}", i);

哪些盒子

i

© www.soinside.com 2019 - 2024. All rights reserved.