代码的性能研究1
某哥们写了如下代码,被论坛上某“高手”一顿痛批,说此代码除了不符合编码规范外,性能也会非常低,原因是每次循环都会调用 ToCharArray() 。~~~~
string s = "abcdefg"; foreach (char c in s.ToCharArray()) Console.WriteLine(c);
在此我们不追究编码规范,只深究所谓性能降低的问题。可以肯定的说,那个高手也只是所谓的“高手”。呵呵!道理很简单,如果每次循环都调用ToCharArray()的话,那么每次都会生成一个新的char[],IEnumerator.Current 每次都会指向第一个字符(也就是'a'),IEnumerator.MoveNext() 永远是true,结果很糟糕——会陷入死循环。而事实上这段代码输出正常,显然和那个高手所说的不同。
OK,我们写个例子验证一下。
class MyString { string s = "abcdefg"; public char[] ToCharArray() { Console.WriteLine("ToCharArray..."); return s.ToCharArray(); } } public class Program { static void Main(string[] args) { MyString o = new MyString(); foreach (char c in o.ToCharArray()) Console.WriteLine(c); } }
输出
ToCharArray...
a
b
c
d
e
f
g
输出结果证明了ToCharArray()只被调用了一次。
我们查看 Main 的 IL 代码,看看编译器做了些什么。
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint .maxstack 2 .locals init ( [0] ConsoleApplication1.MyString text1, [1] char ch1, [2] char[] chArray1, [3] int32 num1, [4] bool flag1) L_0000: nop L_0001: newobj instance void ConsoleApplication1.MyString::.ctor() L_0006: stloc.0 L_0007: nop L_0008: ldloc.0 L_0009: callvirt instance char[] ConsoleApplication1.MyString::ToCharArray() L_000e: stloc.2 L_000f: ldc.i4.0 L_0010: stloc.3 L_0011: br.s L_0022 L_0013: ldloc.2 L_0014: ldloc.3 L_0015: ldelem.u2 L_0016: stloc.1 L_0017: ldloc.1 L_0018: call void [mscorlib]System.Console::WriteLine(char) L_001d: nop L_001e: ldloc.3 L_001f: ldc.i4.1 L_0020: add L_0021: stloc.3 L_0022: ldloc.3 L_0023: ldloc.2 L_0024: ldlen L_0025: conv.i4 L_0026: clt L_0028: stloc.s flag1 L_002a: ldloc.s flag1 L_002c: brtrue.s L_0013 L_002e: ret }
建议所有的“高手”们在发表高论前验证一下自己的观点。
============ 欢迎各位老板打赏~ ===========
与本文相关的文章
- · The instance of entity type ‘Customer’ cannot be tracked because another instance with the same key value for {‘Id’} is already being tracked.
- · .NET8实时更新nginx ip地址归属地
- · 解决.NET Blazor子组件不刷新问题
- · .NET8如何在普通类库中引用 Microsoft.AspNetCore
- · .NET8 Mysql SSL error
- · ASP.NET Core MVC的Razor视图渲染中文乱码的问题
- · .NETCORE 依赖注入服务生命周期
- · asp.net zero改mysql
- · .NET5面试汇总
- · .Net连接Mysql数据库的Convert Zero Datetime日期问题
- · vue使用element-ui中的Message 、MessageBox 、Notification
- · Asp.Net Core Filter 深入浅出的那些事-AOP