Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 440
#1

Что быстрее, операция присваивания или сравнения? - C++

11.04.2013, 15:38. Просмотров 2055. Ответов 7
Метки нет (Все метки)

Всем доброго времени суток, такой вод у меня дурацкий вопрос сидит в голове, "Что быстрее, операция присваивания или сравнения?". Вот конкретная задача, почему я это спрашиваю: Пишу приложение в Builder, на форме есть несколько edit-ов, храню булевскую переменную, у которой устанавливаю значение в true если на каком-либо из edit-ов произошло событие onchenge, перед тем как присвоить, я сравниваю, если он уже true, то тогда я операцию присваивания не делаю. Вопрос, нужно ли сравнивать? Правильно ли будет с точки зрения "грамотности" просто присваивать значение, если оно уже и так true?
Приведу пример, чтобы был более понятен вопрос:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
FormPrimer
bool chenged = false;
 
void edit1onchenge(void)
{
   if (!chenged)
     chenged=true;
}
void edit2onchenge(void)
{
   if (!chenged)
     chenged=true;
}
void edit3onchenge(void)
{
   if (!chenged)
     chenged=true;
}
Пример написал условно, прошу не придираться) Так вот, нужно ли в такой ситуации ставить операцию сравнения или нет? Может проще просто сразу присваивать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 15:38     Что быстрее, операция присваивания или сравнения?
Посмотрите здесь:

Что быстрее массив или файл C++
Какая операция быстрее, постинкремент, или преинкремент? C++
Операция присваивания C++
C++ Правильно сделана перегруженная операция присваивания?
Атомарна ли операция присваивания в однопроцессорной машине? C++
операция присваивания C++
Что быстрее - двоичный или текстовый файл? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
12876 / 7262 / 810
Регистрация: 27.09.2012
Сообщений: 17,937
Записей в блоге: 2
Завершенные тесты: 1
11.04.2013, 15:44     Что быстрее, операция присваивания или сравнения? #2
Скорость сравнений и присваиваний

Добавлено через 1 минуту
Цитата Сообщение от skorik-1992 Посмотреть сообщение
Так вот, нужно ли в такой ситуации ставить операцию сравнения или нет?
А Вы думаете у Вас тут нет сравнения?
abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
11.04.2013, 15:47     Что быстрее, операция присваивания или сравнения? #3
А Вы думаете у Вас тут нет сравнения?
она есть и выполняется всегда, а вот присвоение не всегда, это и есть я так понял вопрос автора...

вообще сравнение и тем более на не-ноль jnz/test быстрее чем mov [mem],1 с точки зрения ассемблерного представления, но это ни о чём не говорит в общем случае - т.к. компилятор языка вполне различные конструкции может оптимизировать до неузноваемости

p.s. я бы оставил код как есть, вполне грамотный
dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 440
11.04.2013, 15:47  [ТС]     Что быстрее, операция присваивания или сравнения? #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Скорость сравнений и присваиваний

Добавлено через 1 минуту

А Вы думаете у Вас тут нет сравнения?
Извиняюсь за некоректно поставленный вопрос. Я не настолько глуп как вы наверное подумали) я знаю что он тут есть, и в моей программе именно сейчас так и стоит, вопрос в том, нужны ли эти сравнения перед присваиванием, может проще их убрать?
C++
1
if (!chenged)
Вот эта строка нужна?
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
11.04.2013, 17:38     Что быстрее, операция присваивания или сравнения? #5
Цитата Сообщение от abit Посмотреть сообщение
вообще сравнение и тем более на не-ноль jnz/test быстрее чем mov [mem],1 с точки зрения ассемблерного представления
jnz - это не сравнение, а условный переход (jump if not zero, переход если флаг ZF не выставлен). Сравнение, как правило, выполняется до jnz.
И почему "тем более"? инструкции jcc выполняются за одинаковое время.

По сабжу - вариант без if'а (т.е. просто присваивание) будет быстрее. Т.к. с условным переходом, помимо всего прочего, еще будет задействовано предсказание переходов, которое может тормозить процессор сильнее, чем простое присваивание.
dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 440
11.04.2013, 17:39  [ТС]     Что быстрее, операция присваивания или сравнения? #6
Спасибо за совет
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.04.2013, 17:50     Что быстрее, операция присваивания или сравнения? #7
Сравнивать присваивание со сравнением имело бы смысл при оптимизации сортировки, если есть два варианта алгоритма, в которых общее число операций одинаково, но в одном больше сравнений, а в другом перестановок, в этом же случае сравнить надо не присваивание со сравнением, а присваивание с присваиванием и сравнением, так как с высокой степенью вероятности присваивание окажется востребованным. И я даже представить себе не могу, как можно сократить количество сравнений в ущерб перестановкам.

Добавлено через 1 минуту
Разумеется, две операции медленнее одной.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 19:00     Что быстрее, операция присваивания или сравнения?
Еще ссылки по теме:

Что быстрее assembler или c++ C++
If или switch().case. Что быстрее C++
C++ Что быстрее: i++ или ++i ?
C++ Операция присваивания (=)
Конструктор копирования и операция присваивания в классе C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
11.04.2013, 19:00     Что быстрее, операция присваивания или сравнения? #8
Короче заинтересовался я данным вопросом. Эксперементы ставил вот на таком коде
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
bool b;
 
void f ()
{
    if (!b) b = true;
}
 
int main()
{
    std::cin >> b; // ручной ввод нужен, чтоб компилятор вообще все не выкинул
    f();
 
    return 0;
}
комплировал в студийном компиляторе с ключом \О2 и в MinGW с ключами -О2 и -О3 по очереди. Я, честно говоря, ожидал, что компилятор оптимизирует
C++
1
if (!b) b = true;
до
C++
1
b = true;
но ни один этого не сделал. Только функцию заинлайнили.
Возможно компилятор не смог уловить логику, т.е. что в любом случае b равно true, поэтому не оптимизировал до присваивания.
Кстати студийный компилятор вообще убрал условный переход и заюзал "тяжелую" инструкцию cmovz после test.
Yandex
Объявления
11.04.2013, 19:00     Что быстрее, операция присваивания или сравнения?
Ответ Создать тему
Опции темы

Текущее время: 18:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru