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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 09:40   #21
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Код:
      if str[1] in ['+', '-', '*', '/', '^'] then
          PopExtended(Data, a1);
        case str[1] of
          '+': Value:= a1 + a2;
А зачем здесь проверка и потом еще раз выбор?
Правильно для загрузки второго операнда. Так давайте загружать его в тех ветках где он нужен.
Код:
'+': begin Pop(stack, a2); value:=a1+a2; end;
Там же можно грузить и первый операнд.
Код:
'+': begin Pop(stack, a1); pop(stack,a2); value:=a1+a2; end;
Да и результат там же сохранять. Особенно если делать Pop функцией
Код:
case str[1] of
'+':  Push ( stack, Pop(stack) + Pop(stack));
'-': begin a1:=Pop(stack); a2:=Pop(stack); Push(stack, a1-a2); end;
'a':  Push ( stack, sin (Pop(stack)) );
P.S. На оптимизацию конечно мало влияет, но
Цитата:
'r': begin Randomize;Value:=Random(Trunc(a2));end;
Randomize; делается один раз за ВСЮ программу (при старте). Это инициализация генератора.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.01.2013 в 09:57.
evg_m вне форума Ответить с цитированием
Старый 18.01.2013, 11:03   #22
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

тоже думал про инлайн пупа для двухоперандовых операций, будет быстрее, но что то остановило
проверил - влияет незначительно (на 5 секундных вычислениях выигрыш 0,1), поэтому оставил как есть переделал в инлайн

кстати да пуп надо в функцию заделать

у вот пушит результ можно как у меня 1 раз в конце, но ты протести всой вариант и выложи сюда сколько выйграл
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 18.01.2013 в 11:28.
Slym вне форума Ответить с цитированием
Старый 19.01.2013, 17:40   #23
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
Смущение

Цитата:
и вот тут нужна целевая формула которую автар упорно не хочет показывать
Потому что формула может быть любой - от простой линейной x+y-z до какой-нибудь неявно заданной хрени, откуда ничего не выразишь.
Я тестировал на промежуточном варианте - уравнение сферы x^2+y^2+z^2 , конуса x^2+y^2-z^2 или мути типа sin(x*z-cos(y))+cos(z).

Вообще эта прога должна строить поверхность уровня любой неявно заданной функции в определенном объеме. Неоптимальность многих кусков проистекает оттого, что прога основана на другой проге, "Визуализация функций от 3 переменных методом сечения", которую я делал 2 года назад.

Кому интересно, может посмотреть, что я там наворочал, однако возможен обильный facepalm

Цитата:
Randomize; делается один раз за ВСЮ программу (при старте). Это инициализация генератора.
Спасибо, не знал

Последний раз редактировалось Григоренко Степан; 19.01.2013 в 17:44.
Григоренко Степан вне форума Ответить с цитированием
Старый 20.01.2013, 19:18   #24
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
По умолчанию

Метод товарища Слима дал прирост в скорости от 5 до 6.5 раз, метод через процедурный тип пока не пробовал, попробую после экзамена
Григоренко Степан вне форума Ответить с цитированием
Старый 21.01.2013, 08:16   #25
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Всё ни как руки не дотягивались (а ноги не доходили) ответить по этой теме. Короче вот чё накропал:
1. процедурные типы рулят
2. record case - для элементов "формулы"
3. const array - для списка операторов
4. ссылки на элементы динамического списка - для переменных

Исходник на Delphi XE3: Обратная польская запись.zip

P.S.: Сразу извиняюсь за отсутствие комментов (ну там и так всё понятно ) (старался только имена на английском мнемоническими делать) и наличие ошибок (особо не тестил). Хотелось передать именно идею.
Sibedir вне форума Ответить с цитированием
Старый 22.01.2013, 17:32   #26
Григоренко Степан
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 35
По умолчанию

Цитата:
Сообщение от Vapaamies Посмотреть сообщение
Я сейчас скажу глупость, ...
Да, вы сказали глупость Через процедурный тип подстановка ускорилась в среднем в 15 (!!!) раз, а через кейс только в 5,5

Пруф:

x^2+y^2+z^2=9

Изначально: 1,2278 9,32 74,7 251,4
Через кейс: 0,2346 1,86 14,7 49,46
Через п.т. : 0,0674 0,55 4,40 14,94


cos(x)+cos(y)+cos(z)=1

Изначально: 0,789 6,35 50,46 170
Через кейс: 0,122 0,96 7,714 26,0
Через п.т. : 0,066 0,53 4,205 14,2

Проверял на 2 функциях, Первая строка - то, что было до оптимизации, вторая - оптимизированный кейс, третья - оптимизация через процедурный тип. Четыре колонки чисел - пуски для разного количества точек (50^3, 100^3, 200^3, 300^3 соответственно, при 300 в кубе точек прога жрет гиг оперативы но обычно хватает и 50^3)

Последний раз редактировалось Григоренко Степан; 22.01.2013 в 17:38.
Григоренко Степан вне форума Ответить с цитированием
Старый 23.01.2013, 15:08   #27
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Цитата:
Сообщение от Григоренко Степан
Через процедурный тип подстановка ускорилась в среднем в 15 (!!!) раз, а через кейс только в 5,5
Верится с трудом. В варианте с case вы по прежнему используете
Код:
TStack = record 
  Max: Integer;
  Data: array of String;
End;
и FloatToStr?
Если да, то это FloatToStr и тормозит всю работу.
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автозапуск приложения. Но вопрос совсем не про автозапуск приложения. avd Общие вопросы Delphi 4 30.08.2012 22:24
После запуска приложения из службы созданной на C# не отображается иконка приложения dmail1976 Общие вопросы .NET 1 22.09.2011 13:38
Делаю сайты, пишу маленькие/большие скрипты. Пишу веб-приложения и приложения под Windows. SkyM@n Фриланс 3 29.12.2007 16:21