C# tiene un conditional operator y las declaraciones IF y sospechaba que el operador condicional sería azúcar sintáctica. Entonces, en tiempo de compilación tendría el mismo efecto que una operación IF.¿Por qué tal diferencia en IL entre IF y el operador condicional?
Sin embargo no lo hacen (ver a continuación), sí tienen IL diferente. Tratando de entenderlo y la suposición que tengo es que esta es una optimización del rendimiento que obtiene el operador condicional porque tiene un alcance limitado.
Me gustaría saber si mi suposición es correcta o no, y tal vez si hay más en esto?
También en la IL del IF hay algunas comprobaciones (L_000c, L_000d, L_000f) alrededor de valores int que no puedo entender el significado. Esto es lo que me ha llevado a pensar que esta es una solución más robusta, a costa del rendimiento debido a su mayor alcance.
Código de SI
var result = "";
if (Environment.Is64BitOperatingSystem)
{
result = "Yes";
}
else
{
result = "No";
}
Console.WriteLine(result);
Código de operador condicional (Me doy cuenta de las diferencias, pero no importa cómo lo cambio - Asignar a la variable etc ... hace muy poca diferencia)
Console.WriteLine("Is the OS x64? {0}", Environment.Is64BitOperatingSystem ? "Yes" : "No");
IL para IF
L_0001: ldstr ""
L_0006: stloc.0
L_0007: call bool [mscorlib]System.Environment::get_Is64BitOperatingSystem()
L_000c: ldc.i4.0
L_000d: ceq
L_000f: stloc.2
L_0010: ldloc.2
L_0011: brtrue.s L_001d
L_0013: nop
L_0014: ldstr "Yes"
L_0019: stloc.0
L_001a: nop
L_001b: br.s L_0025
L_001d: nop
L_001e: ldstr "No"
L_0023: stloc.0
L_0024: nop
L_0025: ldloc.0
L_0026: call void [mscorlib]System.Console::WriteLine(string)
IL f o condicional
L_002c: ldstr "Is the OS x64? {0}"
L_0031: call bool [mscorlib]System.Environment::get_Is64BitOperatingSystem()
L_0036: brtrue.s L_003f
L_0038: ldstr "No"
L_003d: br.s L_0044
L_003f: ldstr "Yes"
L_0044: call void [mscorlib]System.Console::WriteLine(string, object)
Solo para estar seguro: ¿Está compilando en modo Release (Los NOP hacen que se vea como el Modo de depuración a primera vista)? En el modo de depuración, el compilador no realiza todas las optimizaciones para facilitar la depuración. –
¿Este es el modo de depuración o versión? Los "nop" intercalados se usan para puntos de ruptura, hasta donde yo sé. –
¿Ambos están en modo de lanzamiento? –