Если оператор в C++

Дорогой шаг скрутки!

я знаю это, если оператор является дорогим оператором в C++. Я помню, что, после того как мой учитель сказал это, если оператор является дорогим оператором в смысле машинного времени.

Теперь мы можем сделать каждую вещь при помощи того, если оператор в C++, таким образом, это - очень мощный оператор в программировании перспективы, но ее дорогого в перспективе машинного времени.

я - новичок, и я изучаю курс структуры данных после введения в курс C++. мой Вопрос Вам
Это лучше, чтобы я использовал если оператор extensivly?

5
задан Janusz 2 February 2010 в 10:02
поделиться

9 ответов

Я не уверен, что вы можете обобщить, что заявление о если это дорого.

Если у вас есть

if ( true ) { ... }

, то это , если , если может быть оптимизировано большинство khakele для вашего компилятора.

Если, с другой стороны, у вас есть ..

if ( veryConvolutedMethodTogGetAnswer() ) { .. }

и метод VeryconvolutedMethodtoggetanswer () делает много работы, вы могли бы утверждать, что это дорого, если заявление, но не из-за Если, но из-за работы вы делаете в процессе принятия решений.

«Если самим не обычно« дорогими »с точки зрения тактовых циклов.

13
ответ дан 18 December 2019 в 05:16
поделиться

Вы должны написать свой код, чтобы он был корректным, простым для понимания и удобным в обслуживании. Если это означает использование утверждений if, используйте их! Мне трудно поверить, что кто-то предложил Вам не использовать утверждение if.

Может быть, ваш инструктор имел в виду, что вы должны избегать чего-то подобного:

if (i == 0) {
    ...
} else if (i == 1) {
    ...
} else if (i == 2) {
    ...
} ...

В таком случае, было бы более логично переосмыслить структуру данных и/или алгоритм, или, по крайней мере, использовать switch/case:

switch (i) {
    case 1: ...; break;
    case 2: ...; break;
    ...;
    default: ...; break;
}

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

Короткий ответ: используйте если , если и только если это имеет смысл!

1
ответ дан 18 December 2019 в 05:16
поделиться

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

FOR EACH i IN container
  IF i < 100
    i = 100
  container.NEXT(i)
END FOR

производительность наиболее определяется контейнером . След (I) ; Это гораздо дороже для связанных списков, то это для смежных массивов. Для связанных списков это принимает дополнительный доступ к памяти, который в зависимости от кэша (ы) может принимать где-то между 2,5 нс и 250 нс. Стоимость , если утверждение будет измерено в долях наносекунда.

0
ответ дан 18 December 2019 в 05:16
поделиться

По машинному времени утверждение "если" само по себе является одним из самых дешевых утверждений.

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

0
ответ дан 18 December 2019 в 05:16
поделиться

Вы можете использовать переключатель вместо него, что делает его более читабельным, но я не использую, если он быстрее. Если у вас есть что-то вроде :

if (condition1) {
   // do something
} else if (condition2) {
   // do something
} else if (condition3) { 
   // do something
} else if (condition4) { 
   // do something
}

Я не то, что можно сделать, чтобы ускорить его. если условие4 встречается чаще, вы можете переместить его в верхнюю часть.

0
ответ дан 18 December 2019 в 05:16
поделиться

Я бы сказал много , если бы заявление было дорогостоящим с точки зрения ремонтопригодности.

5
ответ дан 18 December 2019 в 05:16
поделиться

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

Операторы If могут быть дорогостоящими, поскольку заставляют компилятор генерировать инструкции перехода. Если вы можете найти способ закодировать ту же логику таким образом, чтобы компилятору вообще не приходилось выполнять ветвление, код, вероятно, будет намного быстрее, даже если общее количество инструкций будет больше. Я помню, как был невероятно удивлен тем, как перекодирование короткого фрагмента кода для использования различных битовых манипуляций вместо выполнения каких-либо ветвлений ускорило его в 10-20%.

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

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

7
ответ дан 18 December 2019 в 05:16
поделиться

If-состояние подразумевает условную ветвь, которая может быть немного дороже, чем код, не содержащий ветви.

В качестве примера подсчета, сколько раз условие истинно (например, сколько чисел в векторе больше 10000):

for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); it != end; ++it) {
    //if (*it > 10000) ++count; 
    count += *it > 10000;
}

Версия, которая просто добавляет 1 или 0 к бегущему итогу, может быть немного быстрее (я пробовал с 100 миллионами чисел, прежде чем смог разглядеть разницу).

Однако, с MinGW 3.4.5, использование выделенного стандартного алгоритма оказывается заметно быстрее:

count = std::count_if(v.begin(), v.end(), std::bind2nd(std::greater<int>(), 10000));

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

Другое место, где часто можно избежать оценки сложных условий - это использование таблиц поиска (эмпирическое правило: алгоритмы часто могут быть сделаны быстрее, если позволить им использовать больше памяти). Например, подсчет гласных (aeiou) в списке слов, где можно избежать ветвления и вычисления нескольких условий:

unsigned char letters[256] = {0};
letters['a'] = letters['e'] = letters['i'] = letters['o'] = letters['u'] = 1; 

for (std::vector<std::string>::const_iterator it = words.begin(), end = words.end(); it != end; ++it) {
    for (std::string::const_iterator w_it = it->begin(), w_end = it->end(); w_it != w_end; ++w_it) {
        unsigned char c = *w_it;
        /*if (c == 'e' || c == 'a' || c == 'i' || c == 'o' || c == 'u') {
            ++count;
        }*/
        count += letters[c];
    }
} 
2
ответ дан 18 December 2019 в 05:16
поделиться

Операторы If компилируются в условную ветвь . Это означает, что процессор должен перейти (или нет) к другой строке кода, в зависимости от условия. В простом процессоре это может вызвать остановку конвейера , что с точки зрения непрофессионала означает, что процессор должен отказаться от работы, которую он сделал раньше, что тратит время на сборочную линию. Однако современные процессоры используют предсказание ветвлений , чтобы избежать остановок, поэтому операторы if становятся менее затратными.

В общем, да, они могут быть дорогими. Нет, вообще не стоит об этом беспокоиться. Но Николай поднимает отдельный (хотя и не менее значимый) момент. Полиморфный код часто предпочтительнее (для удобства обслуживания), чем операторы if или case

17
ответ дан 18 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: