代码的性能研究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
