如果我使用以下内容,我将会感受到多少性能:
int i=5;
label1.Text = i + "";
而不是:
int i=5;
label1.Text = i.ToString();
答案 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秒的差异之前,你必须做几千万次这个操作!