|
FAQ Туториалы и часто задаваемые вопросы |
01.10.2006, 19:44
|
#1
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Методы оптимизации
Итак, что же такое оптимизация? А это просто изменение исходного кода программы / добавление новых модулей с целью повышения её быстродействия. Рассмотрим конкретный пример:
...
If MouseHit(1) PickUnit()
...
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model SelectUnit(u)
Next
End Function
С функцианальной точки зрения код совершенно правильный, и всегда будет получаться ожидаемый результат, но посмотрим что можно же здесь улучшить:
1) "Отброс невозможных вариантов"
Нетрудно заметить, что при нажатии кнопки мыши мы можем выделить только одного юнита, значим мы можем изменить код функции так:
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Return
EndIf
Next
End Function
Итак, мы в среднем увеличили скорость выполнения цикла в два раза!
2)"Задание условий выполнения"
Так же можно заметить, что при нажатии кнорки мыши мы не всегда попадаем в юнита, а значит поставить проверку попали ли мы вообще в юнита? Изменим код так:
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
If Pick=0 Return
For u.unit = each unit
If Pick=u\model SelectUnit(u)
Return
Next
End Function
Здесь важно заметить, что подразумевается, что кроме юнитов никакие другие объекты не выделяются. Если это не так, то можно попробовать сделать следующее:
Function CreateUnit()
u.unit= New unit
...
NameEntity(u\model,"Unit")
...
End Function
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
If Pick=0 Return
If EntityName$(u\model)<> "Unit" Return
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Return
EndIf
Next
End Function
P.S. Если вы имеете дело не с функцией, или кроме цикла (не обязательно цикла) имеется что-то ещё, то для первого случая нужно использовать Exit, а для второго If...End If.
|
(Offline)
|
|
01.10.2006, 19:57
|
#2
|
|
Re: Методы оптимизации
ето очень и очень конкретный пример оптимизации
|
|
|
01.10.2006, 20:08
|
#3
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Методы оптимизации
Конечно, рассмотренные выше методы не являются исчерпывающими. Рассмотрим ещё несколько видов оптимизации:
1) "Замена условий формулой"
Это просто замена нескольких IF одной формулой. Вот основные виды:
а)"Переключатель двух состояний"
То есть просто переменная, которая может принимать значения 1 или 0 :
или
Всё просто.
б)"Преключатель N состояний"
Это переменная, которая может принимать значения 0,1...N :
If KeyHit(57) K=(K+1) Mod N
в)"Минимумы и максимумы"
Часто используется для переменных, которые возратают (или уменьшаются) только до какого-то определенного значения (например для скорости):
Speed=Speed + (1 And Speed < 2)*.5
г)"Модули"
Используется реже, например здесь:
вместо
If EntityPitch(cam)<75 And EntityPitch(cam)>-75 Then
можно использовать
If Abs(EntityPitch(cam))<75 Then
2)"Исключение медленных операций"
Например, если вам надо определить расстояние между точками в 2D ( в 3D всегда исрользуйте EntityDistance - эта команда значительно быстрее любых подсчетов через координаты!), вы наверняка используете что-то вроде этого:
d=Sqr((x1-x2)^2+(y1-y2)^2)
If d<10 Then
...
End If
Но вы должно быть знаете, что Sqr - ОЧЕНЬ МЕДЛЕННАЯ команда, поэтому лучше написать так (как бы возвести все в квадрат):
d=(x1-x2)^2+(y1-y2)^2
If d<100 Then
...
End If
Результат от этого не изменится, а скорость выполнения увеличится!
P.S. Ну вот вроде все ! Если знаете что-то еще, добавляйте.
|
(Offline)
|
|
01.10.2006, 20:21
|
#4
|
|
Re: Методы оптимизации
про If KeyHit(57) K=(K+1) Mod N незнал
пасибки
|
|
|
01.10.2006, 22:08
|
#5
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Re: Методы оптимизации
а мгновенный доступ к елементу типа без перебора ?
Object -есть такая фишка.
Function CreateUnit()
u.unit= New unit
...
name$=Handle (u)
NameEntity u\model, name$
...
End Function
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
If Pick
u.unit=Object.unit(EntityName(Pick))
If u<>Null
SelectUnit(u)
EndIf
EndIf
End Function
|
__________________
|
(Offline)
|
|
02.10.2006, 08:25
|
#6
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Re: Методы оптимизации
Сообщение от jimon
про If KeyHit(57) K=(K+1) Mod N незнал
|
Лучше такую конструкцию не юзать, ибо она наоборот медленнее чем
K = K + 1
If K > N Then K = 0
Раз в 10 быстрее чем mod.
а)"Переключатель двух состояний"
То есть просто переменная, которая может принимать значения 1 или 0 :
или
Всё просто.
|
Тут как раз первый вариант предпочтительнее, ибо быстрее в 2-3 раза чем NOT.
в)"Минимумы и максимумы"
Часто используется для переменных, которые возратают (или уменьшаются) только до какого-то определенного значения (например для скорости):
Speed=Speed + (1 And Speed < 2)*.5
|
Здесь тоже лучше такую конструкцию не использовать, ибо медленне чем
If x < 10 Then x = x * 0.5
раза в 2-3
И насчет знака возведения в степень "^", если известна степень, то лучше заменить на умножение N раз, будет быстрее намного.
|
(Offline)
|
|
02.10.2006, 08:48
|
#7
|
|
Re: Методы оптимизации
Тут как раз первый вариант предпочтительнее, ибо быстрее в 2-3 раза
чем NOT.
|
not выполняется ALU в один такт
что является самой быстрой операцией за все время существования процесоров
И насчет знака возведения в степень "^", если известна степень, то лучше заменить на умножение N раз, будет быстрее намного.
|
необязательно, хотя возможно
Здесь тоже лучше такую конструкцию не использовать, ибо медленне чем
If x < 10 Then x = x * 0.5
раза в 2-3
|
тоже самое, притом компилятор всеравно обе конструкции разворачивает
и надо писать все в одном сообщении !
|
|
|
02.10.2006, 08:53
|
#8
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
Re: Методы оптимизации
jimon
Этот топик по Блицу или по ассемблеру а?
Может написав на ассемблере такую конструкцию с Not, она будет быстрее выполняться, чем эта же конструкция с Sub, а блиц интерпретирует хз. как. Если неверишь, то проверь практически что будет быстрее работать.
|
(Offline)
|
|
02.10.2006, 18:08
|
#9
|
|
Re: Методы оптимизации
втом то и дело что блиц конвертит код в asm
|
|
|
02.10.2006, 20:31
|
#10
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Re: Методы оптимизации
Сообщение от Michael
1) "Отброс невозможных вариантов"
Нетрудно заметить, что при нажатии кнопки мыши мы можем выделить только одного юнита, значим мы можем изменить код функции так:
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model SelectUnit(u)
Return
Next
End Function
Итак, мы в среднем увеличили скорость выполнения цикла в два раза!
|
Ну в "среднем" из цикла производится выход сразу же после проверки первого элемента... работать правильно будет вот так:
[highlight=blitzbasic]
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Return
EndIf
Next
End Function
[/highlight]
|
(Offline)
|
|
02.10.2006, 22:02
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Методы оптимизации
Сообщение от jimon
про If KeyHit(57) K=(K+1) Mod N незнал
пасибки
|
Эта формула была в топике про форумлы в разделе по алгоритмике
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
02.10.2006, 22:13
|
#12
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Re: Методы оптимизации
А вообще правильнее выход из цикла выполнять так:
[highlight=blitzbasic]
Function PickUnit()
Pick=CameraPick(camera,MouseX(),MouseY())
For u.unit = each unit
If Pick=u\model
SelectUnit(u)
Exit
EndIf
Next
End Function [/highlight]
Return производит выход из функции или подпрограммы, а не из цикла. Выход из цикла выполнятся оператором Exit.
|
(Offline)
|
|
02.10.2006, 22:14
|
#13
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Re: Методы оптимизации
2 PAX:
А я это писал (насчет Exit).
|
(Offline)
|
|
02.10.2006, 22:58
|
#14
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Re: Методы оптимизации
Сообщение от Michael
2 PAX:
А я это писал (насчет Exit).
|
Перечитал первый пост еще раз... извините что повторился
|
(Offline)
|
|
03.10.2006, 01:00
|
#15
|
Гигант индустрии
Регистрация: 14.12.2005
Сообщений: 2,785
Написано 1,183 полезных сообщений (для 4,437 пользователей)
|
Re: Методы оптимизации
Спор бессмысленен, есть способ найти элемент без перебора. Я его привел.
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 09:02.
|