C# int+的性能命中率&引用&引用;而不是使用int.ToString()

C# int+的性能命中率&引用&引用;而不是使用int.ToString(),c#,C#,如果我使用以下命令,我将获得多少性能命中: int i=5; label1.Text = i + ""; 而不是: int i=5; label1.Text = i.ToString(); 可协商的。不要费心去注意它。可以忽略。不要费心去关注它。虽然两者在性能上可能存在差异,但要问自己这样一个问题:这对应用程序的性能有意义吗 我的猜测是,这不会有什么意义 测量并修复它(如果是) 架构通常会影响性能。次要的语言优化可能会影响性能,但一般来说,您最好将时间花在处理通过实际测量确定的瓶颈上 尽管这

如果我使用以下命令,我将获得多少性能命中:

int i=5;
label1.Text = i + "";
而不是:

int i=5;
label1.Text = i.ToString();

可协商的。不要费心去注意它。

可以忽略。不要费心去关注它。

虽然两者在性能上可能存在差异,但要问自己这样一个问题:这对应用程序的性能有意义吗

我的猜测是,这不会有什么意义

测量并修复它(如果是)


架构通常会影响性能。次要的语言优化可能会影响性能,但一般来说,您最好将时间花在处理通过实际测量确定的瓶颈上

尽管这两种方法在性能上可能存在差异,但要问自己这样一个问题:这对应用程序的性能有重要影响吗

我的猜测是,这不会有什么意义

测量并修复它(如果是)


架构通常会影响性能。次要的语言优化可能会影响性能,但一般来说,您最好将时间花在处理通过实际测量确定的瓶颈上

只需编写一个控制台应用程序,在单独的循环中执行一个和另一个,执行次数可轻松修改,并测量查找所需的时间?

只需编写一个控制台应用程序,在单独的循环中执行一个和另一个,执行次数可轻松修改,并测量查找所需的时间退出?

我认为在这种特殊情况下,代码可读性的好处(如果有的话)可以忽略不计。第二种情况对读者来说是显而易见和迅速的;第一个通常需要两次拍摄


对于这样一个微不足道的操作,我个人认为可读性胜出。

我认为在这种特殊情况下,代码可读性的好处(如果有的话)可以忽略不计。第二种情况对读者来说是显而易见和迅速的;第一个通常需要两次拍摄


对于一个如此琐碎的操作,我个人认为可读性胜出。

我没有分析它,但逻辑上第一个是隐式地将
I
转换为字符串,创建一个新的空字符串,然后将两者连接起来。第二个步骤仅仅是创建一个字符串表示(三个步骤之一)。(当然,编译器可以优化第一个,使它们等效)


除了应用程序中性能非常关键的部分外,这种差异可以忽略不计。更重要的是,第二个在语义上是精确的——它准确地说明了您要做的事情。第一个可能令人困惑。我的意思是,这是一个非常常见的构造,任何阅读它的人都会理解它,但是,如果有选择,为什么不选择可读性更高的代码呢?

我没有分析它,但逻辑上第一个是隐式地将
I
转换为字符串,创建一个新的空字符串,然后将两者连接起来。第二个步骤仅仅是创建一个字符串表示(三个步骤之一)。(当然,编译器可以优化第一个,使它们等效)


除了应用程序中性能非常关键的部分外,这种差异可以忽略不计。更重要的是,第二个在语义上是精确的——它准确地说明了您要做的事情。第一个可能令人困惑。我的意思是,这是一个非常常见的构造,任何读过它的人都会理解它,但是,如果有选择,为什么不选择更可读的代码呢?

我将使用
label1.Text=I.ToString()
即使它的性能较差(事实上,我认为它的性能比
I+“”
)。以下是一些原因:

  • i+”
    似乎是一个硬代码,它 会带来很难闻的气味。如果你真的 要使用+运算符,
    i+string.Empty
    更好(但仍然是 这不是一个好主意)
  • i.ToString()
    更容易阅读, 意思是“哦,我需要一串 i、 放在某个标签上”。信息技术 表达你的意愿。而
    i+”
    表示“将i和 指向某个标签的空字符串”

我将使用
label1.Text=I.ToString()
即使它的性能较差(事实上,我认为它的性能比
I+“”
)。以下是一些原因:

  • i+”
    似乎是一个硬代码,它 会带来很难闻的气味。如果你真的 要使用+运算符,
    i+string.Empty
    更好(但仍然是 这不是一个好主意)
  • i.ToString()
    更容易阅读, 意思是“哦,我需要一串 i、 放在某个标签上”。信息技术 表达你的意愿。而
    i+”
    表示“将i和 指向某个标签的空字符串”

    • 第一个方法在这个过程中创建一个额外的对象,因为它创建了一个对象来将整数放入框中。编译器生成以下代码:

      label1.Text = String.Concat((object)i, (object)String.Empty);
      
      Concat
      方法将对这两个参数调用
      ToString
      方法,以获取它们的字符串值,从而在将整数转换为字符串之前有效地解除对其的绑定。它将通过连接字符串来创建另一个额外的对象,但它有代码来捕捉其中一个字符串为空的特殊情况,因此它只返回整数的字符串值

      第二种方法最终完全按照它所说的去做

      您应该避免使用第一种方法,这主要不是因为它的性能更差,而是因为它隐藏了您真正想要做的事情

      性能差异将是最小的,只要你不这样做在一个紧密的循环(我测量了5-10%的速度差)。所创建的额外对象是短期的,因此它很可能在下一次垃圾收集中被收集。但是,没有理由使用第一种方法,因为第二种方法是存在的,并且完全是您想要的
      //000015:             String s1 = number.ToString();
        IL_0004:  ldloca.s   number
        IL_0006:  call       instance string [mscorlib]System.Int32::ToString()
        IL_000b:  stloc.1
      //000016:             String s2 = number + "";
        IL_000c:  ldloc.0
        IL_000d:  box        [mscorlib]System.Int32
        IL_0012:  call       string [mscorlib]System.String::Concat(object)
        IL_0017:  stloc.2