Какой метод проверки, чем установка значения, является наиболее оптимальным? - PullRequest
0 голосов
/ 30 мая 2019

Это мой первый пост о переполнении стека за 7 лет работы программистом ... и у меня довольно глупый вопрос.Что является более эффективным между этими двумя?Компилятор C ++ или C # автоматически оптимизирует его и, если да, на что он изменится?

if(a) b=a

if(a) b=true

1 Ответ

0 голосов
/ 30 мая 2019

В C # в режиме выпуска они оба компилируются в один и тот же IL

.class private auto ansi '<Module>'
{
} // end of class <Module>

.class public auto ansi beforefieldinit C
    extends [mscorlib]System.Object
{
    // Methods
    .method public hidebysig 
        instance void M (
            bool a
        ) cil managed 
    {
        // Method begins at RVA 0x2050
        // Code size 3 (0x3)
        .maxstack 8

        IL_0000: ldarg.1
        IL_0001: pop
        IL_0002: ret
    } // end of method C::M

    .method public hidebysig specialname rtspecialname 
        instance void .ctor () cil managed 
    {
        // Method begins at RVA 0x2054
        // Code size 7 (0x7)
        .maxstack 8

        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    } // end of method C::.ctor

} // end of class C

В конфигурации отладки у вас есть небольшая разница между b==a one (устранение шума); см. строку IL_0006.

// Methods
.method public hidebysig 
    instance void M (
        bool a
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 9 (0x9)
    .maxstack 1
    .locals init (
        [0] bool,
        [1] bool
    )

    IL_0000: nop
    IL_0001: ldarg.1
    IL_0002: stloc.1
    // sequence point: hidden
    IL_0003: ldloc.1
    IL_0004: brfalse.s IL_0008

    IL_0006: ldarg.1
    IL_0007: stloc.0

    IL_0008: ret
} // end of method C::M

и b == истинная версия

// Methods
.method public hidebysig 
    instance void M (
        bool a
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 9 (0x9)
    .maxstack 1
    .locals init (
        [0] bool,
        [1] bool
    )

    IL_0000: nop
    IL_0001: ldarg.1
    IL_0002: stloc.1
    // sequence point: hidden
    IL_0003: ldloc.1
    IL_0004: brfalse.s IL_0008

    IL_0006: ldc.i4.1
    IL_0007: stloc.0

    IL_0008: ret
} // end of method C::M

На практике я хотел бы сравнить ваши точные показатели, прежде чем беспокоиться о такой микрооптимизации. Вряд ли это будет лучшим значением для вашего времени, потраченного на оптимизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...