Страница 8 из 15
Re: (решено) GoTo или repeat until?
Добавлено: 05.09.2015 11:58:35
vitaly_l
Снег Север писал(а):используют не TPicture, а функции DirectX или OpenGL.
Хм... интересная мысль... а вот их то, я тогда кажется и не пробовал протестировать на скорость (хотя и не факат)... Однако, если они не используют стандартный Tbitmap и Tpicture в родителях, то есть шанс на ускорение процесса загрузки картинок.
скалогрыз писал(а):i:=1;
whileloop:
if (i<=length(s)) then begin
if not (s[i] in 'a') then begin
inc(i);
goto whileloop;
end;
end;
С репит антил в аналогичной раскладке - всё понятно...
А вот как компилятор раскладывает на язык GoTo оператор
for?
Добавлено спустя 7 минут 77 секунд:Кстати: try finally exception - ведь тоже можно разложить на язык GoTo?
.
Re: (решено) GoTo или repeat until?
Добавлено: 05.09.2015 15:39:07
Снег Север
vitaly_l писал(а):Однако, если они не используют стандартный Tbitmap и Tpicture в родителях
Безусловно DirectX и OpenGL не используют стандартный Tbitmap и Tpicture
Но проблема загрузки файла и его разжатия для форматов типа jpeg никуда не девается (а у вас, помнится, именно в этом были тормоза). Ускоряется на порядки вывод на экран большого количества графики.
Re: (решено) GoTo или repeat until?
Добавлено: 06.09.2015 12:24:27
vitaly_l
Снег Север писал(а):Но проблема загрузки файла и его разжатия для форматов типа jpeg (а у вас, помнится, именно в этом были тормоза)
Вы невнимательно читали тот топик, перечитайте! Там очень хорошо описаны все эксперименты. А по существу, что-бы Вы не вводили людей в заблуждение, там суть проблемы вот в этом: В TStream - файл картинки грузится моментально (любой формат). Проблемы с декодированием, тоже не возникает, особенно у *.bmp ..., на декодирование тратятся доли наносекунд - замеряли. Но есть какой-то баг, который "по пути" данных из TStream в TBitmap и TPicture, абсолютно для всех модулей по обработке графики (в том числе и сторонних) - делает задержку по времени загрузки в два и более раза (т.к. TBitmap и TPicture - общий предок/родитель, для всех модулей) и это только в Лазарусе (в других IDE/FPC всё работает как надо). На маленьких картинках этого не видно, а на больших заметно (я сверял 10 000 * 10 000 картинок и время мне было важно). Проверял, не я, а несколько довольно сильных программистов, баг - тогда не нашли.
Касаемо темы топика, вот этот вопрос всё ещё в силе:vitaly_l писал(а):А вот как компилятор раскладывает на язык GoTo оператор for?
Добавлено спустя 7 минут 77 секунд:
Кстати: try finally exception - ведь тоже можно разложить на язык GoTo?
Re: (решено) GoTo или repeat until?
Добавлено: 06.09.2015 18:26:33
bormant
vitaly_l писал(а):как компилятор раскладывает на язык GoTo оператор for?
Тестовый пример:
Код: Выделить всё
var i, j: Integer;
begin
j:=0;
for i:=0 to 4 do
Inc(j);
end.
Компилируем с -al, смотрим вывод, видим там что-то вроде:
Код: Выделить всё
...
# Var i located in register dx
# Var j located in register ax
...
# [4] for i:=0 to 4 do
movw $0,%dx
decw %dx
.balign 4,0x90
.Lj7:
incw %dx
# [5] Inc(j);
incw %ax
cmpw $4,%dx
jl .Lj7
# [6] end.
...
Восстанавливаем логику:
Код: Выделить всё
i:=нач_значение;
Dec(i);
LoopBody:
Inc(i);
{ тело цикла }
if i<кон_значение then
goto LoopBody;
Re: (решено) GoTo или repeat until?
Добавлено: 06.09.2015 18:44:42
vitaly_l
bormant писал(а):Тестовый пример:
Спасибо, добрый мультиуважаемый bormant!!! Благодаря Вам, ложная информация восстановлена в нужное русло.
Из Вашего примера, я установил, что практически полностью, забыл ассемблер ( правило:
Используй или забудешь - работает 100% ).
Вопрос: Кто нить, может разложить: try finally exception - на язык GoTo? ( в пояснении bormant: "язык GoTo" - называется "псевдопаскаль" )
Суть, в том что, выше говорили что, у оператора GoTo, будут существенные проблемы при скачках по try finally exception.
.
Re: (решено) GoTo или repeat until?
Добавлено: 06.09.2015 18:55:57
bormant
vitaly_l писал(а):практически полностью, забыл ассемблер
Возможно, MASM-синтаксис вам более привычен, если звать
fpc с ключами
-Amasm -al, получится что-то вроде:
Код: Выделить всё
; Var i located in register dx
; Var j located in register ax
; [4] for i:=0 to 4 do
mov dx,0
dec dx
ALIGN 4
@@j7:
inc dx
; [5] Inc(j);
inc ax
cmp dx,4
jl @@j7
; [6] end.
Re: (решено) GoTo или repeat until?
Добавлено: 06.09.2015 19:04:33
vitaly_l
А... да... Вы правы... этот ассемблер - мне более понятен ( там просто операторы переименованы )

.
Попробую позвать fpc с -Amasm -al, может даже и сам прочитаю

, суть работы: try finally exception.

СПАСИБО!
.
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 09:26:16
vada
GoTo в моём примере прыгает из цикла в цикл...
Нет печатных слов. Только матерные.

Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 09:44:41
Лекс Айрин
vada, расслабься и кушай попкорн. Ну нравится людям извращения. Это их проблемы.
vitaly_l писал(а):Кто нить, может разложить: try finally exception - на язык GoTo? ( в пояснении bormant: "язык GoTo" - называется "псевдопаскаль" )
Суть, в том что, выше говорили что, у оператора GoTo, будут существенные проблемы при скачках по try finally exception.
почти точно так же, но куча if и пустых операторов. (ну или обработчиков). Это если Вам чисто не нравится вызов функций.
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 10:02:17
vada
Лекс Айрин vada, расслабься и кушай попкорн. Ну нравится людям извращения. Это их проблемы.
Я как-то ехал в электричке, пришлось полтора часа слушать двух умников.
Они спорили как "лучше" сделать вечный двигатель из электро двигателя и электро генератора на одной оси ротора.
Мне этот треш про GOTO очень напоминает этот спор.

Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 10:17:12
Лекс Айрин
vada, действительно, похоже... я, кстати, удивляюсь, почему не вспомнили исконно ассемблерную конструкцию loop и то, что в нем же можно иметь в процедуре/функции более одного оператора возврата. Последнее, видимо, потому что это чисто хакерский ход.
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 11:12:55
vitaly_l
vada писал(а):Нет печатных слов. Только матерные.
vada писал(а):как "лучше" сделать вечный двигатель из электро двигателя и электро генератора на одной оси ротора
Лекс Айрин писал(а):Ну нравится людям извращения. Это их проблемы.
Лекс Айрин писал(а):почему не вспомнили исконно ассемблерную конструкцию loop
Я это спрашиваю, потому что, хочу понять как раскладывает код компилятор, мне стало интересно, почему из try finally exception нельзя выпрыгнуть с помощью GoTo? Ассемблер, я априори не люблю (я ещё не смотрел код про try finally exception), но такой несложный код наверное смогу понять и поэтому просил перевести на язык GoTo (псевдопаскаля).
А вот кстати касаемо вечных двигателей, то они невозможны - это признано Академией наук, наравне с тем что, до "большого взрыва" вселенной не существовало и скорость света по Академическим постулатам - тоже неизменна ( хотя есть признанные научные награды за эксперименты, в которых двигаются быстрее света и т.д. ). Не волнуйтесь, никто ничего не изобретает, я просто изучаю: "Почему GoTo - зло, а repeat until - добро?"...
То что, любой GoTo - можно заменить на цикл или переходом в другую процедуру, не говорит в пользу того что - это обязательно нужно делать. А вот ошибки компилятора, при таких переходах - это важно знать, т.к. художникам иногда лень следовать скучным Академическим постулатам и они потом не могут разобраться почему их программа выдаёт не совсем, то, чего хотели художники... А выяснилось, что это компилятор виноват, т.к. не фиксирует ошибки при GoTo-прыжках.
Лучше дайте примеров и доказательств про зло от использования GoTo, т.к. с GoTo иногда конструкции выглядят проще чем с выносом функций и десятком дополнительных вложенных циклов.
.
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 11:51:54
Снег Север
Почему нельзя ковырять в левой ноздре большим пальцем правой ноги? Кто запретил? Да никто не запрещает. Кому так удобнее - пусть ковыряет, на здоровье...
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 12:04:42
Лекс Айрин
vitaly_l писал(а):мне стало интересно, почему из try finally exception нельзя выпрыгнуть с помощью GoTo? Ассемблер, я априори не люблю (я ещё не смотрел код про try finally exception), но такой несложный код наверное смогу понять и поэтому просил перевести на язык GoTo (псевдопаскаля).
Вот если бы Вы знали хотя бы основы ассемблера, то не задавали бы этого вопроса. Дело в том, что try finally exception это вызов обработчика прерывания.
1) обработка идет (в идеале) во внутреннем кольце процессора.
2) сохраняется куча данных в стеке... в том числе и адрес возврата. (фактически, это вызов процедуры)
3) запрещаются прерывания
вот как раз эти причины не дают применять Goto. Если уж это действительно необходимо, то надо, как минимум, разрешить прерывания и сбросить "конверт" созданный вызовом прерывания. Иначе это приведет к разбалансировке стека, зависанию и/или срабатыванию прерывания общей защиты. Вплоть до BSODa.
Добавлено спустя 3 минуты:vitaly_l писал(а):А вот кстати касаемо вечных двигателей, то они невозможны - это признано Академией наук,
Кстати, возможны. Второго рода. А вот вечный двигатель первого рода действительно невозможен.
vitaly_l писал(а):А выяснилось, что это компилятор виноват, т.к. не фиксирует ошибки при GoTo-прыжках.
Это не ошибка компилятора... это ошибка программиста.
Re: (решено) GoTo или repeat until?
Добавлено: 07.09.2015 12:37:51
vitaly_l
Лекс Айрин писал(а):Кстати, возможны. Второго рода.
Это что ещё за второй род? ( я про такое не слышал ).
А вот это реально круто:
Лекс Айрин писал(а):Вот если бы Вы знали хотя бы основы ассемблера, то не задавали бы этого вопроса. Дело в том, что try finally exception это вызов обработчика прерывания.
1) обработка идет (в идеале) во внутреннем кольце процессора.
2) сохраняется куча данных в стеке... в том числе и адрес возврата. (фактически, это вызов процедуры)
3) запрещаются прерывания
вот как раз эти причины не дают применять Goto. Если уж это действительно необходимо, то надо, как минимум, разрешить прерывания и сбросить "конверт" созданный вызовом прерывания. Иначе это приведет к разбалансировке стека, зависанию и/или срабатыванию прерывания общей защиты. Вплоть до BSODa.
Художники напуганы... художники в страхе... художники в ужасе... когда упоминают страшного и коварного: BSODa... художники бессильны оспорить... художники признают поражение... Есть кто-то кто может оспорить страшные и коварные аргументы уважаемого Лекс Айрин?
Добавлено спустя 3 минуты 4 секунды:Лекс Айрин писал(а):разрешить прерывания и сбросить "конверт" созданный вызовом прерывания
Вот этот кусочек можно поподробнее? Это реально интересно.
.