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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.08.2017, 16:12   #41
Shahimat
Пользователь
 
Регистрация: 05.12.2015
Сообщений: 27
По умолчанию

Алекс, в принципе я кое в чем согласен, возможно и не стоит париться. Я когда делал проверки (а их я для кучи вариантов проводил), то действительно, наиболее сильный вариант - это goto с условием if EndCondition^ then exit;
Просто я предполагаю, тут уже по опыту, что есть теоретическая возможность как-то отследить положение "курсора считывания" и кинуть его в конец процедуры извне ее. К чему это приведет? Условие if отпадает как ненужное, что уже уменьшит число ненужных сравнений как минимум в 100 раз, у меня программа построена таковым образом, что повторений может быть и больше (не расчетов, а проверки условия if, перед тем, как выйти). Это-то меня и заставляет искать различные возможности, ведь если получиться, то (тут я уже предполагаю) можно добиться десятикратного увеличения производительности, а это существенно.
Резюме: не хочется оставлять эту задачу недобитой, хочется разобрать по полочкам и вынести вердикт, ведь в любом случае, я не один с ней столкнулся, поможет мне, поможет и другим.
Shahimat вне форума Ответить с цитированием
Старый 04.08.2017, 16:41   #42
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
К чему это приведет?
к тому что я написал. Вы будете обязаны разматать стек и вызвать нужные деструкторы или мириться с тем, что оно будет вести себя очень нестабильно/жрать память и т.д.

Цитата:
ведь если получиться, то (тут я уже предполагаю) можно добиться десятикратного увеличения производительности, а это существенно.
Не получите. Это вам не счетная машинка 30 летней давности, процы стали гораздо сложнее и умнее.

Есть еще один вариант: поменять алгоритм.
p51x вне форума Ответить с цитированием
Старый 04.08.2017, 17:04   #43
Shahimat
Пользователь
 
Регистрация: 05.12.2015
Сообщений: 27
По умолчанию

p51x, в принципе я вашу идею понял, как вариант отдельно рассмотрю.
Что касается алгоритма, то я в постоянном поиске, потому-то эту тему и поднял.
Shahimat вне форума Ответить с цитированием
Старый 04.08.2017, 17:13   #44
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Деловто пишете с if. Потом if выносите из цикла.
Или другой вариант конечный аатомат собрать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.08.2017, 17:19   #45
Shahimat
Пользователь
 
Регистрация: 05.12.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Деловто пишете с if. Потом if выносите из цикла.
Или другой вариант конечный аатомат собрать.
Можете пояснить на примере пожалуйста? Как я if вынесу из цикла?
Shahimat вне форума Ответить с цитированием
Старый 04.08.2017, 18:53   #46
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

В каждом случае это решается индивидуально. Как математическими задачами в школе.
Пусть есть такой код
Код:
for y:=0 to Height-1 do
   for x:=0 to Width-1 do
     if (sqr(x-cx)+sqr(y-cy)<=sqr(r)) then buf[x,y]:=color;
Очевидно что если вычислить приделы, то цикл можно переписать так

Код:
for y:=0 to Height-1 do
   begin
   ...
   for x:=x1 to x2 do
     buf[x,y]:=color;
   end;
Осталось найти x1 и x2, так как это формула простая то мы можем найти границу и подставить её.
sqr(x-cx)+sqr(y-cy)=sqr(r)
sqr(x-cx)=sqr(r)-sqr(y-cy)
x-cx=±sqrt(sqr(r)-sqr(y-cy));
x=cx±sqrt(sqr(r)-sqr(y-cy));
Код:
for y:=0 to Height-1 do
   begin
   x1:=round(cx-sqrt(sqr(r)-sqr(y-cy)));
   x2:=round(cx+sqrt(sqr(r)-sqr(y-cy)));
   ...
   for x:=x1 to x2 do
     buf[x,y]:=color;
   end;
Остаётся правильно обработать выход за границу буфера
Код:
for y:=0 to Height-1 do
   begin
   x1:=round(cx-sqrt(sqr(r)-sqr(y-cy)));
   x2:=round(cx+sqrt(sqr(r)-sqr(y-cy)));
   if x1<0 then x1:=0;
   if x2<0 then x2:=0;
   if x1>Width then x1:=Width;
   if x2>Width then x2:=Width;

   for x:=x1 to x2 do
     buf[x,y]:=color;
   end;
И данный код будет работать примерно раз в 100 быстрее изначального.

Другие примеры можно посмотреть в лекциях:
http://www.intuit.ru/studies/courses...2/lecture/5556
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 04.08.2017, 19:41   #47
Shahimat
Пользователь
 
Регистрация: 05.12.2015
Сообщений: 27
По умолчанию

Pavia, спасибо конечно большое за совет... просто специфика задачи несколько другая)
в моей программе в том ответственном коде some2 не используется цикл for как таковой по той причине, что он тормознутый)
Shahimat вне форума Ответить с цитированием
Старый 04.08.2017, 19:46   #48
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
не используется цикл for как таковой по той причине, что он тормознутый)
Для вас может быть удивительным, но в машинных кодах все типы цикла практически одинаковы... по таким комментариям виден ваш уровень.
p51x вне форума Ответить с цитированием
Старый 04.08.2017, 19:53   #49
Shahimat
Пользователь
 
Регистрация: 05.12.2015
Сообщений: 27
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Для вас может быть удивительным, но в машинных кодах все типы цикла практически одинаковы... по таким комментариям виден ваш уровень.
Вы от меня что хотите узнать? я понял ваш комментарий, если сказать более интересного нечего, то незачем писать. ясен красен, что в машинных кодах эти циклы практически одинаковы
Shahimat вне форума Ответить с цитированием
Старый 04.08.2017, 20:08   #50
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Это открытый форум. Здесь может писать, кто угодно, пока не нарушает правили или законы. Так что закрой рот, а то я и послать могу.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача одной процедуры другой в качестве входящего параметра ProRockX Общие вопросы Delphi 2 02.10.2015 11:32
Не могу найти контрол из одной процедуры в другой ChoKavo C# (си шарп) 1 18.10.2014 13:34
Использование имени процедуры в качестве параметра другой процедуры Alexey355 Помощь студентам 1 23.04.2011 13:59
Вызов одной процедуры из другой artemavd Общие вопросы Delphi 11 26.11.2010 17:37
Ошибка вызова одной процедуры в другой! $T@LKER БД в Delphi 4 28.04.2010 19:50