【发布时间】:2013-09-12 17:27:56
【问题描述】:
就我而言,我使用的是 C#,但问题的概念也适用于 Java。希望答案足够通用以涵盖两种语言。否则最好将问题一分为二。
我一直在想哪一个更好。
编译器是否负责增强“第二”代码以使其性能与“第一”代码一样好?
能否同时获得“更好的性能”和“优化”的代码?
冗余/更好的性能代码:
string name = GetName(); // returned string could be empty
List<string> myListOfStrings = GetListOfStrings();
if(string.IsNullOrWhiteSpace(name)
{
foreach(string s in myListOfStrings)
Console.WriteLine(s);
}
else
{
foreach(string s in myListOfStrings)
Console.WriteLine(s + " (Name is: " + name);
}
优化/性能较差的代码:
string name = GetName(); // returned string could be empty
List<string> myListOfStrings = GetListOfStrings();
foreach(string s in myListOfStrings)
Console.WriteLine(string.IsNullOrWhiteSpace(name) ? s : s + " (Name is: " + name);
显然,'first' 代码的执行时间更短,因为它在每个循环中只执行一次条件 'string.IsNullOrWhiteSpace(name)'。而“第二”代码(更好)在每次迭代时执行条件。
请考虑较长的循环执行时间而不是较短的循环执行时间,因为我知道当它很短时,性能不会有差异。
【问题讨论】:
-
优化发生的层次有很多。例如,您的第二个示例将受益于处理器的分支预测。追求最清晰、可读和可维护的。实际需要时担心优化。
-
我预计
Console.WriteLine的成本将超过串联成本... -
这与连接或 Console.WriteLine 无关。请查看问题的最后一部分。
-
@yazanpro:在过分担心理论之前,我会做基准测试。
-
@yazanpro 继续运行它。检查一个字符串是否为空一百万次是计算机可以非常轻松/快速完成的事情。如果您想让它成为值得关注的事情,那么让
if检查成为需要点击服务或数据库来确定的事情。那么这是你不想在一个循环中做的事情,即使它只有 5 次迭代。
标签: c# java performance compiler-construction