zoukankan      html  css  js  c++  java
  • [No0000B7]If else 与 三元表达式? : 效率对比

    先看 if else 一段代码

    using System;
    
    class Program
    {
        private static void Main()
        {
            int i = 0;
    
            if (i == 0) i = -1;
            else i = -2;
    
            Console.WriteLine(i);
        }
    }

    输出 -1

    用IL DASM ("C:Program Files (x86)Microsoft SDKsWindowsv10.0AinNETFX 4.6.1 Toolsildasm.exe"vs2015 up3,项目框架.NET Framework 4.5.2)打开

    .method private hidebysig static void Main() cil managed
    {
        .entrypoint
        // 代码大小 26 (0x1a)
        .maxstack 2
        .locals init ([0] int32 i,
        [1] bool V_1)
        IL_0000: nop
        IL_0001: ldc.i4.0
        IL_0002: stloc.0
        IL_0003: ldloc.0
        IL_0004: ldc.i4.0
        IL_0005: ceq
        IL_0007: stloc.1
        IL_0008: ldloc.1
        IL_0009: brfalse.s IL_000f
        IL_000b: ldc.i4.m1
        IL_000c: stloc.0
        IL_000d: br.s IL_0012
        IL_000f: ldc.i4.s -2
        IL_0011: stloc.0
        IL_0012: ldloc.0
        IL_0013: call void [mscorlib]System.Console::WriteLine(int32)
        IL_0018: nop
        IL_0019: ret
    } // end of method Program::Main

    在看三元表达式? :一段代码

    using System;
    class Program
    {
        private static void Main()
        {
            int i = 0;
    
            i = i == 0 ? -1 : -2;
    
            Console.WriteLine(i);
        }
    }

    输出 -1

    .method private hidebysig static void Main() cil managed
    {
        .entrypoint
        // 代码大小 20 (0x14)
        .maxstack 1
        .locals init ([0] int32 i)
        IL_0000: nop
        IL_0001: ldc.i4.0
        IL_0002: stloc.0
        IL_0003: ldloc.0
        IL_0004: brfalse.s IL_000a
        IL_0006: ldc.i4.s -2
        IL_0008: br.s IL_000b
        IL_000a: ldc.i4.m1
        IL_000b: stloc.0
        IL_000c: ldloc.0
        IL_000d: call void [mscorlib]System.Console::WriteLine(int32)
        IL_0012: nop
        IL_0013: ret
    } // end of method Program::Main

    明显,执行效率不一样。三元表达式? :执行效率更高。

    using System;
    using System.Diagnostics;
    
    class Program
    {
        private static void Main()
        {
            int i = 0;
    
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            for (int j = 0; j < 100000000; j++)
            {
                if (i == 0) i = -1;
                else i = -2;
            }
            stopwatch.Stop();
    
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
    
            stopwatch.Reset();
    
            stopwatch.Start();
            for (int j = 0; j < 100000000; j++)
            {
                i = i == 0 ? -1 : -2;
            }
            stopwatch.Stop();
    
            Console.WriteLine(stopwatch.ElapsedMilliseconds);
        }
    }

     

  • 相关阅读:
    无重复字符的最长子串
    最长公共前缀
    项目开发的 工程化
    包管理 import debug 模块管理 module
    Third Party Browser Drivers NOT DEVELOPED by seleniumhq
    任何不看源码的代码引入都是存在定时爆炸的可能
    博客数计数
    lineage 世系 血缘 容错机制 DAG
    查源码分析 游标 写 需要 cursors 一切不看源码的代码引入都是定时炸弹的启动
    8核 16g 及时释放内存空间
  • 原文地址:https://www.cnblogs.com/Chary/p/No0000B7.html
Copyright © 2011-2022 走看看