2015-06-19 3 views
-3

Пожалуйста, помогите проверить эффективность между двумя блочными кодами ниже. Я не могу думать, что оба они одинаковы во время выполнения (см. Элемент фигуры и одно и то же условие).Проверка соответствия между if (false) {} else {if (false) {}} и if (false) {} else if (false) {}

 
// Block I 
    if(condition1) 
    { 
     // Do something 
    } 
    else 
    { if(condition2) 
     { 
      // Do something 
     } 
     else 
     { if(condition3) 
      { 
       // Do something 
      } 
      else 
      { if(condition4) 
       { 
        // Do something 
       } 
      } 
     } 
    } 

    //-------------------------------- 
    // Block II 
    if(condition1) 
    { 
     // Do something 
    } 
    else if(condition2) 
    { 
     // Do something 
    } 
    else if(condition3) 
    { 
     // Do something 
    } 
    else if(condition4) 
    { 
     // Do something 
    } 

Помогите мне!

+0

Поставьте регистраторов и проверьте .. –

+0

Почему, по вашему мнению, добавление брекетов может иметь значение? –

+0

Я считаю это преждевременной оптимизацией, которую вы не должны делать, если у вас действительно нет проблемы с производительностью (https://en.wikipedia.org/wiki/Program_optimization). Кроме того, вы можете подумать, что, скорее всего, компилятор преобразует его в один из параметров (компилятор также оптимизирует). У вас будет десятка других мест, где вы сможете выиграть больше производительности, чем вы можете сделать здесь. Если вы работаете в некоторой виртуальной машине, ваша виртуальная машина даже может выполнять оптимизацию во время выполнения, в зависимости от ваших фактических потоков данных. – philnate

ответ

1

Предполагая язык является C (вы не указали), то вы можете убедиться, что ваши два сниппеты генерировать точно тот же код, сравнивая выходной сборки НКУ:

#!/bin/bash 
diff <(gcc -O0 -S -o - -x c - <<EOF 
extern int condition1(); 
extern int condition2(); 
extern int condition3(); 
extern int condition4(); 
extern void do_something1(); 
extern void do_something2(); 
extern void do_something3(); 
extern void do_something4(); 

void main() { 
    if(condition1()) 
    { 
     do_something1(); 
    } 
    else 
    { if(condition2()) 
     { 
      do_something2(); 
     } 
     else 
     { if(condition3()) 
      { 
       do_something3(); 
      } 
      else 
      { if(condition4()) 
       { 
        do_something4(); 
       } 
      } 
     } 
    } 
} 
EOF 
) <(
gcc -O0 -S -o - -x c - <<EOF 
extern int condition1(); 
extern int condition2(); 
extern int condition3(); 
extern int condition4(); 
extern void do_something1(); 
extern void do_something2(); 
extern void do_something3(); 
extern void do_something4(); 

void main() { 
    if(condition1()) 
    { 
     do_something1(); 
    } 
    else if(condition2()) 
    { 
     do_something2(); 
    } 
    else if(condition3()) 
    { 
     do_something3(); 
    } 
    else if(condition4()) 
    { 
     do_something4(); 
    } 
} 
EOF 
) 

Это создает NO вывода (вы можете доказать, что тест действителен (например), удалив последнее условие из одной из функций и наблюдая, что теперь он показывает разницу).

Поскольку выход для ассемблера идентичен для двух блоков, вы можете определить, что характеристики производительности должны быть одинаковыми.