2014-09-29 46 views
-1

它是否会降低性能,或者如果我创建不必要的示波器,这是不好的做法吗? 我的意思,只是可读性创建范围:不需要的示波器的性能

XmlElement header = list[0] as XmlElement; 
if (header == null) throw new Exception("Corrupt header."); 

{ 
    XmlElement subHeader = null; // ... 
} 

这样,它是克利更好的可读性。任何原因为什么要避免这种情况我只是意识到这会让我的代码更具可读性,这是相当不错的。特别是因为这不止一次发生,我必须加载一个主元素,然后有一些子元素,我可以很容易地在视觉上分开。

专业人士说什么?

+1

不,没有性能影响。尽管如此,您可能会考虑将代码分解为方法。 – Blorgbeard 2014-09-29 23:02:06

+8

但是,如果你真的在可读性之后,考虑* not *包括'if'行为('throw new Exception ...')与条件相同的行。特别是在这种情况下,第一眼看到下面的代码块会被附加到'if' – 2014-09-29 23:04:39

+2

快速扫描代码,我会将您的代码块读取为属于if语句。这是一种非常规的格式。所以对我来说这当然不是“明显更好”。希望你不要以为短时间总是意味着更好。 – itsme86 2014-09-29 23:05:40

回答

2

这不是更具可读性。你的例子代码显示了这个。

在我看来这两套代码之间的区别是混乱:

XmlElement header = list[0] as XmlElement; 
if (header == null) 
{ 
    XmlElement subHeader = null; // ... 
} 


XmlElement header = list[0] as XmlElement; 
if (header == null) throw new Exception("Corrupt header."); 
{ 
    XmlElement subHeader = null; // ... 
} 

另外,如果你的代码是“相对较长”,那么它应该被分解成不同的方法,而不是由范围块分组。

现在,就表现而言。这里有一个简单的例子:

var text = "Hello"; 
Console.WriteLine(text); 

这变成这个IL:

IL_0001: ldstr  "Hello" 
IL_0006: stloc.0  // text 
IL_0007: ldloc.0  // text 
IL_0008: call  System.Console.WriteLine 

如果我写这样的代码:

var text = "Hello"; 
{ 
    Console.WriteLine(text); 
} 

的IL变为:

IL_0001: ldstr  "Hello" 
IL_0006: stloc.0  // text 
IL_0007: nop   
IL_0008: ldloc.0  // text 
IL_0009: call  System.Console.WriteLine 
IL_000E: nop  

请注意nop操作离子。

对于每个范围块,我在IL中获得一对新的nop操作。但是这只发生在调试模式下。在发布模式下,nop操作被删除。

为了测试在调试模式下的性能差异,我写这个代码:

var sw = Stopwatch.StartNew(); 
var x = 0L; 
for (var y = 0; y < 1000000000L; y++) 
{ 
    { 
     x += y; 
    } 
} 
sw.Stop(); 
Console.WriteLine(x); 
Console.WriteLine(sw.ElapsedMilliseconds); 

随着额外的范围是在大约3550毫秒持续跑。没有额外的范围是大约3,500毫秒。所以性能差异约1.5%。这只是在调试模式!

但考虑到我的操作x += y是如此微不足道,并且性能下降很小,您可能会忽略正常代码中的性能差异。显然在发布模式代码中完全忽略它。

+0

很高兴知道,感谢您的测试。我知道这不是更具可读性,特别是在这种情况下(这是严重选择),但我很好奇。 – SharpShade 2014-09-29 23:35:23

+0

你确定你在发布模式下编译?我强烈怀疑这些'nop'指令只是为了让你设置一个断点(例如当你在额外的大括号上设置断点时)。 – 2014-09-29 23:41:51

+0

@LucasTrzesniewski - 是的。你是对的。他们在释放模式下消失。 – Enigmativity 2014-09-29 23:45:19