Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Какой из двух кусков кода оптимальней?

1.8K
16 апреля 2008 года
Валериус
190 / / 14.07.2006
Вопрос не столько практически необходимый, сколько интереcный теоретически.

Какой из двух кусков кода оптимальней?

 
Код:
top := number shr 1;
for i := 2 to top do
    begin
    {bla-bla}
    end;


 
Код:
for i := 2 to (number shr 1) do
    begin
    {bla-bla}
    end;
276
16 апреля 2008 года
Rebbit
1.1K / / 01.08.2005
Если number в цикле не меняется и компилятор грамотно соптимизирует то один фиг.
Если number в цикле меняется то конечно первый вариант быстрее но он становится совсем бесполезным. (Правда если компилятор совсем тупой то он может соптимизировать второй вариант чтоб было как в первом и тут у тебя уже проблемы :) и чтото мне припоминается-мерещется что на паскале так и будет правда я не уверен)
Предлагаю поекспериментировать изменяя number в цыкле и посмотреть самому.
1.9K
16 апреля 2008 года
andriano
474 / / 10.01.2008
Очевидно первый, т.к. второй содержит синтаксическую ошибку.
Если ошибку испроавить, то одинаково.
1.8K
17 апреля 2008 года
Валериус
190 / / 14.07.2006
ой... :)

И всё таки. В первом варианте один раз выполняется сдвиг (то бишь целочисленное деление на два), заносится в переменную в памяти и потом много-много раз значение из этой памяти считывается. Во втором же случае просто много-много раз выполняется сдвиг. И вот на уровне машинных кодов что быстрее - считывание из памяти или сдвиг?
1.9K
17 апреля 2008 года
andriano
474 / / 10.01.2008
Во втором случае сдвиг тоже выполняется один раз.
Чтение из основного объема оперативной памяти в десятки, а то и сотню раз медленнее, чем сдвиг. Из кэш-памяти - быстрее, чем из основной, но все равно медленнее, чем внутрипроцессорные операции.
1.8K
18 апреля 2008 года
Валериус
190 / / 14.07.2006
Цитата: andriano
Во втором случае сдвиг тоже выполняется один раз.


А от компилятора это зависит? Или так в спецификации написано?

274
18 апреля 2008 года
Lone Wolf
1.3K / / 26.11.2006
почему-то мне кажетсо, что каждый раз будет... ведь в случае изменения number в цикле, вічисление один раз являетсо - неверным.
Но можно проверить например, написав функцию которая это делает сдвиг и возвращает результат. а также, изменяет некую глобальную переменну счетчик, и посмотреть сколько раз она зайдет туда.
5.3K
18 апреля 2008 года
Somebody
185 / / 24.12.2006
То, что после to, вычисляется один раз, перед выполнением цикла. И это бывает иногда хорошо, иногда плохо. Но чаще хорошо, так как сто раз одно и то же не вычисляется, а если переменная изменяется в цикле - для этого есть while и repeat.
1.9K
18 апреля 2008 года
andriano
474 / / 10.01.2008
number в теле цикла изменяться не должен. По определению.
Если изменяется - программа составлена неверно и результат работы такой программы неопределен.
Исходя из этого, все параметры, задающие цикл, вычисляются до его начала и в дальнейшем не перевычисляются.
И, кстати, это ВСЕГДА хорошо. Т.к. гарантирует оптимальную работу любой правильно составленной программы.
9.4K
18 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: andriano
Исходя из этого, все параметры, задающие цикл, вычисляются до его начала и в дальнейшем не перевычисляются.
И, кстати, это ВСЕГДА хорошо.



Согласен, но если вспомнить еще TP под DOS, там можно было в цикле изменить сам счетчик. То есть код:

[highlight=Pascal]
for i := 0 to n - 1 do
i := 15;
[/highlight]

был вполне допустим. В Delphi эту особенность исключили.

1.9K
18 апреля 2008 года
andriano
474 / / 10.01.2008
Еще раз: результат работы неправильно написанной программы непредсказуем.
В частности: такая программа может
- выдавать один результат,
- выдавать другой результат,
- не компилироваться,
- подвешивать компьютер.
То, что компиляторы ведут себя по-разному на неправильном коде, вполне естественно. Компилятор не может обнаружить ВСЕ ошибки.
1.8K
19 апреля 2008 года
Валериус
190 / / 14.07.2006
Цитата: Somebody
То, что после to, вычисляется один раз, перед выполнением цикла.


А где он это значение хранить будет? В основной памяти? Если там стоит выражение, то под результат память выделяется отдельно? А если одна переменная?

1.9K
19 апреля 2008 года
andriano
474 / / 10.01.2008
Это уже дело компилятора (а также системы команд используемого процессора). Может хранить в стеке, может - в регистре.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог