【问题标题】:Is ToString() optimized by compiler?ToString() 是否由编译器优化?
【发布时间】:2010-05-31 04:28:11
【问题描述】:

假设我有以下代码:

Console.WriteLine("Value1: " + SomeEnum.Value1.ToString() + "\r\nValue2: " + 
                    SomeOtherEnum.Value2.ToString());

编译器会将其优化为:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " +
                         SomeOtherEnum.Value2);

我已经用 IL Disassembler 检查了它,并且有调用 IL_005a: callvirt instance string [mscorlib]System.Object::ToString()

我不知道 JIT 是否对此进行了优化。

【问题讨论】:

  • 已经很晚了,我可能会遗漏一些东西,但这是如何优化的?
  • @Jon Seigel 我避免写ToString(),因为我可以避免它只是为了减少打字,但一位朋友说这是不必要的开销,所以我在这里询问以消除任何疑问。
  • Value1 是字符串类型时,JIT 编译器可以优化对ToString 的调用。
  • 问这个问题真是太愚蠢了。是的,你是对的@Steven 我实际上想知道ToString() 被字符串调用。哦,我的知识太臃肿了咩咩哈哈
  • 真正的优化发生在运行时,因为此类调用很有可能被内联。

标签: .net tostring compiler-optimization


【解决方案1】:

不,相反。这个:

Console.WriteLine("Value1: " + SomeEnum.Value1 + "\r\nValue2: " +
                     SomeOtherEnum.Value2);

被编译器翻译成(相当于)这个:

string s = String.Concat("Value1: ", SomeEnum.Value1.ToString(), "\r\n Value2: ", SomeOtherEnum.Value2.ToString());
Console.WriteLine(s);

在这两种情况下,都会生成相同的 IL。如果您询问 JIT 是否将其转换为:

string s = String.Concat("Value1: ", "Value1", "\r\n Value2: ", "Value2");
Console.WriteLine(s);

那么答案是否定的。虽然我想知道为什么这对你来说是个问题?

【讨论】:

  • 查看我对@Jon Seigel 评论的评论
  • 好吧,反正你贴的两行基本上是等价的。如果你有像 ReSharper 这样的工具,它实际上会在对 ToString() 的调用是多余的时候通知你。并不是对性能有任何影响,只是不需要。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 2015-06-16
  • 2014-04-18
  • 2018-07-08
相关资源
最近更新 更多