Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
dalay_lama
79 / 79 / 50
Регистрация: 22.09.2012
Сообщений: 493
1

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

11.04.2013, 15:38. Просмотров 2911. Ответов 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;
}
Пример написал условно, прошу не придираться) Так вот, нужно ли в такой ситуации ставить операцию сравнения или нет? Может проще просто сразу присваивать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2013, 15:38
Ответы с готовыми решениями:

Какая операция быстрее, постинкремент, или преинкремент?
какая операция быстрее: постинкремент, или преинкремент? и почему? как их...

операция присваивания
Столкнулся с глупой проблемой, может кто объяснить, как в таком случае делается...

Операция присваивания
Чем отличается операция присваивания "/=" от "=" ?

Операция присваивания
Вот что говорится в хелпе про составное присванивание. Форма e1 op= e2 ведет...

Операция присваивания (=)
Добрый день, интересует вот что: правильно ли я считаю, что в int x = .0 +...

7
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,582
Записей в блоге: 2
Завершенные тесты: 1
11.04.2013, 15:44 2
Скорость сравнений и присваиваний

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

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

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

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

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

По сабжу - вариант без if'а (т.е. просто присваивание) будет быстрее. Т.к. с условным переходом, помимо всего прочего, еще будет задействовано предсказание переходов, которое может тормозить процессор сильнее, чем простое присваивание.
2
dalay_lama
79 / 79 / 50
Регистрация: 22.09.2012
Сообщений: 493
11.04.2013, 17:39  [ТС] 6
Спасибо за совет
0
taras atavin
4204 / 1767 / 211
Регистрация: 24.11.2009
Сообщений: 27,565
11.04.2013, 17:50 7
Сравнивать присваивание со сравнением имело бы смысл при оптимизации сортировки, если есть два варианта алгоритма, в которых общее число операций одинаково, но в одном больше сравнений, а в другом перестановок, в этом же случае сравнить надо не присваивание со сравнением, а присваивание с присваиванием и сравнением, так как с высокой степенью вероятности присваивание окажется востребованным. И я даже представить себе не могу, как можно сократить количество сравнений в ущерб перестановкам.

Добавлено через 1 минуту
Разумеется, две операции медленнее одной.
1
Kastaneda
Jesus loves me
Эксперт С++
4940 / 3016 / 346
Регистрация: 12.12.2009
Сообщений: 7,612
Записей в блоге: 2
Завершенные тесты: 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.
1
11.04.2013, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 19:00

Что быстрее: i++ или ++i ?
Только что прочитала в интернете, что префиксный итератор быстрее, чем...

Что быстрее assembler или c++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1)...

Преобразование типов в операция присваивания
Добрый вечер, форумчане. Я новичок в программировании, изучаю C++. Читаю книгу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru