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

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

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

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

11.04.2013, 15:38. Просмотров 2208. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что быстрее, операция присваивания или сравнения? (C++):

Какая операция быстрее, постинкремент, или преинкремент? - C++
какая операция быстрее: постинкремент, или преинкремент? и почему? как их можно записать на ассемблере?

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

операция присваивания - C++
Столкнулся с глупой проблемой, может кто объяснить, как в таком случае делается присваивание и в чем у меня ошибка? int a=1, b=2, c=3,...

Операция присваивания (=) - C++
Добрый день, интересует вот что: правильно ли я считаю, что в int x = .0 + 1F + 4L; 1) Сперва все операнды сложения (по правую...

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

Что быстрее assembler или c++ - C++
Вопрос от новичка. Что будет быстрее по скорости выполнения и на сколько: 1) сложить a+b на C++ или на assembler 2) умножить a*b на C++...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13227 / 7499 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
11.04.2013, 15:44 #2
Скорость сравнений и присваиваний

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

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

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

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

А Вы думаете у Вас тут нет сравнения?
Извиняюсь за некоректно поставленный вопрос. Я не настолько глуп как вы наверное подумали) я знаю что он тут есть, и в моей программе именно сейчас так и стоит, вопрос в том, нужны ли эти сравнения перед присваиванием, может проще их убрать?
C++
1
if (!chenged)
Вот эта строка нужна?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
77 / 77 / 16
Регистрация: 22.09.2012
Сообщений: 470
11.04.2013, 17:39  [ТС] #6
Спасибо за совет
0
taras atavin
Ушёл с форума.
3569 / 1753 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
11.04.2013, 17:50 #7
Сравнивать присваивание со сравнением имело бы смысл при оптимизации сортировки, если есть два варианта алгоритма, в которых общее число операций одинаково, но в одном больше сравнений, а в другом перестановок, в этом же случае сравнить надо не присваивание со сравнением, а присваивание с присваиванием и сравнением, так как с высокой степенью вероятности присваивание окажется востребованным. И я даже представить себе не могу, как можно сократить количество сравнений в ущерб перестановкам.

Добавлено через 1 минуту
Разумеется, две операции медленнее одной.
1
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2013, 19:00
Привет! Вот еще темы с ответами:

If или switch().case. Что быстрее - C++
Есть два кода. Первый: if(a == 2) a += 2; if(a == 3) a+= 3; if(a == 4) a+=4; Второй:

Что быстрее списки или вектор ? - C++
Всем привет. Делаю приложение и очень важна скорость обработки данных, а нужно хранить динамические массивы. В каком формате будет...

Что быстрее массив или файл - C++
Привет! Я тут занялся обработкой содержимого текстовых файлов для этого пишу класс отслеживающий положение курсора в файле (типа номер...

Конструктор копирования и операция присваивания в классе - C++
Народ, вот есть такие объявления(motto - объект класса StringBad): StringBad ditto(motto); StringBad metoo = motto; StringBad...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.04.2013, 19:00
Ответ Создать тему
Опции темы

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