分类目录

链接

2011 年 12 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
代码的性能研究1
.NET 暂无评论 阅读(1,956)

某哥们写了如下代码,被论坛上某“高手”一顿痛批,说此代码除了不符合编码规范外,性能也会非常低,原因是每次循环都会调用 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 
}

建议所有的“高手”们在发表高论前验证一下自己的观点。

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:代码的性能研究1 | Bruce's Blog

发表评论

留言无头像?