Насколько константная функция быстрее обычной, если быстрее вообще?

ScopteRectuS, Скорее его там нет, это просто свойство интерпретатора, как и тип nothing, который объявить нельзя, так вероятно и constant - просто дает понять интерпретатору что эту переменную вынести в отдельное место, так же проверить код- нет ли операции присвоение этой переменной.
Если есть - выдать ошибку. Обращение к переменной медленнее обращение к конкретному значению, указанному в месте использования.
call CreateUnit( pl, 'hpea', x, y, bj_unitFacing) медленнее call CreateUnit( pl, 'hpea', x, y, 270.00 ).
Потому что движок сначала ищет переменную, потом берет из нее значение, иначе сразу вводит значение.
т.к есть макросы, дефайны, всякие фитчи тулов векса по замене констант, это все нафиг никому не упало. Софт все сделает за вас.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
нет, конвертации напрямую нет. я что-то слышал в прошлом про баг с сохранением fogmodifier в хештаблицу, но деталей не знаю, можешь проверить то направление.
ну и мемхак, на крайняк, офк.
ответ
Ой извини, уже нашел ошибку
if GetUnitAbilityLevel(WhistlePhysical_CASTER[i], c_WhistlePhysical_Buff_ID) == 0 then вот что было такой переменный оказалось в другой способности
ответ
Sergey105, нет его 1раз запускают если они с нуля а так растет каждый атак +1 потом таймер удаляет его, причиной было это
constant real time_Interval = 1/32 тут почему то трабл таймер в мега скорость идет,
поэтому поставил constant real time_Interval = 0.03 и стало норм
ответ
ScopteRectuS, у тебя где то перезаписывается bj_lastCreatedUnit
причём происходит это после первой итерации GroupEnumUnitsInRange
а вообще не стоит юзать стандартные бж переменные
т.к. они могут конфликтовать с другими системами
используй приватные переменные
если после перехода на приватные глобалки проблема останется то скопируй систему на отдельную карту и кинь эту карту сюда
буду тестить разные варианты
ответ
ScopteRectuS, ну как я и догадывался, что идет рекурсия.
10 событий - юнит получает урон, на одного юнита... Нужны именно такого типа проверки, всегда в условии триггера проверяй от кого урон и какой этот урон с помощью флага глобалки как в примере.В блоге лича хорошо описаны костыли доты, почитай для общего развития чтобы не наступать на эти грабли еще раз.

29
Константнтая функция - синтаксический сахар в джассе, но из-за своих ограничений совсем незначительно быстрее обычной функции, но медленнее доступа к константной переменной.
26
вас должно заботить не то, быстрее ли такая функция или медленнее, а оптимизация узких мест, вот где важна скорость выполнения. не в ту сторону смотрите
DracoL1ch:
да едва ли это имеет вообще значение
21
Hate:
вас должно заботить не то, быстрее ли такая функция или медленнее, а оптимизация узких мест, вот где важна скорость выполнения. не в ту сторону смотрите
Я про это и думал. Ведь можно сделать функцию константной, которая вызывается таймером с малым периодом.
code
	function IsUnitAlive takes unit whichUnit returns boolean
		return not ( IsUnitType( whichUnit, UNIT_TYPE_DEAD ) or ( GetUnitTypeId( whichUnit ) == 0 ) )
	endfunction
	
	function TimerCallback takes nothing returns nothing
	  	...
		if ( IsUnitAlive( unit ) ) then
			...
		endif
		...
	endfunction

	function Start takes nothing returns nothing
		call TimerStart( CreateTimer( ), 0.03125, true, function TimerCallback )
	endfunction 
Вот что я имел ввиду.
22
а не проше булевой ставить при инизиалицазии а потом уже его проверять
16
а ты пробовал? логика говорит, что constant функция всегда возвращает константу и не может работать с параметрами :)
20
Ускорение достигается за счет расположения функции выше по коду, чем остальные, ЕМНИП
26
Вот что я имел ввиду.
таким образом вы наоборот сужаете горлышко
пример
function TimerCallback takes nothing returns nothing
	  	...
		if  ( IsUnitType( Unit, UNIT_TYPE_DEAD ) or ( GetUnitTypeId( Unit ) == 0) then
		else
			...
		endif
		...
	endfunction
21
Hate, Вы акцентируете внимание совсем на другое. Это понятно, что лучше вставить код из самой функции, вместо его вызова (как Вы и написали).
Я же хотел обратить Ваше внимание не на это, a на саму функцию IsUnitAlive( ) и на ускорение кода, если сделать её константной.
То есть Ваш ответ должен быть:
  • ускорения не будет совсем
  • ...
  • ускорение будет, но очень маленькое, что даже можно это не учитывать
  • ...
  • ускорение будет достаточно хорошим и функцию стоит сделать константной.
30
constant function is a function whose (output) value is the same for every input value

Кажется, это не та функциональность, которая требуется.

Ещё можно предварительно пробовать, а не задавать превентивные вопросы.
21
Clamp, если я правильно понял, то почему это работает?
code
constant function sum takes integer a , integer b returns integer
    return a + b
endfunction

function test takes nothing returns nothing
    call BJDebugMsg( I2S( sum (1, 1 ) ))
    call BJDebugMsg( I2S( sum (2, 2 ) ))
endfunction

//===========================================================================
function InitTrig_test takes nothing returns nothing
    set gg_trg_test = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_test, 1.00 )
    call TriggerAddAction( gg_trg_test, function test )
endfunction
screen
Ещё можно предварительно пробовать, а не задавать превентивные вопросы.
Я спросил быстрее это или нет, а Вы отвечаете, что не работает, хотя в работоспособности я и не сомневался.
Загруженные файлы
30
DracoL1ch:
а ты пробовал? логика говорит, что constant функция всегда возвращает константу и не может работать с параметрами :)
21
Clamp:
DracoL1ch:
а ты пробовал? логика говорит, что constant функция всегда возвращает константу и не может работать с параметрами :)
Я не программист и не силён в терминологии. Но вышеуказанный скрин, мне кажется, говорит, что константная функция может работать с параметрами.
26
дело не в том может она работать с параметрами или нет. дело в том что если там и есть прирост, он слишком мизерный что бы акцентировать на нем внимание, и эти функции несут совершенно другой смысл.
по ссылке на пальцах объяснено, что такие функции использовались для возвращения постоянных неизменных значений, и они были вытеснены функционалом JNGP где можно создавать глобалки в любом месте, и при этом иметь постоянные неизменные значения
21
если там и есть прирост, он слишком мизерный
16
байткод констант и не-констант функции одианковый, никакой разницы там нет
на скринах i.imgur.com/ZORNLGH.png соответственно
32
ScopteRectuS, Скорее его там нет, это просто свойство интерпретатора, как и тип nothing, который объявить нельзя, так вероятно и constant - просто дает понять интерпретатору что эту переменную вынести в отдельное место, так же проверить код- нет ли операции присвоение этой переменной.
Если есть - выдать ошибку. Обращение к переменной медленнее обращение к конкретному значению, указанному в месте использования.
call CreateUnit( pl, 'hpea', x, y, bj_unitFacing) медленнее call CreateUnit( pl, 'hpea', x, y, 270.00 ).
Потому что движок сначала ищет переменную, потом берет из нее значение, иначе сразу вводит значение.
т.к есть макросы, дефайны, всякие фитчи тулов векса по замене констант, это все нафиг никому не упало. Софт все сделает за вас.
Принятый ответ
26
почему это работает?
Потому что сумма 1 и 2 всегда 3. Константно.
А юнит может оказаться как живым, так и не живым.
Поэтому функция суммирования может быть константной, а твоя проверка - нет.
Кламп все верно говорит. И по ссылке драколича это все размусолено.
21
А юнит может оказаться как живым, так и не живым.
почему тогда функция IsUnitAlive( ) работает исправно:
сonstant function IsUnitAlive takes unit whichUnit returns boolean
	return not ( IsUnitType( whichUnit, UNIT_TYPE_DEAD ) or ( GetUnitTypeId( whichUnit ) == 0 ) )
endfunction
26
ScopteRectuS, ты тестил на одном и том же юните, когда он жив и когда мертв?
16
да не влияет содержимое, алло, уже показали же. просто сама конструкция constant ничего не делает.
22
когда вы уже забудете о скорости, тут зависит отработки машин от процессора потоки, даже 1 байт может грохнуть машину... думай об оптимизации а не от функции
разница времени 0.0001 сек вы так жалуете?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.