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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2015, 09:36   #11
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
За счет чего тормозят циклы в Паскале?
Не тормозят они. Подход к решению задачи различен. Ну и проверки всякие можно попробовать повыкидывать (например выход за границы массива).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 14.08.2015, 10:04   #12
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Чудо-программист Посмотреть сообщение
За счет чего тормозят циклы в Паскале?
За счёт того что в Паскале проблемы с оптимизацией на уровне релиза компиля. Не знаю как дела обстоят с Дельфином, но с ТурбоПаскалем, так оно и есть.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 14.08.2015, 15:52   #13
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
Вопрос

Померяй эти:
  1. Оригинал
    Код:
    J:=0;
    While J<=ScreenMaxY Do
          Begin
          I:=0;
          While I<=ScreenMaxX Do
                Begin
                Screen[J, I]:=Screen1^[J, I];
                Inc(I);
                End;
          Inc(J);
          End;
  2. Развёртка 4x
    Код:
    J:=0;
    ScreenMaxX_d4:=(ScreenMaxX Div 4)*4; // требуется только для случаев когда ScreenMaxX может быть не кратен 4
    While J<=ScreenMaxY Do
          Begin
          I:=0;
          While I<ScreenMaxX_d4 Do
                Begin
                Screen[J, I]:=Screen1^[J, I];
                Screen[J, I+1]:=Screen1^[J, I+1];
                Screen[J, I+2]:=Screen1^[J, I+2];
                Screen[J, I+3]:=Screen1^[J, I+3];
                Inc(I, 4);
                End;
          While I<=ScreenMaxX Do // требуется только для случаев когда ScreenMaxX может быть не кратен 4
                Begin
                Screen[J, I]:=Screen1^[J, I];
                Inc(I);
                End;
          Inc(J);
          End;
  3. Без внутреннего
    Код:
    L:=ScreenMaxX+1;
    N:=L*(ScreenMaxY+1)-1;
    For K:=0 To N Do
          Begin
          J:=K Div L;
          I:=K Mod L;
          Screen[J, I]:=Screen1^[J, I];
          End;
ResourceSpace вне форума Ответить с цитированием
Старый 14.08.2015, 15:55   #14
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

for однозначно оптимальнее while при всех прочих равных условиях
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.08.2015, 16:00   #15
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

С чего вдруг? Обоснуйте?
Большинство компиляторов сделает одинаковый Asm-код из For первого поста и While написанного мною.
ResourceSpace вне форума Ответить с цитированием
Старый 14.08.2015, 16:32   #16
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
С чего вдруг? Обоснуйте?
Ну.. При while условие проверяется каждый раз. В for - нет
Poma][a вне форума Ответить с цитированием
Старый 14.08.2015, 16:55   #17
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Ну.. При while условие проверяется каждый раз. В for - нет
Это на уровне логики высокого языка не происходит.
На уровне низкого проверка происходит каждый раз, просто переменная с которой сравнивается в цикле не изменяется. На асме в конечном счёте все сводится к сравнению и перепрыгиванию

Цитата:
Большинство компиляторов сделает одинаковый Asm-код из For ... и While
Это да. Фор считается "придуманным", а вайл "рассово-правильным"

Последний раз редактировалось eoln; 14.08.2015 в 16:57.
eoln вне форума Ответить с цитированием
Старый 14.08.2015, 17:02   #18
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Ну.. При while условие проверяется каждый раз. В for - нет
Delphi 7, без оптимизации:

Код:
for i:=0 to 9 do
begin
end;


00460C5B   33C0             XOR EAX,EAX                   // i:=0 (часть 1)
00460C5D   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX  // i:=0 (часть 2)
00460C60   FF45 F8          INC DWORD PTR SS:[EBP-8]      // inc(i)
00460C63   837D F8 0A       CMP DWORD PTR SS:[EBP-8],0A   // если i<>10 переходим на 00460C60  (часть 1)
00460C67  ^75 F7            JNZ SHORT Project1.00460C60   // если i<>10 переходим на 00460C60  (часть 2)
Код:
i:=0;
while i<10 do
begin
  inc(i);
end;

00460C7C   33C0             XOR EAX,EAX                    // i:=0 (часть 1)
00460C7E   8945 F8          MOV DWORD PTR SS:[EBP-8],EAX   // i:=0 (часть 2)
00460C81   837D F8 0A       CMP DWORD PTR SS:[EBP-8],0A    // если i>=10 переходим на 00460C90 (часть 1)
00460C85   7D 09            JGE SHORT Project1.00460C90    // если i>=10 переходим на 00460C90 (часть 2)
00460C87   FF45 F8          INC DWORD PTR SS:[EBP-8]       // inc(i) 
00460C8A   837D F8 0A       CMP DWORD PTR SS:[EBP-8],0A    // если i<10 переходим на 00460C87 (часть 1)
00460C8E  ^7C F7            JL SHORT Project1.00460C87     // если i<10 переходим на 00460C87 (часть 2)
00460C90   ...
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 14.08.2015 в 17:14.
Krasiosoft вне форума Ответить с цитированием
Старый 14.08.2015, 17:32   #19
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Это на уровне логики высокого языка не происходит.
Да ладно.
тыц (идею украл у Сержа)
Poma][a вне форума Ответить с цитированием
Старый 14.08.2015, 18:16   #20
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Да ладно.
0.jpg
Ну вот же сравнение до 9. И прыжок при 9 итерации. Как и говорил, границы заранее вычислены, но проверки каждый раз.
Да, цикл фор тут быстрее отработает, но только потому, что примеры неравнозначны.

Последний раз редактировалось eoln; 14.08.2015 в 18:53. Причина: в другую сторону считал
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чем можно заменить или как ускорить TImageList? garuna Общие вопросы Delphi 10 06.12.2014 15:07
как ускорить AlexVI Общие вопросы C/C++ 10 15.07.2014 23:42
Как можно ускорить скорость макроса? staniiislav Microsoft Office Excel 7 21.12.2011 09:44
Можно ли ускорить выполнение этого кода? Velross Помощь студентам 3 07.01.2010 19:37
Можно ли как-то ускорить выполнение этого кода (обработка примечаний)? motorway Microsoft Office Excel 2 23.07.2009 17:06