Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2014, 20:28   #11
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Точно, Вадим-Зоркий_глаз.

Изначальный вариант
Цитата:
for : 1030
while : 329
Если вместо i mod 2 = 0 использовать not Odd(i)
Цитата:
for : 580
while : 319
С 15 до 25
Цитата:
for : 319
while : 329

Последний раз редактировалось Poma][a; 07.06.2014 в 20:32.
Poma][a вне форума Ответить с цитированием
Старый 07.06.2014, 20:51   #12
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Точно, Вадим-Зоркий_глаз.

Изначальный вариант
for : 1030
while : 329

Если вместо i mod 2 = 0 использовать not Odd(i)
for : 580
while : 319

С 15 до 25
for : 319
while : 329
Ничего не понял, это при каких условиях? Ты учёл, что должно быть не i:=2, а i:=30?

и проверь ещё мой то сообщение, на которое ты мне отвечаешь, там есть дополнения, которых ты, возможно, не видел

Последний раз редактировалось Вадим Мошев; 07.06.2014 в 20:57.
Вадим Мошев вне форума Ответить с цитированием
Старый 07.06.2014, 21:02   #13
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Хотя то, что при "одинаковых" условиях while отрабатывает быстрее, для меня - сюрприз
Нет там одинаковых условий - в цикле FOR есть умножение на 2, оно и съедает все преимущества. Можно попробовать заменить его сдвигом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2014, 21:32   #14
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

for i := 15 to 25 : тыц
for i := 15 to 25 with shl тыц
for i := 30 to 50 if i mod 2 = 0 тыц
for i := 30 to 50 if not Odd(i) тыц
Poma][a вне форума Ответить с цитированием
Старый 07.06.2014, 21:54   #15
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Хотя то, что при "одинаковых" условиях while отрабатывает быстрее, для меня - сюрприз
Условия не одинаковые. В for присутствует лишняя операция умножения. Но ее можно заменить на shl 1, будет быстрее (на сколько - не проверял).
Arigato вне форума Ответить с цитированием
Старый 07.06.2014, 22:55   #16
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

У меня дизассемблер показал, что фри паскаль и for и repeat слепил в одно и то же (логично, если учесть, что for'a в ассемблере нет) (только у варианта с while добавился один jmp). Но в цикле for была проверка на чётность, что добавило 2 инструкции (sub и lea, если память не изменяет - в обед ещё проверял).
Кстати варианты с mod и odd получились практически одинаковыми. Разница в том, что при использовании odd смещения были кратны 8, а при mod - кратны 4, всё остальное одинаково. Но это на оптимизацию компилятора списать можно
eoln вне форума Ответить с цитированием
Старый 07.06.2014, 22:59   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В общем случае не может быть одно и тоже - FOR один раз вычисляет выражения от и до, а WHILRE и REPEAT каждый раз при проверке условия. В основном за счет этого и разная эффективность маш.кода
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.06.2014, 23:00   #18
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

На сколько я знаю (требуется проверка) при использовании for переменная-счетчик может быть размещена вообще в регистре, чего не будет в while.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан двумерный массив А размера n*n . Найти произведение не нулевых элементов массива А находящийся в четных столбцах (Delphi) Kat9 Помощь студентам 1 02.03.2014 19:11
Подсчитать сумму отрицательных четных чисел, количество четных чисел кратных 3 и т.д. (pascal abc .net) kardinalmax Общие вопросы .NET 1 24.01.2014 09:28
Составить программу массива: Найти наименьшее из четных и произведение нечетных чисел, входящих в последовательность kolia_y Паскаль, Turbo Pascal, PascalABC.NET 8 06.10.2013 09:39
Найти произведение элементов массива, не равных 0 и стоящих на четных местах ( Delphi ) Nikta1111 Помощь студентам 1 06.12.2011 08:27
вычислить произведение четных чисел в каждой строке массива. Oliver Sykes Паскаль, Turbo Pascal, PascalABC.NET 5 09.10.2008 03:43