zoukankan      html  css  js  c++  java
  • 4、提取看似无用的委托变量,减少构造开销

    using System;
    
    namespace ShouldCode
    {
        public class ShouldDelegateVariable
        {
            public void Should()
            {
                Action show = Show;
                for (int i = 0 ; i < 10 ; i++)
                {
                    DoShow(show);
                }
                /*IL_0008: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
                IL_000d: stloc.0
                IL_000e: ldc.i4.0
                IL_000f: stloc.1
                IL_0010: br.s IL_0020
            // loop start (head: IL_0020)
                IL_0012: nop
                IL_0013: ldarg.0
                IL_0014: ldloc.0
                IL_0015: call instance void ShouldCode.ShouldDelegateVariable::DoShow(class [mscorlib]System.Action)
                IL_001a: nop
                IL_001b: nop
                IL_001c: ldloc.1
                IL_001d: ldc.i4.1
                IL_001e: add
                IL_001f: stloc.1
    
                IL_0020: ldloc.1
                IL_0021: ldc.i4.s 10
                IL_0023: clt
                IL_0025: stloc.2
                IL_0026: ldloc.2
                IL_0027: brtrue.s IL_0012
            // end loop */
            }
    
            public void Not()
            {
                for (int i = 0 ; i < 10 ; i++)
                {
                    DoShow(Show);
                }
                /*
            // loop start (head: IL_001e)
                IL_0005: nop
                IL_0006: ldarg.0
                IL_0007: ldarg.0
                IL_0008: ldftn instance void ShouldCode.ShouldDelegateVariable::Show()
                IL_000e: newobj instance void [mscorlib]System.Action::.ctor(object, native int)
                IL_0013: call instance void ShouldCode.ShouldDelegateVariable::DoShow(class [mscorlib]System.Action)
                IL_0018: nop
                IL_0019: nop
                IL_001a: ldloc.0
                IL_001b: ldc.i4.1
                IL_001c: add
                IL_001d: stloc.0
    
                IL_001e: ldloc.0
                IL_001f: ldc.i4.s 10
                IL_0021: clt
                IL_0023: stloc.1
                IL_0024: ldloc.1
                IL_0025: brtrue.s IL_0005
            // end loop */
            }
            public void DoShow(Action action)
            {
                action?.Invoke();
            }
            public void Show()
            {
                Console.WriteLine("看起来代码是一样的,其实涉及到内存分配问题!");
                Console.WriteLine("提取变量可以减少委托构造开销,注意多出的开销在 not 演示的 loop 范围里的 newobj !");
            }
        }
    }

     补充: newobj 指令为类型分配内存资源。一般都是 new。

  • 相关阅读:
    ArcGIS for Android地图控件的5大常见操作
    adb开启不了解决方案
    Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
    解决 Your project contains error(s),please fix them before running your application问题
    二路归并算法实现
    字符串全排列
    python连接MySQL
    .net常考面试题
    win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面
    int.Parse()与int.TryParse()
  • 原文地址:https://www.cnblogs.com/zhuwansu/p/11083107.html
Copyright © 2011-2022 走看看