Какой язык быстрее?

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Какой язык быстрее?

Сообщение NT » 21 янв 2014, 09:35

geh писал(а):Source of the post Замена числа 2000000000 на COUNT на скорости программы никак не сказывается.
Ну этот COUNT, только к стилю (культуре) программирования относится.
Вас же folk этому учил - переменные, которые можно будет использовать в различных местах программы описывать через #define - как постоянные.
Последний раз редактировалось NT 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Какой язык быстрее?

Сообщение folk » 21 янв 2014, 10:54

NT писал(а):Source of the post описывать через #define - как постоянные.

Либо использовать в C++ конструкцию const (которая в С отсутствует)
Остается правда вопрос что дешевле const или #define - const теоретически в памяти программы будет один раз (компилятор имеет право по своему усмотрению использовать - может и клонировать), а #define будет в каждом использовании свой (умный компилятор правда тоже может свернуть к одному образу в памяти).
Последний раз редактировалось folk 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Какой язык быстрее?

Сообщение geh » 21 янв 2014, 11:03

Мне крайне интересно.
Зачем компилятору клонировать const??
Это расточительно! У Си что, много лишней памяти?!!
Последний раз редактировалось geh 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Какой язык быстрее?

Сообщение kiv » 21 янв 2014, 11:14

NT писал(а):Source of the post
Вас же folk этому учил - переменные, которые можно будет использовать в различных местах программы описывать через #define - как постоянные.


Еще лучше - в C++ - объявлять как const.

Код: Выбрать все

const int COUNT = 20000000;


Представьте серьезный код, да еще в нескольких файлах, да еще, например, в одном месте

Код: Выбрать все

for(int i = 1; i < 100; ++i)


а в другом

Код: Выбрать все

for(int i = 1; i <= 99; ++i)


Вы сможете потом реально изменить все 100 на 150, и еще сообразить, что 99 - это не 99, а 100-1?

а вот так - запросто:

Код: Выбрать все

const int COUNT = 100;
for(int i = 1; i < COUNT; ++i)

...

for(int i = 1; i <= COUNT-1; ++i)


Кстати, на якобы лишнее вычисление - COUNT-1 - обращать внимание не надо, такие вещи вычисляются еще компилятором.

P.S. N T, это я не вам разъясняю, а вашу мысль

geh писал(а):Source of the post
Мне крайне интересно.
Зачем компилятору клонировать const??
Это расточительно! У Си что, много лишней памяти?!!


Что значит "клонировать const"? Даже если это была бы реальная переменная - она же одна на всю программу...

Кстати, обычно const компилятор заменяет просто непосредственным значением...
Последний раз редактировалось kiv 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Какой язык быстрее?

Сообщение geh » 21 янв 2014, 11:26

Kiv, я понял, если какое-либо число встречается в программе только один раз, то константа не нужна. А если много раз и предполагается, что могут быть в программе изменения, то лучше ввести константу. Но есть одно Но. А зачем вводить константу, если я просто введу переменную и присвою ей нужное значение. Я ведь тут ничего не теряю. Или теряю??
Последний раз редактировалось geh 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Какой язык быстрее?

Сообщение kiv » 21 янв 2014, 11:31

geh писал(а):Source of the post
Kiv, я понял, если какое-либо число встречается в программе только один раз, то константа не нужна. А если много раз и предполагается, что могут быть в программе изменения, то лучше ввести константу. Но есть одно Но. А зачем вводить константу, если я просто введу переменную и присвою ей нужное значение. Я ведь тут ничего не теряю. Или теряю??


1. Можно. Но вы уверены, что легко ее найдете? или что вам она через месяц не понадобится во второй раз в другом месте? А так вы ее выносите в файл заголовка, комментируете и капитально облегчаете жизнь себе и другим...

2. Опять же можно. Но тем самым вы говорите компилятору, что можете ее изменить, так что

Код: Выбрать все

const int YES = 1;
if (YES) { do1; } else {do2; }


компилятор воспримет просто как


а

Код: Выбрать все

int YES = 1;
if (YES) { do1; } else {do2; }


именно так, как и написано, с генерацией кода проверки значения YES и кодов как do1, так и do2...

У меня часто встречается что-то типа

Код: Выбрать все

const bool debugPrint = true;

...

if (debugPrint) { ....... }


Отладил - можно все и не убирать, исправить true на false, и весь отладочный вывод пропадет ВООБЩЕ, в готовом файле просто в принципе не будет ни кода вывода, ни выводимых строк...
Последний раз редактировалось kiv 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

geh
Сообщений: 224
Зарегистрирован: 09 дек 2013, 21:00

Какой язык быстрее?

Сообщение geh » 21 янв 2014, 11:44

Kiv, спасибо!! Я все понял, ведь константу я не изменю, даже если сильно захочу.
Потом их как правило немного в отличие от переменных.
Последний раз редактировалось geh 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Какой язык быстрее?

Сообщение folk » 21 янв 2014, 13:39

geh писал(а):Source of the post
Зачем компилятору клонировать const??
Это расточительно! У Си что, много лишней памяти?!!

В С нет такой штуки как const поэтому используется препроцессор #define
Препроцессор это практически отдельная программа которая натравливается на t.c и выдает t.i
в котором произведены все подстановки #include , #define, и так далее - то есть получился уже другой текст программы. Соответственно все места где вы используете #define будут иметь подставленную в текст константу.
Хорошо это или плохо - однозначно не скажешь. Если эта константа может использоваться как immediate (то есть кодироваться прямо в инструкции) то вроде как и не плохо. Если не может то возникнут те самые копии (может конечно компилятор поймет - но не факт). Но иногда хочется чтобы константа лежала строго по адресу - чтобы ее можно было подправить во время выполнения в одном месте при отладке например.
Тогда мы делаем в C++
const volatile c=33;
Но теперь то что говорил Kiv уже неприменимо - компилятор не знает какое значение у этой константы (оно может меняться во время работы) и должен каждый раз подглядывать в то место где лежит в памяти значение. Сделано это для регистров аппаратуры которые меняются вне воли программы.
Последний раз редактировалось folk 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

СергейП
Сообщений: 4145
Зарегистрирован: 17 июл 2009, 21:00

Какой язык быстрее?

Сообщение СергейП » 21 янв 2014, 13:59

folk писал(а):Source of the post ...
Но иногда хочется чтобы константа лежала строго по адресу - чтобы ее можно было подправить во время выполнения ...
Ой-ё-ёй
Тут в паре тем ТС-а мягко и ненавязчиво подводят к структурным методам, прививают культуру программирования, на языки приличные ориентируют и т.п.
И вдруг бац - и такое предложение, это что - его в вирусописатели ориентировать хотите?
Последний раз редактировалось СергейП 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Какой язык быстрее?

Сообщение folk » 21 янв 2014, 14:13

СергейП писал(а):Source of the post И вдруг бац - и такое предложение, это что - его в вирусописатели ориентировать хотите?

Да поспешил однако.. Драйверы там и отладка на самом деле тоже нужны. Но понимать где лежат переменные (const, static, auto переменные классов, статические переменные, как передаются параметры, что такое стек и регистры) все равно полезно - хотя бы чтобы избежать ошибок (как пример недавно был race condition в pthread_create).
Последний раз редактировалось folk 27 ноя 2019, 21:37, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 0 гостей