XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Результаты опроса: Оптимизируем ли код?
Да 19 63.33%
Нет 11 36.67%
Голосовавшие: 30. Вы еще не голосовали в этом опросе

Закрытая тема
 
DioD

offline
Опыт: 45,134
Активность:
[Task] Оптимизация по ДиоДу

Постановка задачи


Можно ли оптимизировать этот код, если можно продемонстрируйте. Делайте с кодом что хотите, важен результат.
  • Без утечек, это должно быть понятно
  • Кеш == Глобалки, можете данные в юнитах хранить, это не важно
  • Оптимизировать АЛГОРИТМ
    • На исключение не нужного
    • На включение важного

Код:
function Trig_Generic_Timer_Actions takes nothing returns nothing
    local integer Seconds = CFG_I("Seconds")
    local integer Minutes = CFG_I("Minutes")
    local integer Hours   = CFG_I("Hours"  )
    local string  Secs
    local string  Mins
    local string  Hour
    local string  Time
    
    set Seconds = Seconds + 1
    
    if Seconds == 60 then
        set Minutes = Minutes + 1
        set Seconds = 0
    endif
    
    if Seconds < 10 then
        set Secs = "0" + I2S(Seconds)
    else
        set Secs = I2S(Seconds)
    endif
    
    if Minutes == 60 then
        set Hours = Hours + 1
        set Minutes = 0
    endif
    
    if Minutes < 10 then
        set Mins = "0" + I2S(Minutes)
    else
        set Mins = I2S(Minutes)
    endif
    
    if Hours < 10 then
        set Hour = "0" + I2S(Hours)
    else
        set Hour = I2S(Hours)
    endif
    
    set Time = " <"+Hour+":"+Mins+":"+Secs+"> "
    
    call I_CFG("Seconds", Seconds )
    call I_CFG("Minutes", Minutes )
    call I_CFG("Hours"  , Hours   )

    call StoreString(Core(),"CFG","Time",Time)

    set  Secs = null
    set  Mins = null
    set  Hour = null
    set  Time = null
endfunction

Отредактировано ShadoW DaemoN, 07.08.2008 в 00:08.
Старый 09.01.2007, 22:34
Krol

offline
Опыт: 17,884
Активность:
Цитата:
if Seconds < 10 then

нельзя! Тута всё оптимизированно!
З.Ы я в джассе всего один день:)

Krol добавил:
Но кажется ДиоД это нам дал неспроста!
Старый 09.01.2007, 23:50
J
expert
offline
Опыт: 48,447
Активность:
DioD Я проголосовал "да"


т.к. оптимизация это большей частью алгоритмика, то я бы изменил некоторый порядок действий, и сделал бы так:
Код:
function Trig_Generic_Timer_Actions takes nothing returns nothing
    local integer Seconds = CFG_I("Seconds")
    local integer Minutes = CFG_I("Minutes")
    local integer Hours   = CFG_I("Hours"  )
    local string  Time = " <"
    
    set Seconds = Seconds + 1
    
    if Seconds == 60 then
        set Minutes = Minutes + 1
        set Seconds = 0
    endif
    
    if Minutes == 60 then
        set Hours = Hours + 1
        set Minutes = 0
    endif  
      
    if Hours < 10 then
        set Time = Time + "0"
    endif  
    set Time = Time + I2S(Hours) + ":"
    
    if Minutes < 10 then
        set Time = Time + "0"
    endif    
    set Time = Time + I2S(Minutes) + ":"
    
    if Seconds < 10 then
        set Time = Time + "0"
    endif
    set Time = Time + I2S(Seconds) + "> "
    
    call I_CFG("Seconds", Seconds )
    call I_CFG("Minutes", Minutes )
    call I_CFG("Hours"  , Hours   )

    call StoreString(Core(),"CFG","Time",Time)

    set  Time = null
endfunction

фсе...
Цитата:
Сообщение от код
call StoreString(Core(),"CFG","Time",Time)


Это то что я думаю? тогда это тоже утечка!

.
Старый 10.01.2007, 04:03
DioD

offline
Опыт: 45,134
Активность:
Core = Константа из глобалки, а оптимизировать стоит чтение из кеша.
Старый 10.01.2007, 10:11
adic3x

offline
Опыт: 108,439
Активность:
Как вариант:

Код:
local integer i=1
loop
exitwhen i==9
set udg_s[i] = "0"
set i = i+ 1
endloop


и потом:

Код:
set time = udg_s[Minutes+1]+I2R(Minutes)+";"+udg_s[Seconds+1]+I2R(Seconds)


Короче мы удалили несколько if'оф засчет добавки строки. А что, правда я нуб?
Старый 10.01.2007, 15:17
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
Сообщение от ADOLF
Как вариант
...

и потом:
...

Цитата:
Сообщение от ADOLF
А что, правда я нуб?

хм... пожалуй...
Старый 10.01.2007, 15:19
adic3x

offline
Опыт: 108,439
Активность:
Забыл сказать что изначально udg_s = ""
Старый 10.01.2007, 15:22
J
expert
offline
Опыт: 48,447
Активность:
ADOLF ты также забыл упомянуть
что здесь:
Код:
set time = udg_s[Minutes+1]+I2R(Minutes)+";"+udg_s[Seconds+1]+I2R(Seconds)

компилятор выдаст ошибку
и также не сказал.. что вот это такое? т.к. я непонял зачем это? и не вижу сдесь смысла...:
Код:
local integer i=1
loop
exitwhen i==9
set udg_s[i] = "0"
set i = i+ 1
endloop
Старый 10.01.2007, 15:25
adic3x

offline
Опыт: 108,439
Активность:
Jon, писал это не в редакторе, вобщем смысл такой:

Массив строк, значения 1 - 10 = "0", остальные = "".
Мы когда выводим время пишем строку udg_s[минуты]+I2R(минуты), т.е. если минуты равны трем мы получим строку "0"+"3", а если 18 - ""+"18", ну неисключаю что надел тут ошибок)
Старый 10.01.2007, 15:34
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
неисключаю что надел тут ошибок

неисключено то что ты написал вообще не будет работать и уж темболее не будет работатать так как ты имееш ввиду
Старый 10.01.2007, 15:51
adic3x

offline
Опыт: 108,439
Активность:
Jon, имхо не я один нуб) фсе прикрасна пашэт (правда я упростил пример и сделал через глобалу, но многих ифоф я избежал):

Код:
function Trig_b_Actions takes nothing returns nothing
 local integer i = 1
 loop
  exitwhen i == 11
  set udg_st[i] = "0"
  set i = i + 1
 endloop
endfunction

function InitTrig_b takes nothing returns nothing
 set gg_trg_b = CreateTrigger()
 call TriggerAddAction(gg_trg_b, function Trig_b_Actions)
endfunction
- при инициализации


Код:
function Trig_a_Actions takes nothing returns nothing
 set udg_s = udg_s+1
 if udg_s == 60 then
  set udg_m = udg_m + 1
  set udg_s = 0
 endif
 call DisplayTextToForce(GetPlayersAll(),udg_st[udg_m+1]+I2S(udg_m)+";"+udg_st[udg_s+1]+I2S(udg_s))
endfunction

function InitTrig_a takes nothing returns nothing
 set gg_trg_a = CreateTrigger()
 call TriggerRegisterTimerEventPeriodic(gg_trg_a, 1.00)
 call TriggerAddAction(gg_trg_a, function Trig_a_Actions)
endfunction
- no comment


DioD, я помойму понял к чему ты клониш: почему кешь а не глобалы? Ведь в 10 раз быстрее...
Старый 10.01.2007, 16:38
Кет

offline
Опыт: 111,109
Активность:
NoobKiller, а как надо?
напиши, всем полезно будет.
Старый 10.01.2007, 17:50
zibada

offline
Опыт: отключен
дурь полная.
храни одно число - timestamp (число секунд от какого-то момента), а когда уж надо это куда-то выводить, переводи в строки or whatever...
Старый 10.01.2007, 18:54
ArchWorm
Матрица незалежности
offline
Опыт: 4,675
Активность:
многабукф, а толку мало
Старый 10.01.2007, 19:52
nic666

offline
Опыт: 5,612
Активность:
Оптимизировать по скорости или по объему?

А почему вы пренебрегаете вложенными условиями типа:

Код:
set Seconds = Seconds + 1
    
    if Seconds == 60 then
        set Minutes = Minutes + 1
        set Seconds = 0
         if Minutes == 60 then
            set Hours = Hours + 1
            set Minutes = 0
          endif
    endif

И с массивом дело предлогают, в инициализации прописать:
T[0]="00"
T[1]="01"
...
T[59]="59"
=========
Потом никаких сравнений на 10, а сразу:
set Time = " <"+T[Hours]+":"+T[Minutes]+":"+T[Secundes]+"> "

И это все не предел, можно еще оптимизировать, но ценой увеличения общего объема кода. Инициализация еще раздуется.
Старый 10.01.2007, 20:43
DioD

offline
Опыт: 45,134
Активность:
Цитата:
Сообщение от !
дурь полная.
храни одно число - timestamp (число секунд от какого-то момента), а когда уж надо это куда-то выводить, переводи в строки or whatever...



Код написан более менее криво для того что-бы вы могли подумать.

1) тайм штамп работает хуже
(так как заставляет тащить кучу дублирующих вычислений)
2) Здесь в принципе тоже самое, просто всмотритесь в порядок а вернее последовательность чтения\записи чисел.

Отредактировано DioD, 11.01.2007 в 10:45.
Старый 10.01.2007, 23:16
adic3x

offline
Опыт: 108,439
Активность:
DioD, а обязательно через кешь?
Старый 10.01.2007, 23:23
DioD

offline
Опыт: 45,134
Активность:
блин, оптимизировать надо алгоритм а не кеш.
можете заменить чтение из кеша на глобалки.
Старый 10.01.2007, 23:33
nic666

offline
Опыт: 5,612
Активность:
DioD
Если это конкурс, то:

1) очень не любезно с вашей стороны сообщать об этом в последнюю очередь...
2) Вы так и не поставили задачу, и не ответили на мой вопрос.
Цитата:
Оптимизировать по скорости или по объему?

Если надо по объему, то можно уложиться в 4-5 строк...
3) Вы смешиваете несколько видов ошибок в одном примере. Я например думал, что вам по-зарез нужно писать все это в кэш. Но если бы я делал подобное, то кэшем вообще бы не пользовался. Глобалки работают быстрее, если их не очень много.
4) Как вы собираетесь оценивать ответы? Исходя из ваших личных вкусов или проводить тесты? Если тесты, то огласите правила их проведения.
5) Не заявлено никаких требований к ответам. Достаточно ли указать где ошибки, наметить путь решения или нужен полнофункциональный код?
====================================
Теперь вы говорите:
Цитата:
Собственно ответ дан, хотя может кто-то и предложит нечто иное.

Осмелюсь спросить:
1) ответ на что? Если толком небыло и вопроса...
2) ответ дан где/кем? Jon? ADOLF? Кто-то еще?


Короче! Отцотой... конкурса не было... НИЗАЧОТ!
Старый 11.01.2007, 10:05
DioD

offline
Опыт: 45,134
Активность:
Просто один учаснег удалил все свои посты.

Оптимизируется АЛГОРИТМ

Например я придумал сейчасвот такой кодЪ

Дано:
Код:
function A_and_B takes string A, string B returns real
    call StoreString(Cache(),"A","A",A)
    call StoreString(Cache(),"B","B",B)
    return I2R(R2I(S2R(GetStoredString(Cache(),"A","A"))) + R2I(S2R(GetStoredString(Cache(),"B","B"))))
endfunction


Задача:
Оптимизировать

если возникают вопросы о том как, то вы не рубите фишку.

Тему исправил, лишнее удалил.

Отредактировано DioD, 11.01.2007 в 10:51.
Старый 11.01.2007, 10:44
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 17:54.