![]() |
Методы оптимизации
Итак, что же такое оптимизация? А это просто изменение исходного кода программы / добавление новых модулей с целью повышения её быстродействия. Рассмотрим конкретный пример:
Код:
1) "Отброс невозможных вариантов" Нетрудно заметить, что при нажатии кнопки мыши мы можем выделить только одного юнита, значим мы можем изменить код функции так: Код:
2)"Задание условий выполнения" Так же можно заметить, что при нажатии кнорки мыши мы не всегда попадаем в юнита, а значит поставить проверку попали ли мы вообще в юнита? Изменим код так: Код:
Код:
Function CreateUnit() |
Re: Методы оптимизации
ето очень и очень конкретный пример оптимизации
|
Методы оптимизации
Конечно, рассмотренные выше методы не являются исчерпывающими. Рассмотрим ещё несколько видов оптимизации:
1) "Замена условий формулой" Это просто замена нескольких IF одной формулой. Вот основные виды: а)"Переключатель двух состояний" То есть просто переменная, которая может принимать значения 1 или 0 : Код:
If KeyHit(57) N=1-N Код:
If KeyHit(57) N=Not(N) б)"Преключатель 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 - эта команда значительно быстрее любых подсчетов через координаты!), вы наверняка используете что-то вроде этого: Код:
Код:
P.S. Ну вот вроде всеB) ! Если знаете что-то еще, добавляйте. |
Re: Методы оптимизации
про If KeyHit(57) K=(K+1) Mod N незнал :)
пасибки :) |
Re: Методы оптимизации
а мгновенный доступ к елементу типа без перебора ?
Object -есть такая фишка. Цитата:
|
Re: Методы оптимизации
Цитата:
Код:
K = K + 1 Цитата:
Цитата:
Код:
If x < 10 Then x = x * 0.5 И насчет знака возведения в степень "^", если известна степень, то лучше заменить на умножение N раз, будет быстрее намного. |
Re: Методы оптимизации
Цитата:
что является самой быстрой операцией за все время существования процесоров Цитата:
Цитата:
и надо писать все в одном сообщении ! |
Re: Методы оптимизации
jimon
Этот топик по Блицу или по ассемблеру а? Может написав на ассемблере такую конструкцию с Not, она будет быстрее выполняться, чем эта же конструкция с Sub, а блиц интерпретирует хз. как. Если неверишь, то проверь практически что будет быстрее работать. |
Re: Методы оптимизации
втом то и дело что блиц конвертит код в asm :)
|
Re: Методы оптимизации
Цитата:
[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] ;) |
Re: Методы оптимизации
Цитата:
|
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. |
Re: Методы оптимизации
2 PAX:
А я это писал (насчет Exit). |
Re: Методы оптимизации
Цитата:
|
Re: Методы оптимизации
Спор бессмысленен, есть способ найти элемент без перебора. Я его привел.
|
Re: Методы оптимизации
Удобным так же может оказаться более абстрактная реализация, описанного tormoz-ом метода: присваивать имени меша (name) хендл информационной структуры, а не хендл типа, поставленного в соответсвиее мешу напрямую. Это позволяет проводить более непривязанный анализ, и даже создать жалкое подобие ООП: в функцию передаётся entity пикунтого меша, из имени entity извлекается квази-укзатель на информационную структуру, получаем доступ к структуре, узнаём: к какому типу объектов поставлен в соответствие данный меш, квази-укзатель на конкретный элемент этого типа, и всё что нам необходимо.
|
Re: Методы оптимизации
добавлю еще немного про оптимизацию.
во первых постарайтесь избегать делений например a/5 лучше заменить на a*0.2, так как второй вариант раза в три быстрее. если число нужно умножить на что то вроде 2, 4, 8, 16 и т.д. или тем более разделить то можно обойтись логическим сдвигом (который рулит:) ). например a/16 можно заменить на a shr 4, для умножения соответственно a shl 4. четверка это степень двойки для число 16. дополнительное время отнимают вызовы функций , причем чем больше параметров чем больше времени они отнимают. очень быстро выполняются логические операции (or, xor, and, not). пока все. |
Re: Методы оптимизации
Цитата:
Цитата:
Цитата:
Цитата:
|
Re: Методы оптимизации
Цитата:
Ты у себя проверял оба варианта? (с not state и c 1-state) Я проверил - 1-state быстрее выполняется, у меня по крайней мере. И еще, может я чего то не допонял, почему это NOT быстрее SUB? Ну теоретически-то да - быстрее, но на практике у меня одинаковы :) Проверял на пурике Код:
state = #False ЗЫ Может дело в проце? P4 630 Prescott 3.0 Ghz 2x |
Re: Методы оптимизации
Cyan
тут лутче писать на чистом asm и двух ядерный проц тут ничего толком не дает хотя лутче проверить еще на amd мож какаято оптимизация в cpu стоит ? :) хотя хз - я же не intel :) |
Re: Методы оптимизации
jimon
Писал и на чистом асм в пурике, и на FASM - один и тот же результат - скорость выполнения одинаковая. |
Re: Методы оптимизации
Cyan значит ето скорость ALU... :)
|
Часовой пояс GMT +4, время: 14:19. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot