性能命中int +“”而不是使用int.ToString()

时间:2010-08-31 05:26:29

标签: c#

如果我使用以下内容,我将会感受到多少性能:

int i=5;
label1.Text = i + "";

而不是:

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

9 个答案:

答案 0 :(得分:11)

虽然两者之间的性能可能有所不同,但问问自己这个问题:这对于应用程序的性能是否有意义?

我的猜测是,它不会很重要。

测量并修复如果是。

架构通常会影响性能。次要语言优化可能会影响性能,但总的来说,您可以更好地花时间来解决通过实际测量确定的瓶颈问题。

答案 1 :(得分:11)

第一种方法在进程中创建一个额外的对象,因为它创建了一个对象来装入整数。编译器生成以下代码:

label1.Text = String.Concat((object)i, (object)String.Empty);

Concat方法将在两个参数上调用ToString方法以获取其字符串值,这有效地将整数解包,然后将其转换为字符串。它会通过连接字符串来创建另一个额外的对象,但它有代码来捕获其中一个字符串为空的特殊情况,因此它只返回整数的字符串值。

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

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

只要您不在紧密循环中执行此操作,性能差异将是最小的(我测量的速度差异为5-10%)。创建的额外对象是短暂的,因此很可能会在下一个垃圾收集中收集。但是,没有理由使用第一种方法,因为第二种方法存在并完全符合您的要求,而不是将其作为隐藏的副作用。

编辑:

另请注意,第一种方法应该是i + String.Empty而不是i + "",因此输入的次数甚至不如第二种方法。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

只需编写一个控制台应用程序,它可以在不同的循环中执行一个和另一个,并且可以轻松修改多少次并测量查找所需的时间?

答案 4 :(得分:1)

为了证明Guffas的回答,继承了生成的IL-Code:

//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

答案 5 :(得分:0)

忽略不计。不要费心去关注它。

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

即使性能较差,我也会使用label1.Text = i.ToString();(实际上我认为它的性能优于i+"")。以下是一些原因:

  • i+""似乎是一个硬代码 带来非常难闻的气味。如果你真的 想用+运算符, i+string.Empty更好(但仍然如此) 不是个好主意。)
  • i.ToString()更容易阅读, 这意味着“哦,我需要一串 我,被放在一些标签“。它 提出你的意愿。虽然i+"" 意思是“把结果添加到i和 一个标签“。
  • 的空字符串

答案 8 :(得分:0)

在我的计算机上,i.ToString()i + ""快约20纳秒(2e-8)。换句话说,没有区别。在它产生1秒的差异之前,你必须做几千万次这个操作!