using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Diagnostics; namespace ConsoleApplication1
{
    class Program
{
static void Main()
{
compare();
}

private static void compare()
{
Console.WriteLine("*****比較if-else與三目運算符的效率*****");
for (int j = 1; j < 20; j++)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("這是第" + j + "次測試。");
Console.ForegroundColor = ConsoleColor.White; Stopwatch time1 = new Stopwatch(); time1.Start(); for (int i = 0; i < 100000000; i++)
{
int temp = 0;
if (temp == 1)
temp = 1;
else
temp = 0;
} time1.Stop();
TimeSpan t1 = time1.Elapsed;
Console.WriteLine("if-else執行時間是:"+t1.ToString()); time1.Reset(); Stopwatch time2 = new Stopwatch(); time2.Start();
for (int i = 0; i < 100000000; i++)
{
int temp = 0;
temp = temp == 0 ? 1 : 0;
}
time2.Stop();
TimeSpan t2 = time2.Elapsed;
Console.WriteLine("三目運算符執行時間是:" + t2.ToString()); time2.Reset(); string conclusion = (t1 < t2) ? "if-else效率高" : "三目元算符效率高";
float f1 = t1.Ticks;
float f2 = t2.Ticks;
float efficiency = (f1 < f2) ? f2 / f1 : f1 / f2;
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("結論是:" + conclusion + ",效率比是:" + efficiency.ToString());
}
Console.WriteLine("*****按下回車鍵關閉窗口*****");
Console.ReadLine();
}
    }
}您新建一個控制臺程序,然後放入上述代碼執行。我運行的結果如下(運行時間可能不一樣,不過結論都是一樣的)
*****比較if-else與三目運算符的效率*****
這是第1次測試。
if-else執行時間是:00:00:00.4057753
三目運算符執行時間是:00:00:00.3721558
結論是:三目元算符效率高,效率比是:1.090337
這是第2次測試。
if-else執行時間是:00:00:00.4042576
三目運算符執行時間是:00:00:00.3778070
結論是:三目元算符效率高,效率比是:1.070011
這是第3次測試。
if-else執行時間是:00:00:00.4047548
三目運算符執行時間是:00:00:00.3696018
結論是:三目元算符效率高,效率比是:1.09511
這是第4次測試。
if-else執行時間是:00:00:00.4016809
三目運算符執行時間是:00:00:00.3694739
結論是:三目元算符效率高,效率比是:1.08717
這是第5次測試。
if-else執行時間是:00:00:00.4046356
三目運算符執行時間是:00:00:00.3712424
結論是:三目元算符效率高,效率比是:1.08995
這是第6次測試。
if-else執行時間是:00:00:00.4015913
三目運算符執行時間是:00:00:00.3709766
結論是:三目元算符效率高,效率比是:1.082525
這是第7次測試。
if-else執行時間是:00:00:00.4050849
三目運算符執行時間是:00:00:00.3707200
結論是:三目元算符效率高,效率比是:1.092698
這是第8次測試。
if-else執行時間是:00:00:00.4048344
三目運算符執行時間是:00:00:00.3703526
結論是:三目元算符效率高,效率比是:1.093105
這是第9次測試。
if-else執行時間是:00:00:00.4026887
三目運算符執行時間是:00:00:00.3697847
結論是:三目元算符效率高,效率比是:1.088982
這是第10次測試。
if-else執行時間是:00:00:00.4053084
三目運算符執行時間是:00:00:00.3703975
結論是:三目元算符效率高,效率比是:1.094252
這是第11次測試。
if-else執行時間是:00:00:00.4023193
三目運算符執行時間是:00:00:00.3702872
結論是:三目元算符效率高,效率比是:1.086506
這是第12次測試。
if-else執行時間是:00:00:00.4036262
三目運算符執行時間是:00:00:00.3694859
結論是:三目元算符效率高,效率比是:1.092399
這是第13次測試。
if-else執行時間是:00:00:00.4018123
三目運算符執行時間是:00:00:00.3697152
結論是:三目元算符效率高,效率比是:1.086816
這是第14次測試。
if-else執行時間是:00:00:00.4028462
三目運算符執行時間是:00:00:00.3695552
結論是:三目元算符效率高,效率比是:1.090084
這是第15次測試。
if-else執行時間是:00:00:00.4023199
三目運算符執行時間是:00:00:00.3705751
結論是:三目元算符效率高,效率比是:1.085664
這是第16次測試。
if-else執行時間是:00:00:00.4018908
三目運算符執行時間是:00:00:00.3699753
結論是:三目元算符效率高,效率比是:1.086264
這是第17次測試。
if-else執行時間是:00:00:00.4021569
三目運算符執行時間是:00:00:00.3696670
結論是:三目元算符效率高,效率比是:1.08789
這是第18次測試。
if-else執行時間是:00:00:00.4020547
三目運算符執行時間是:00:00:00.3708227
結論是:三目元算符效率高,效率比是:1.084224
這是第19次測試。
if-else執行時間是:00:00:00.4017543
三目運算符執行時間是:00:00:00.3695815
結論是:三目元算符效率高,效率比是:1.087052
*****按下回車鍵關閉窗口*****========================所以我的問題來了,爲什麽三目運算符的效率高呢?

解决方案 »

  1.   

    爲了深入了解,我寫了如下測試代碼:using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplication1
    {
    class LvJin
    {
    private void Jin()
    {
    int king = 0;
    int temp = 0;
    if (temp == 0)
    king = 1;
    else
    king = 0;
    int king2 = temp == 0 ? 1 : 0;
    }
    }
    }通過MSIL Disassembler工具(MSIL 反組譯工具)查看上述代碼的IL(中間語言),如下:.method private hidebysig instance void  Jin() cil managed
    {
      // Code size       31 (0x1f)
      .maxstack  2
      .locals init ([0] int32 king,
               [1] int32 temp,
               [2] int32 king2,
               [3] bool CS$4$0000)
      IL_0000:  nop
      IL_0001:  ldc.i4.0
      IL_0002:  stloc.0
      IL_0003:  ldc.i4.0
      IL_0004:  stloc.1
      IL_0005:  ldloc.1
      IL_0006:  ldc.i4.0
      IL_0007:  ceq
      IL_0009:  ldc.i4.0
      IL_000a:  ceq
      IL_000c:  stloc.3
      IL_000d:  ldloc.3
      IL_000e:  brtrue.s   IL_0014
      IL_0010:  ldc.i4.1
      IL_0011:  stloc.0
      IL_0012:  br.s       IL_0016
      IL_0014:  ldc.i4.0
      IL_0015:  stloc.0
      IL_0016:  ldloc.1
      IL_0017:  brfalse.s  IL_001c
      IL_0019:  ldc.i4.0
      IL_001a:  br.s       IL_001d
      IL_001c:  ldc.i4.1
      IL_001d:  stloc.2
      IL_001e:  ret
    } // end of method LvJin::Jin請哪位大俠幫忙解讀下,如何看出來三目運算符的效率高?
      

  2.   

    这个应该根据三元运算符的优先级而来的吧?
    if else 在执行过程中两条语句三元运算符 是一条语句。猜测
    看楼下。
      

  3.   

    扩展if else
    public static T If<T>(this T t, Predicate<T> predicate, Action<T> action) where T: class
            {
                if(t == null) throw new ArgumentNullException();
                if (predicate(t)) action(t);
                return t;
            }
      

  4.   

    你可以尝试再 添加  ?? 与 ?:  还有if..else  三者之间的效率对比
      

  5.   

    MSIL 指令大全
    公共字段
    Add 将两个值相加并将结果推送到计算堆栈上。 
    Add_Ovf 将两个整数相加,执行溢出检查,并且将结果推送到计算堆栈上。 
    Add_Ovf_Un 将两个无符号整数值相加,执行溢出检查,并且将结果推送到计算堆栈上。 
    And 计算两个值的位 AND 并将结果推送到计算堆栈上。 
    Arglist 返回指向当前方法的参数列表的非托管指针。 
    Beq 如果两个值相等,则将控制转移到目标指令。 
    Beq_S 如果两个值相等,则将控制转移到目标指令(短格式)。 
    Bge 如果第一个值大于或等于第二个值,则将控制转移到目标指令。 
    Bge_S 如果第一个值大于或等于第二个值,则将控制转移到目标指令(短格式)。 
    Bge_Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 
    Bge_Un_S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 
    Bgt 如果第一个值大于第二个值,则将控制转移到目标指令。 
    Bgt_S 如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 
    Bgt_Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令。 
    Bgt_Un_S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值大于第二个值,则将控制转移到目标指令(短格式)。 
    Ble 如果第一个值小于或等于第二个值,则将控制转移到目标指令。 
    Ble_S 如果第一个值小于或等于第二个值,则将控制转移到目标指令(短格式)。 
    Ble_Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值小于或等于第二个值,则将控制转移到目标指令。 
    Ble_Un_S 当比较无符号整数值或不可排序的浮点值时,如果第一个值小于或等于第二个值,则将控制权转移到目标指令(短格式)。 
    Blt 如果第一个值小于第二个值,则将控制转移到目标指令。 
    Blt_S 如果第一个值小于第二个值,则将控制转移到目标指令(短格式)。 
    Blt_Un 当比较无符号整数值或不可排序的浮点型值时,如果第一个值小于第二个值,则将控制转移到目标指令。 
    Blt_Un_S 当比较无符号整数值或不可排序的浮点型值时,如果第一个值小于第二个值,则将控制转移到目标指令(短格式)。 
    Bne_Un 当两个无符号整数值或不可排序的浮点型值不相等时,将控制转移到目标指令。 
    Bne_Un_S 当两个无符号整数值或不可排序的浮点型值不相等时,将控制转移到目标指令(短格式)。 
    Box 将值类转换为对象引用(O 类型)。 
    Br 无条件地将控制转移到目标指令。 
    Break 向公共语言结构 (CLI) 发出信号以通知调试器已撞上了一个断点。 
    Brfalse 如果 value 为 false、空引用(Visual Basic 中的 Nothing)或零,则将控制转移到目标指令。 
    Brfalse_S 如果 value 为 false、空引用或零,则将控制转移到目标指令。 
    Brtrue 如果 value 为 true、非空或非零,则将控制转移到目标指令。 
    Brtrue_S 如果 value 为 true、非空或非零,则将控制转移到目标指令(短格式)。 
    Br_S 无条件地将控制转移到目标指令(短格式)。 
    Call 调用由传递的方法说明符指示的方法。 
    Calli 通过调用约定描述的参数调用在计算堆栈上指示的方法(作为指向入口点的指针)。 
    Callvirt 对对象调用后期绑定方法,并且将返回值推送到计算堆栈上。 
    Castclass 尝试将引用传递的对象转换为指定的类。 
    Ceq 比较两个值。如果这两个值相等,则将整数值 1 ((int32) 推送到计算堆栈上;否则,将 0 (int32) 推送到计算堆栈上。 
    Cgt 比较两个值。如果第一个值大于第二个值,则将整数值 1 ((int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上。 
    Cgt_Un 比较两个无符号的或不可排序的值。如果第一个值大于第二个值,则将整数值 1 ((int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上。 
    Ckfinite 如果值不是有限数,则引发 ArithmeticException。 
    Clt 比较两个值。如果第一个值小于第二个值,则将整数值 1 ((int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上。 
    Clt_Un 比较无符号的或不可排序的值 value1 和 value2。如果 value1 小于 value2,则将整数值 1 ((int32) 推送到计算堆栈上;反之,将 0 (int32) 推送到计算堆栈上。 
    Conv_I 将位于计算堆栈顶部的值转换为 natural int。 
    Conv_I1 将位于计算堆栈顶部的值转换为 int8,然后将其扩展(填充)为 int32。 
    Conv_I2 将位于计算堆栈顶部的值转换为 int16,然后将其扩展(填充)为 int32。 
    Conv_I4 将位于计算堆栈顶部的值转换为 int32。 
    Conv_I8 将位于计算堆栈顶部的值转换为 int64。 
    Conv_Ovf_I 将位于计算堆栈顶部的有符号值转换为有符号 natural int,并在溢出时引发 OverflowException。 
    Conv_Ovf_I1 将位于计算堆栈顶部的有符号值转换为有符号 int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I1_Un 将位于计算堆栈顶部的无符号值转换为有符号 int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I2 将位于计算堆栈顶部的有符号值转换为有符号 int16 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I2_Un 将位于计算堆栈顶部的无符号值转换为有符号 int16 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I4 将位于计算堆栈顶部的有符号值转换为有符号 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I4_Un 将位于计算堆栈顶部的无符号值转换为有符号 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_I8 将位于计算堆栈顶部的有符号值转换为有符号 int64,并在溢出时引发 OverflowException。 
    Conv_Ovf_I8_Un 将位于计算堆栈顶部的无符号值转换为有符号 int64,并在溢出时引发 OverflowException。 
    Conv_Ovf_I_Un 将位于计算堆栈顶部的无符号值转换为有符号 natural int,并在溢出时引发 OverflowException。 
    Conv_Ovf_U 将位于计算堆栈顶部的有符号值转换为 unsigned natural int,并在溢出时引发 OverflowException。 
    Conv_Ovf_U1 将位于计算堆栈顶部的有符号值转换为 unsigned int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U1_Un 将位于计算堆栈顶部的无符号值转换为 unsigned int8 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U2 将位于计算堆栈顶部的有符号值转换为 unsigned int16 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U2_Un 将位于计算堆栈顶部的无符号值转换为 unsigned int16 并将其扩展为 int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U4 将位于计算堆栈顶部的有符号值转换为 unsigned int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U4_Un 将位于计算堆栈顶部的无符号值转换为 unsigned int32,并在溢出时引发 OverflowException。 
    Conv_Ovf_U8 将位于计算堆栈顶部的有符号值转换为 unsigned int64,并在溢出时引发 OverflowException。 
    Conv_Ovf_U8_Un 将位于计算堆栈顶部的无符号值转换为 unsigned int64,并在溢出时引发 OverflowException。 
    Conv_Ovf_U_Un 将位于计算堆栈顶部的无符号值转换为 unsigned natural int,并在溢出时引发 OverflowException。 
    Conv_R4 将位于计算堆栈顶部的值转换为 float32。 
    Conv_R8 将位于计算堆栈顶部的值转换为 float64。 
    Conv_R_Un 将位于计算堆栈顶部的无符号整数值转换为 float32。 
    Conv_U 将位于计算堆栈顶部的值转换为 unsigned natural int,然后将其扩展为 natural int。 
    Conv_U1 将位于计算堆栈顶部的值转换为 unsigned int8,然后将其扩展为 int32。 
    Conv_U2 将位于计算堆栈顶部的值转换为 unsigned int16,然后将其扩展为 int32。 
    Conv_U4 将位于计算堆栈顶部的值转换为 unsigned int32,然后将其扩展为 int32。 
    Conv_U8 将位于计算堆栈顶部的值转换为 unsigned int64,然后将其扩展为 int64。 
    Cpblk 将指定数目的字节从源地址复制到目标地址。 
    Cpobj 将位于对象(&、* 或 natural int 类型)地址的值类型复制到目标对象(&、* 或 natural int 类型)的地址。 
    Div 将两个值相除并将结果作为浮点(F 类型)或商(int32 类型)推送到计算堆栈上。 
    Div_Un 两个无符号整数值相除并将结果 (int32) 推送到计算堆栈上。 
    Dup 复制计算堆栈上当前最顶端的值,然后将副本推送到计算堆栈上。 
    Endfilter 将控制从异常的 filter 子句转移回公共语言结构 (CLI) 异常处理程序。 
    Endfinally 将控制从异常块的 fault 或 finally 子句转移回公共语言结构 (CLI) 异常处理程序。 
    Initblk 将位于特定地址的内存的指定块初始化为给定大小和初始值。 
    Initobj 将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的 0。 
    Isinst 测试对象引用(O 类型)是否为特定类的实例。 
    Jmp 退出当前方法并跳至指定方法。 
    Ldarg 将参数(由指定索引值引用)加载到堆栈上。 
    Ldarga 将参数地址加载到计算堆栈上。 
    Ldarga_S 以短格式将参数地址加载到计算堆栈上。 
    Ldarg_0 将索引为 0 的参数加载到计算堆栈上。 
    Ldarg_1 将索引为 1 的参数加载到计算堆栈上。 
    Ldarg_2 将索引为 2 的参数加载到计算堆栈上。 
    Ldarg_3 将索引为 3 的参数加载到计算堆栈上。 
    Ldarg_S 将参数(由指定的短格式索引引用)加载到计算堆栈上。 
    Ldc_I4 将所提供的 int32 类型的值作为 int32 推送到计算堆栈上。 
    Ldc_I4_0 将整数值 0 作为 int32 推送到计算堆栈上。 
    Ldc_I4_1 将整数值 1 作为 int32 推送到计算堆栈上。 
    Ldc_I4_2 将整数值 2 作为 int32 推送到计算堆栈上。 
    Ldc_I4_3 将整数值 3 作为 int32 推送到计算堆栈上。 
    Ldc_I4_4 将整数值 4 作为 int32 推送到计算堆栈上。 
    Ldc_I4_5 将整数值 5 作为 int32 推送到计算堆栈上。 
    Ldc_I4_6 将整数值 6 作为 int32 推送到计算堆栈上。 
    Ldc_I4_7 将整数值 7 作为 int32 推送到计算堆栈上。 
    Ldc_I4_8 将整数值 8 作为 int32 推送到计算堆栈上。 
    Ldc_I4_M1 将整数值 -1 作为 int32 推送到计算堆栈上。 
    Ldc_I4_S 将提供的 int8 值作为 int32 推送到计算堆栈上(短格式)。 
    Ldc_I8 将所提供的 int64 类型的值作为 int64 推送到计算堆栈上。 
    Ldc_R4 将所提供的 float32 类型的值作为 F (float) 类型推送到计算堆栈上。 
    Ldc_R8 将所提供的 float64 类型的值作为 F (float) 类型推送到计算堆栈上。 
    Ldelema 将位于指定数组索引的数组元素的地址作为 & 类型(托管指针)加载到计算堆栈的顶部。 
    Ldelem_I 将位于指定数组索引处的 natural int 类型的元素作为 natural int 加载到计算堆栈的顶部。 
    Ldelem_I1 将位于指定数组索引处的 int8 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldelem_I2 将位于指定数组索引处的 int16 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldelem_I4 将位于指定数组索引处的 int32 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldelem_I8 将位于指定数组索引处的 int64 类型的元素作为 int64 加载到计算堆栈的顶部。 
    Ldelem_R4 将位于指定数组索引处的 float32 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。 
    Ldelem_R8 将位于指定数组索引处的 float64 类型的元素作为 F 类型(浮点型)加载到计算堆栈的顶部。 
    Ldelem_Ref 将位于指定数组索引处的包含对象引用的元素作为 O 类型(对象引用)加载到计算堆栈的顶部。 
    Ldelem_U1 将位于指定数组索引处的 unsigned int8 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldelem_U2 将位于指定数组索引处的 unsigned int16 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldelem_U4 将位于指定数组索引处的 unsigned int32 类型的元素作为 int32 加载到计算堆栈的顶部。 
    Ldfld 查找对象中其引用当前位于计算堆栈的字段的值。 
    Ldflda 查找对象中其引用当前位于计算堆栈的字段的地址。 
    Ldftn 将指向实现特定方法的本机代码的非托管指针(natural int 类型)推送到计算堆栈上。 
    Ldind_I 将 natural int 类型的值作为 natural int 间接加载到计算堆栈上。 
    Ldind_I1 将 int8 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldind_I2 将 int16 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldind_I4 将 int32 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldind_I8 将 int64 类型的值作为 int64 间接加载到计算堆栈上。 
    Ldind_R4 将 float32 类型的值作为 F (float) 类型间接加载到计算堆栈上。 
    Ldind_R8 将 float64 类型的值作为 F (float) 类型间接加载到计算堆栈上。 
    Ldind_Ref 将对象引用作为 O(对象引用)类型间接加载到计算堆栈上。 
    Ldind_U1 将 unsigned int8 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldind_U2 将 unsigned int16 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldind_U4 将 unsigned int32 类型的值作为 int32 间接加载到计算堆栈上。 
    Ldlen 将从零开始的、一维数组的元素的数目推送到计算堆栈上。 
    Ldloc 将指定索引处的局部变量加载到计算堆栈上。 
    Ldloca 将位于特定索引处的局部变量的地址加载到计算堆栈上。 
    Ldloca_S 将位于特定索引处的局部变量的地址加载到计算堆栈上(短格式)。 
    Ldloc_0 将索引 0 处的局部变量加载到计算堆栈上。 
    Ldloc_1 将索引 1 处的局部变量加载到计算堆栈上。 
    Ldloc_2 将索引 2 处的局部变量加载到计算堆栈上。 
    Ldloc_3 将索引 3 处的局部变量加载到计算堆栈上。 
    Ldloc_S 将特定索引处的局部变量加载到计算堆栈上(短格式)。 
    Ldnull 将空引用(O 类型)推送到计算堆栈上。 
    Ldobj 将地址指向的值类型对象复制到计算堆栈的顶部。 
    Ldsfld 将静态字段的值推送到计算堆栈上。 
    Ldsflda 将静态字段的地址推送到计算堆栈上。 
    Ldstr 推送对元数据中存储的字符串的新对象引用。 
    Ldtoken 将元数据标记转换为其运行时表示形式,并将其推送到计算堆栈上。 
    Ldvirtftn 将指向实现与指定对象关联的特定虚方法的本机代码的非托管指针(natural int 类型)推送到计
      

  6.   

    算堆栈上。 
    Leave 退出受保护的代码区域,无条件将控制转移到特定目标指令。 
    Leave_S 退出受保护的代码区域,无条件将控制转移到目标指令(短格式)。 
    Localloc 从本地动态内存池分配特定数目的字节并将第一个分配的字节的地址(瞬态指针,* 类型)推送到计算堆栈上。 
    Mkrefany 将对特定类型实例的类型化引用推送到计算堆栈上。 
    Mul 将两个值相乘并将结果推送到计算堆栈上。 
    Mul_Ovf 将两个整数值相乘,执行溢出检查,并将结果推送到计算堆栈上。 
    Mul_Ovf_Un 将两个无符号整数值相乘,执行溢出检查,并将结果推送到计算堆栈上。 
    Neg 对一个值执行求反并将结果推送到计算堆栈上。 
    Newarr 将对新的从零开始的一维数组(其元素属于特定类型)的对象引用推送到计算堆栈上。 
    Newobj 创建一个值类型的新对象或新实例,并将对象引用(O 类型)推送到计算堆栈上。 
    Nop 如果修补操作码,则填充空间。尽管可能消耗处理周期,但未执行任何有意义的操作。 
    Not 计算堆栈顶部整数值的按位求补并将结果作为相同的类型推送到计算堆栈上。 
    or 计算位于堆栈顶部的两个整数值的按位求补并将结果推送到计算堆栈上。 
    Pop 移除当前位于计算堆栈顶部的值。 
    Refanytype 检索嵌入在类型化引用内的类型标记。 
    Refanyval 检索嵌入在类型化引用内的地址(& 类型)。 
    Rem 将两个值相除并将余数推送到计算堆栈上。 
    Rem_Un 将两个无符号值相除并将余数推送到计算堆栈上。 
    Ret 从当前方法返回,并将返回值(如果存在)从调用方的计算堆栈推送到被调用方的计算堆栈上。 
    Rethrow 再次引发当前异常。 
    Shl 将整数值左移(用零填充)指定的位数,并将结果推送到计算堆栈上。 
    Shr 将整数值右移(保留符号)指定的位数,并将结果推送到计算堆栈上。 
    Shr_Un 将无符号整数值右移(用零填充)指定的位数,并将结果推送到计算堆栈上。 
    Sizeof 将提供的值类型的大小(以字节为单位)推送到计算堆栈上。 
    Starg 将位于计算堆栈顶部的值存储到位于指定索引的参数槽中。 
    Starg_S 将位于计算堆栈顶部的值存储在参数槽中的指定索引处(短格式)。 
    Stelem_I 用计算堆栈上的 natural int 值替换给定索引处的数组元素。 
    Stelem_I1 用计算堆栈上的 int8 值替换给定索引处的数组元素。 
    Stelem_I2 用计算堆栈上的 int16 值替换给定索引处的数组元素。 
    Stelem_I4 用计算堆栈上的 int32 值替换给定索引处的数组元素。 
    Stelem_I8 用计算堆栈上的 int64 值替换给定索引处的数组元素。 
    Stelem_R4 用计算堆栈上的 float32 值替换给定索引处的数组元素。 
    Stelem_R8 用计算堆栈上的 float64 值替换给定索引处的数组元素。 
    Stelem_Ref 用计算堆栈上的对象 ref 值(O 类型)替换给定索引处的数组元素。 
    Stfld 用新值替换在对象引用或指针的字段中存储的值。 
    Stind_I 在所提供的地址存储 natural int 类型的值。 
    Stind_I1 在所提供的地址存储 int8 类型的值。 
    Stind_I2 在所提供的地址存储 int16 类型的值。 
    Stind_I4 在所提供的地址存储 int32 类型的值。 
    Stind_I8 在所提供的地址存储 int64 类型的值。 
    Stind_R4 在所提供的地址存储 float32 类型的值。 
    Stind_R8 在所提供的地址存储 float64 类型的值。 
    Stind_Ref 存储所提供地址处的对象引用值。 
    Stloc 从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。 
    Stloc_0 从计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表中。 
    Stloc_1 从计算堆栈的顶部弹出当前值并将其存储到索引 1 处的局部变量列表中。 
    Stloc_2 从计算堆栈的顶部弹出当前值并将其存储到索引 2 处的局部变量列表中。 
    Stloc_3 从计算堆栈的顶部弹出当前值并将其存储到索引 3 处的局部变量列表中。 
    Stloc_S 从计算堆栈的顶部弹出当前值并将其存储在局部变量列表中的 index 处(短格式)。 
    Stobj 将指定类型的值从计算堆栈复制到所提供的内存地址中。 
    Stsfld 用来自计算堆栈的值替换静态字段的值。 
    Sub 从其他值中减去一个值并将结果推送到计算堆栈上。 
    Sub_Ovf 从另一值中减去一个整数值,执行溢出检查,并且将结果推送到计算堆栈上。 
    Sub_Ovf_Un 从另一值中减去一个无符号整数值,执行溢出检查,并且将结果推送到计算堆栈上。 
    Switch 实现跳转表。 
    Tailcall 执行后缀的方法调用指令,以便在执行实际调用指令前移除当前方法的堆栈帧。 
    Throw 引发当前位于计算堆栈上的异常对象。 
    Unaligned 指示当前位于计算堆栈上的地址可能没有与紧接的 ldind、stind、ldfld、stfld、ldobj、stobj、initblk 或 cpblk 指令的自然大小对齐。 
    Unbox 将值类型的已装箱的表示形式转换为其未装箱的形式。 
    Volatile 指定当前位于计算堆栈顶部的地址可以是易失的,并且读取该位置的结果不能被缓存,或者对该地址的多个存储区不能被取消。 
    Xor 计算位于计算堆栈顶部的两个值的按位异或,并且将结果推送到计算堆栈上。 公共方法
    Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。 
    GetHashCode(从 Object 继承) 用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。 
    GetType(从 Object 继承) 获取当前实例的 Type。 
    TakesSingleByteArgument 如果提供的操作码采用单字节参数则返回真或假。 
    ToString(从 Object 继承) 返回表示当前 Object 的 String。 受保护的方法
    Finalize(从 Object 继承) 已重写。允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。 
    在 C# 和 C++ 中,使用析构函数语法来表示终结程序。MemberwiseClone(从 Object 继承) 创建当前 Object 的浅表副本。
      

  7.   

    因为if语句需要隐式声明一个bool变量并对其赋值操作...但是这里的所谓“性能”差异根本不值得讨论,关于这点儿“性能”差异无疑是吃得太饱了...
      

  8.   

    我的意思是知道三目运算符效率高就可以了,追究为什么高有什么意义吗?比如有必要追究代码为什么要写成"if...else..."而不写成”假如...其他...“呢?如果要深究,只能去问三目运算符的发明者了。~~
      

  9.   

    就代码上来讲,三目只要执行一排语句,而 if else 要执行 4 排语句。哈哈~~~~
      

  10.   

    1.表達式1:為真的概率 比 表達式2 為真的概率要大的話
    如果你的條件是:||或 && 來結合的話 按如下的寫法:
    if(表達式1||表達式2)
    {
    }
    Else
    {
    }
    If(表達式2&& 表達式1)
    {
    }
    Else
    {
    }
    要比其相應得其它組合的運行效率高些,
    總之 如果條件是以 || 來結合的 那就把為真率高的放在前面
         如果條件是以 && 來結合的  那就把為真率低的放在前面  這樣有助於提高程式運行效率.
      

  11.   

    呵呵 ..
    可能大家平时工作中对于这些小细节不是很关心
    所以觉得大家有时间可以来关注一下
    所以给此帖上了推荐从最近一段时间.NET区提问的问题来看 多数人还是比较浮躁
    能静下心来 想到分析到此帖中提到的二者性能差异的 还是不多见的
      

  12.   

    那麽,我們要了解IL代碼,就要知道了解IL的好處,時間對於每個程序設計師來説都是寶貴的,你必須清楚自己投資的價值再決定投入的成本。對於.NET設計師或程序員來説,IL代碼意味這:
    (1)通用的語言基礎是.NET運行的基礎,當我們對程序的運行結果有異議的時候,如何透過本質看表面,需要我們從底層入手來探索,這時IL是你必須知道的基礎。
    (2)元數據和IL語言是CLR的基礎,了解必要的中間語言是深入認識CLR的捷徑。
    (3)大量的示例分析是以IL來揭密的,因此了解IL是讀懂他人代碼必備基礎,可以給自己更多收穫。
    IL就像是打開.NET内部機制的大門,我們沒有理由放棄一條可以直接通達大門的便捷之路,而盲目地以其他的方式追求深入,無疑會先錯過這扇門。很明顯這些優越性足以誘惑我們花時閒和精力涉獵其中。然而,了解了IL的好處,並不意味著我們應該過分地來關注IL,有人甚至可以洋洋灑灑地寫一堆IL代碼來實現一個簡單的Hello World程序。但是,正如我們知道的那樣,程序設計已經走過了幾十年的發展,純粹陶醉在IL中止步不前,同樣可悲。看見任何代碼都以IL的角度來分析,又將走進另一個誤區,我們的宗旨是追求但不過分。=======摘錄自《你必須知道的.NET》第96頁===========
      

  13.   


    [3] bool CS$4$0000IL_0005: ldloc.1
      IL_0006: ldc.i4.0
      IL_0007: ceq
      IL_0009: ldc.i4.0
      IL_000a: ceq
      IL_000c: stloc.3
      IL_000d: ldloc.3
      IL_000e: brtrue.s IL_0014
      IL_0010: ldc.i4.1
      IL_0011: stloc.0
      IL_0012: br.s IL_0016
      IL_0014: ldc.i4.0
      IL_0015: stloc.0
    (  IL_0016: ldloc.1 )--------------------------------------IL_0016: ldloc.1
      IL_0017: brfalse.s IL_001c
      IL_0019: ldc.i4.0
      IL_001a: br.s IL_001d
      IL_001c: ldc.i4.1
      IL_001d: stloc.2
      

  14.   


    确实。毫秒级的差别,而且又不会量化倍增这种效率差 放弃 if else 是站不住脚的。
      

  15.   

    没深究过 以前一直认为三目运算符高些~~~
    看到网上有的对#include <stdio.h>
    int
    main()
    {
     int a = 1, b = 2, c;
     if(a < b)
      c = a;
     else
      c = b;
     c = a < b ? a : b;
     return 0;
    }
    这段代码研究汇编代码   得出来的结论确是相反的   感觉可能和编译环境有关
    一个是g++得到的   三目的操作少
    另一个是VS下反汇编的得到的  三目的操作反而多
      

  16.   


    一語中的!(差距就在這個隱式bool變量)
    我在2樓中貼出了一段IL,只有通過分析這段IL,才能有憑有据地說出這個結論。
    .method private hidebysig instance void Jin() cil managed
    {
      // Code size 31 (0x1f)
      .maxstack 2
      .locals init ([0] int32 king,
      [1] int32 temp,
      [2] int32 king2,
      [3] bool CS$4$0000)
      IL_0000: nop
      IL_0001: ldc.i4.0
      IL_0002: stloc.0
      IL_0003: ldc.i4.0
      IL_0004: stloc.1
      IL_0005: ldloc.1
      IL_0006: ldc.i4.0
      IL_0007: ceq
      IL_0009: ldc.i4.0
      IL_000a: ceq
      IL_000c: stloc.3
      IL_000d: ldloc.3
      IL_000e: brtrue.s IL_0014
      IL_0010: ldc.i4.1
      IL_0011: stloc.0
      IL_0012: br.s IL_0016
      IL_0014: ldc.i4.0
      IL_0015: stloc.0
      IL_0016: ldloc.1
      IL_0017: brfalse.s IL_001c
      IL_0019: ldc.i4.0
      IL_001a: br.s IL_001d
      IL_001c: ldc.i4.1
      IL_001d: stloc.2
      IL_001e: ret
    } // end of method LvJin::Jin
      

  17.   

    搞这种过于简单的代码去测试是没有意义的,因为有些编译器会在编译的时候会把循环里的无意义的代码给优化掉。或说IF ELSE这种跳转语句对于现代CPU的流水线影响还是蛮大的。
      

  18.   

    啥也不说了 简单的就用三元,复杂的就用ifelse,方便维护 
      

  19.   

    如果纯粹是用于钻研那无话可说.两者间的效率差别不论在什么情况下都不会超过给一个bool变量赋值的时间.可是两者之间的语义可读性呢?有个不成文的规定:正式项目中不允许使用三元运算符,当然仅指我工作过的地方.
      

  20.   

    啥公司还有这规定,有没有规定提交按钮必须用btnSubmit啊。
    据说在C的不同的编译器中三目运算符与if-else的速度快慢也各不相同,这就要看是什么编译器的优化了。
      

  21.   

    就拿C#来说,Linux下if-else与三目运算符的速度谁快谁慢,也是要看编译器优化程序的。
      

  22.   

    根本不会效率高
    三目运算经编译以后与if。。else生成的是一样的
    只是写法不同而已。编译器在编译时会把它转成与if。。else一样来编译
      

  23.   

    .net程序往往一边运行一边编译各种资源,一开始的代码总是要并行地做许多其它底层工作的,你把前后执行次序掉过来试试!
      

  24.   

    从这贴来看 CSDN的很多人有趋向烧饼的走势
      

  25.   

    *****比較if-else與三目運算符的效率*****
    這是第1次測試。
    if-else執行時間是:00:00:00.2980850
    三目運算符執行時間是:00:00:00.3146640
    結論是:if-else效率高,效率比是:1.055618
    這是第2次測試。
    if-else執行時間是:00:00:00.2967013
    三目運算符執行時間是:00:00:00.3218017
    結論是:if-else效率高,效率比是:1.084598
    這是第3次測試。
    if-else執行時間是:00:00:00.2982652
    三目運算符執行時間是:00:00:00.3127492
    結論是:if-else效率高,效率比是:1.048561
    這是第4次測試。
    if-else執行時間是:00:00:00.2945572
    三目運算符執行時間是:00:00:00.3131118
    結論是:if-else效率高,效率比是:1.062991
    這是第5次測試。
    if-else執行時間是:00:00:00.2959158
    三目運算符執行時間是:00:00:00.3128791
    結論是:if-else效率高,效率比是:1.057325
    這是第6次測試。
    if-else執行時間是:00:00:00.2953048
    三目運算符執行時間是:00:00:00.3164421
    結論是:if-else效率高,效率比是:1.071578
    這是第7次測試。
    if-else執行時間是:00:00:00.2967265
    三目運算符執行時間是:00:00:00.3191240
    結論是:if-else效率高,效率比是:1.075482
    這是第8次測試。
    if-else執行時間是:00:00:00.2977990
    三目運算符執行時間是:00:00:00.3252131
    結論是:if-else效率高,效率比是:1.092056
    這是第9次測試。
    if-else執行時間是:00:00:00.2998663
    三目運算符執行時間是:00:00:00.3112348
    結論是:if-else效率高,效率比是:1.037912
    這是第10次測試。
    if-else執行時間是:00:00:00.2958867
    三目運算符執行時間是:00:00:00.3209681
    結論是:if-else效率高,效率比是:1.084767
    這是第11次測試。
    if-else執行時間是:00:00:00.2975353
    三目運算符執行時間是:00:00:00.3125643
    結論是:if-else效率高,效率比是:1.050512
    這是第12次測試。
    if-else執行時間是:00:00:00.2964611
    三目運算符執行時間是:00:00:00.3082606
    結論是:if-else效率高,效率比是:1.039801
    這是第13次測試。
    if-else執行時間是:00:00:00.2998453
    三目運算符執行時間是:00:00:00.3173735
    結論是:if-else效率高,效率比是:1.058457
    這是第14次測試。
    if-else執行時間是:00:00:00.2959563
    三目運算符執行時間是:00:00:00.3090320
    結論是:if-else效率高,效率比是:1.044181
    這是第15次測試。
    if-else執行時間是:00:00:00.2947156
    三目運算符執行時間是:00:00:00.3122807
    結論是:if-else效率高,效率比是:1.0596
    這是第16次測試。
    if-else執行時間是:00:00:00.2953188
    三目運算符執行時間是:00:00:00.3170430
    結論是:if-else效率高,效率比是:1.073562
    這是第17次測試。
    if-else執行時間是:00:00:00.2992732
    三目運算符執行時間是:00:00:00.3093373
    結論是:if-else效率高,效率比是:1.033628
    這是第18次測試。
    if-else執行時間是:00:00:00.2988488
    三目運算符執行時間是:00:00:00.3134473
    結論是:if-else效率高,效率比是:1.048849
    這是第19次測試。
    if-else執行時間是:00:00:00.2970170
    三目運算符執行時間是:00:00:00.3082989
    結論是:if-else效率高,效率比是:1.037984
    *****按下回車鍵關閉窗口*****
      

  26.   

    试了一下,有快有慢...*****比較if-else與三目運算符的效率*****
    這是第1次測試。
    if-else執行時間是:00:00:00.5865641
    三目運算符執行時間是:00:00:00.5465143
    結論是:三目元算符效率高,效率比是:1.073282
    這是第2次測試。
    if-else執行時間是:00:00:00.5467479
    三目運算符執行時間是:00:00:00.5035323
    結論是:三目元算符效率高,效率比是:1.085825
    這是第3次測試。
    if-else執行時間是:00:00:00.5421469
    三目運算符執行時間是:00:00:00.5563927
    結論是:if-else效率高,效率比是:1.026277
    這是第4次測試。
    if-else執行時間是:00:00:00.5618836
    三目運算符執行時間是:00:00:00.5647256
    結論是:if-else效率高,效率比是:1.005058
    這是第5次測試。
    if-else執行時間是:00:00:00.6134296
    三目運算符執行時間是:00:00:00.5420715
    結論是:三目元算符效率高,效率比是:1.13164
    這是第6次測試。
    if-else執行時間是:00:00:00.6268572
    三目運算符執行時間是:00:00:00.5196094
    結論是:三目元算符效率高,效率比是:1.206401
    這是第7次測試。
    if-else執行時間是:00:00:00.6253764
    三目運算符執行時間是:00:00:00.5601221
    結論是:三目元算符效率高,效率比是:1.1165
    這是第8次測試。
    if-else執行時間是:00:00:00.5718210
    三目運算符執行時間是:00:00:00.5748000
    結論是:if-else效率高,效率比是:1.00521
    這是第9次測試。
    if-else執行時間是:00:00:00.6049427
    三目運算符執行時間是:00:00:00.5391202
    結論是:三目元算符效率高,效率比是:1.122092
    這是第10次測試。
    if-else執行時間是:00:00:00.5959451
    三目運算符執行時間是:00:00:00.5438002
    結論是:三目元算符效率高,效率比是:1.09589
    這是第11次測試。
    if-else執行時間是:00:00:00.5608417
    三目運算符執行時間是:00:00:00.5116347
    結論是:三目元算符效率高,效率比是:1.096176
    這是第12次測試。
    if-else執行時間是:00:00:00.6071996
    三目運算符執行時間是:00:00:00.5168767
    結論是:三目元算符效率高,效率比是:1.174747
    這是第13次測試。
    if-else執行時間是:00:00:00.5457763
    三目運算符執行時間是:00:00:00.5193378
    結論是:三目元算符效率高,效率比是:1.050908
    這是第14次測試。
    if-else執行時間是:00:00:00.5649781
    三目運算符執行時間是:00:00:00.5140317
    結論是:三目元算符效率高,效率比是:1.099111
    這是第15次測試。
    if-else執行時間是:00:00:00.5591931
    三目運算符執行時間是:00:00:00.5283344
    結論是:三目元算符效率高,效率比是:1.058408
    這是第16次測試。
    if-else執行時間是:00:00:00.5992742
    三目運算符執行時間是:00:00:00.5424980
    結論是:三目元算符效率高,效率比是:1.104657
    這是第17次測試。
    if-else執行時間是:00:00:00.6005640
    三目運算符執行時間是:00:00:00.6131704
    結論是:if-else效率高,效率比是:1.020991
    這是第18次測試。
    if-else執行時間是:00:00:00.5924647
    三目運算符執行時間是:00:00:00.5352286
    結論是:三目元算符效率高,效率比是:1.106938
    這是第19次測試。
    if-else執行時間是:00:00:00.6226258
    三目運算符執行時間是:00:00:00.5280814
    結論是:三目元算符效率高,效率比是:1.179034
    *****按下回車鍵關閉窗口*****
      

  27.   


    我試過了using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    using System.Diagnostics;
    namespace ConsoleApplication1
    {
        class Program
    {
    static void Main()
    {
    compare();
    } private static void compare()
    {
    Console.WriteLine("*****比較if-else與三目運算符的效率*****");
    for (int j = 1; j < 20; j++)
    {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("這是第" + j + "次測試。");
    Console.ForegroundColor = ConsoleColor.White; Stopwatch time2 = new Stopwatch(); time2.Start();
    for (int i = 0; i < 100000000; i++)
    {
    int temp = 0;
    temp = temp == 0 ? 1 : 0;
    }
    time2.Stop();
    TimeSpan t2 = time2.Elapsed;
    Console.WriteLine("三目運算符執行時間是:" + t2.ToString()); time2.Reset();
    Stopwatch time1 = new Stopwatch(); time1.Start(); for (int i = 0; i < 100000000; i++)
    {
    int temp = 0;
    if (temp == 1)
    temp = 1;
    else
    temp = 0;
    } time1.Stop();
    TimeSpan t1 = time1.Elapsed;
    Console.WriteLine("if-else執行時間是:" + t1.ToString()); time1.Reset(); string conclusion = (t1 < t2) ? "if-else效率高" : "三目元算符效率高";
    float f1 = t1.Ticks;
    float f2 = t2.Ticks;
    float efficiency = (f1 < f2) ? f2 / f1 : f1 / f2;
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("結論是:" + conclusion + ",效率比是:" + efficiency.ToString());
    }
    Console.WriteLine("*****按下回車鍵關閉窗口*****");
    Console.ReadLine();
    }
        }
    }執行結果:
    *****比較if-else與三目運算符的效率*****
    這是第1次測試。
    三目運算符執行時間是:00:00:00.3729799
    if-else執行時間是:00:00:00.4048039
    結論是:三目元算符效率高,效率比是:1.085324
    這是第2次測試。
    三目運算符執行時間是:00:00:00.3732378
    if-else執行時間是:00:00:00.4050782
    結論是:三目元算符效率高,效率比是:1.085309
    這是第3次測試。
    三目運算符執行時間是:00:00:00.3731775
    if-else執行時間是:00:00:00.4059195
    結論是:三目元算符效率高,效率比是:1.087738
    這是第4次測試。
    三目運算符執行時間是:00:00:00.3725375
    if-else執行時間是:00:00:00.4105408
    結論是:三目元算符效率高,效率比是:1.102012
    這是第5次測試。
    三目運算符執行時間是:00:00:00.3728941
    if-else執行時間是:00:00:00.4063272
    結論是:三目元算符效率高,效率比是:1.089658
    這是第6次測試。
    三目運算符執行時間是:00:00:00.3729235
    if-else執行時間是:00:00:00.4073699
    結論是:三目元算符效率高,效率比是:1.092368
    這是第7次測試。
    三目運算符執行時間是:00:00:00.3741234
    if-else執行時間是:00:00:00.4071542
    結論是:三目元算符效率高,效率比是:1.088289
    這是第8次測試。
    三目運算符執行時間是:00:00:00.3757933
    if-else執行時間是:00:00:00.4079853
    結論是:三目元算符效率高,效率比是:1.085664
    這是第9次測試。
    三目運算符執行時間是:00:00:00.3727101
    if-else執行時間是:00:00:00.4053652
    結論是:三目元算符效率高,效率比是:1.087615
    這是第10次測試。
    三目運算符執行時間是:00:00:00.3726303
    if-else執行時間是:00:00:00.4055132
    結論是:三目元算符效率高,效率比是:1.088245
    這是第11次測試。
    三目運算符執行時間是:00:00:00.3725126
    if-else執行時間是:00:00:00.4045227
    結論是:三目元算符效率高,效率比是:1.08593
    這是第12次測試。
    三目運算符執行時間是:00:00:00.3736884
    if-else執行時間是:00:00:00.4066239
    結論是:三目元算符效率高,效率比是:1.088136
    這是第13次測試。
    三目運算符執行時間是:00:00:00.3734258
    if-else執行時間是:00:00:00.4070227
    結論是:三目元算符效率高,效率比是:1.089969
    這是第14次測試。
    三目運算符執行時間是:00:00:00.3725150
    if-else執行時間是:00:00:00.4069392
    結論是:三目元算符效率高,效率比是:1.09241
    這是第15次測試。
    三目運算符執行時間是:00:00:00.3730118
    if-else執行時間是:00:00:00.4057763
    結論是:三目元算符效率高,效率比是:1.087838
    這是第16次測試。
    三目運算符執行時間是:00:00:00.3715184
    if-else執行時間是:00:00:00.4059337
    結論是:三目元算符效率高,效率比是:1.092634
    這是第17次測試。
    三目運算符執行時間是:00:00:00.3731636
    if-else執行時間是:00:00:00.4057730
    結論是:三目元算符效率高,效率比是:1.087386
    這是第18次測試。
    三目運算符執行時間是:00:00:00.3731070
    if-else執行時間是:00:00:00.4060530
    結論是:三目元算符效率高,效率比是:1.088302
    這是第19次測試。
    三目運算符執行時間是:00:00:00.4042471
    if-else執行時間是:00:00:00.4470545
    結論是:三目元算符效率高,效率比是:1.105894
    *****按下回車鍵關閉窗口*****
    =====================
    結論是一樣的:三目運算效率高。
      

  28.   


                        int temp = 0;
                        if (temp == 1)
                            temp = 1;
                        else
                            temp = 0;编译器居然没把这段代码优化掉,真诡异
    再说你这个代码本身写的也有问题,可以优化成
    int temp = 0;
    if (temp != 1)                        
      temp = 0;
      

  29.   

    建议你重新测试
    用这个逻辑 
    Radom r=new Radom();
    int temp = r.next(100);
    if (temp > 50 )  
      temp = 0;
    else
      temp = 1;从上面的IL来说,多一个BOOL变量不应该有8%的性能差异
      

  30.   

    似乎测试的条件有一点点不等价哦
     for (int i = 0; i < 100000000; i++)
                    {
                        int temp = 0;
                if (temp == 1) // if(temp == 0)                   temp = 1;
                        else
                            temp = 0;
                    }
    ...........
    for (int i = 0; i < 100000000; i++)
                    {
                        int temp = 0;
                        temp = temp == 0 ? 1 : 0;
                    }
    ...........
      

  31.   


    我改過來了,代碼如下:using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    using System.Diagnostics;
    namespace ConsoleApplication1
    {
        class Program
    {
    static void Main()
    {
    compare();
    } private static void compare()
    {
    Console.WriteLine("*****比較if-else與三目運算符的效率*****");
    for (int j = 1; j < 20; j++)
    {
    Console.ForegroundColor = ConsoleColor.Yellow;
    Console.WriteLine("這是第" + j + "次測試。");
    Console.ForegroundColor = ConsoleColor.White; Stopwatch time2 = new Stopwatch(); time2.Start();
    for (int i = 0; i < 100000000; i++)
    {
    int temp = 0;
    temp = temp == 0 ? 1 : 0;
    }
    time2.Stop();
    TimeSpan t2 = time2.Elapsed;
    Console.WriteLine("三目運算符執行時間是:" + t2.ToString()); time2.Reset();
    Stopwatch time1 = new Stopwatch(); time1.Start(); for (int i = 0; i < 100000000; i++)
    {
    int temp = 0;
    if (temp == 0)
    temp = 1;
    else
    temp = 0;
    } time1.Stop();
    TimeSpan t1 = time1.Elapsed;
    Console.WriteLine("if-else執行時間是:" + t1.ToString()); time1.Reset(); string conclusion = (t1 < t2) ? "if-else效率高" : "三目元算符效率高";
    float f1 = t1.Ticks;
    float f2 = t2.Ticks;
    float efficiency = (f1 < f2) ? f2 / f1 : f1 / f2;
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("結論是:" + conclusion + ",效率比是:" + efficiency.ToString());
    }
    Console.WriteLine("*****按下回車鍵關閉窗口*****");
    Console.ReadLine();
    }
        }
    }但是測試結論是一樣的:*****比較if-else與三目運算符的效率*****
    這是第1次測試。
    三目運算符執行時間是:00:00:00.3745540
    if-else執行時間是:00:00:00.4095213
    結論是:三目元算符效率高,效率比是:1.093357
    這是第2次測試。
    三目運算符執行時間是:00:00:00.3734115
    if-else執行時間是:00:00:00.4104114
    結論是:三目元算符效率高,效率比是:1.099086
    這是第3次測試。
    三目運算符執行時間是:00:00:00.3726154
    if-else執行時間是:00:00:00.4083870
    結論是:三目元算符效率高,效率比是:1.096001
    這是第4次測試。
    三目運算符執行時間是:00:00:00.3706065
    if-else執行時間是:00:00:00.4172922
    結論是:三目元算符效率高,效率比是:1.125971
    這是第5次測試。
    三目運算符執行時間是:00:00:00.3719411
    if-else執行時間是:00:00:00.4090403
    結論是:三目元算符效率高,效率比是:1.099745
    這是第6次測試。
    三目運算符執行時間是:00:00:00.3700851
    if-else執行時間是:00:00:00.4076994
    結論是:三目元算符效率高,效率比是:1.101637
    這是第7次測試。
    三目運算符執行時間是:00:00:00.3738165
    if-else執行時間是:00:00:00.4081124
    結論是:三目元算符效率高,效率比是:1.091745
    這是第8次測試。
    三目運算符執行時間是:00:00:00.3707002
    if-else執行時間是:00:00:00.4109855
    結論是:三目元算符效率高,效率比是:1.108674
    這是第9次測試。
    三目運算符執行時間是:00:00:00.3714174
    if-else執行時間是:00:00:00.4086975
    結論是:三目元算符效率高,效率比是:1.100373
    這是第10次測試。
    三目運算符執行時間是:00:00:00.3695643
    if-else執行時間是:00:00:00.4075393
    結論是:三目元算符效率高,效率比是:1.102756
    這是第11次測試。
    三目運算符執行時間是:00:00:00.3721613
    if-else執行時間是:00:00:00.4079646
    結論是:三目元算符效率高,效率比是:1.096204
    這是第12次測試。
    三目運算符執行時間是:00:00:00.3707267
    if-else執行時間是:00:00:00.4082541
    結論是:三目元算符效率高,效率比是:1.101227
    這是第13次測試。
    三目運算符執行時間是:00:00:00.3699074
    if-else執行時間是:00:00:00.4093336
    結論是:三目元算符效率高,效率比是:1.106584
    這是第14次測試。
    三目運算符執行時間是:00:00:00.3697894
    if-else執行時間是:00:00:00.4156721
    結論是:三目元算符效率高,效率比是:1.124078
    這是第15次測試。
    三目運算符執行時間是:00:00:00.3703495
    if-else執行時間是:00:00:00.4093667
    結論是:三目元算符效率高,效率比是:1.105352
    這是第16次測試。
    三目運算符執行時間是:00:00:00.3734850
    if-else執行時間是:00:00:00.4108626
    結論是:三目元算符效率高,效率比是:1.100078
    這是第17次測試。
    三目運算符執行時間是:00:00:00.3728530
    if-else執行時間是:00:00:00.4145881
    結論是:三目元算符效率高,效率比是:1.111934
    這是第18次測試。
    三目運算符執行時間是:00:00:00.3732783
    if-else執行時間是:00:00:00.4095246
    結論是:三目元算符效率高,效率比是:1.097103
    這是第19次測試。
    三目運算符執行時間是:00:00:00.3711524
    if-else執行時間是:00:00:00.4105889
    結論是:三目元算符效率高,效率比是:1.106254
    *****按下回車鍵關閉窗口*****