Jesus4Lyf
Good Idea™
- Reaction score
- 397
Comparison:
Approximate Results & Conclusions:
Comments & Personal Criticism:
Code:
[LJASS]GetUnitUserData(Unit)[/LJASS] vs [LJASS]LoadInteger(Hash,GetHandleId(Unit),0)[/LJASS]
Approximate Results & Conclusions:
- Tested on Warcraft III Version 1.24b.
- [LJASS]LoadInteger(Hash,GetHandleId(Unit),0)[/LJASS] takes 1.83 times as long to execute as [LJASS]GetUnitUserData(Unit)[/LJASS].
- [LJASS]GetUnitUserData(Unit)[/LJASS] is therefore 45% faster than [LJASS]LoadInteger(Hash,GetHandleId(Unit),0)[/LJASS].
Comments & Personal Criticism:
- There was a generally low fluctuation demonstrated, showing a stable test.
- Due to a rumour that UnitUserData is O(n) complexity, I tested 250 units (realistic) and also 1 unit, and found no significant difference.
- Due to experience with the order of the code execution changing results, I tried switching the test order. No visible difference.
Code:
JASS:
library Benchmark initializer OnInit
///////////////////////////////////////////////
// Native declarations for stopwatch natives //
// - Requires no modified common.j import //
///////////////////////////////////////////////
native StopWatchCreate takes nothing returns integer
native StopWatchMark takes integer stopwatch returns real
native StopWatchDestroy takes integer stopwatch returns nothing
/////////////////////////
// Benchmarking script //
/////////////////////////
// init
globals
unit Unit
integer DataSave
hashtable Hash=InitHashtable()
endglobals
private function Init takes nothing returns nothing
local integer i=250
loop
set i=i-1
set Unit=CreateUnit(Player(15),039;hpea039;,0,0,0)
call SetUnitUserData(Unit,57)
call SaveInteger(Hash,GetHandleId(Unit),0,57)
exitwhen i==0
endloop
endfunction
// test
private function TestA1000 takes nothing returns nothing
local integer i=1000
loop
exitwhen i==0
set i=i-1
// Repeat x10
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 1
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 2
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 3
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 4
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 5
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 6
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 7
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 8
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 9
set DataSave=LoadInteger(Hash,GetHandleId(Unit),0) // 10
endloop
endfunction
private function TestB1000 takes nothing returns nothing
local integer i=1000
loop
exitwhen i==0
set i=i-1
// Repeat x10
set DataSave=GetUnitUserData(Unit) // 1
set DataSave=GetUnitUserData(Unit) // 2
set DataSave=GetUnitUserData(Unit) // 3
set DataSave=GetUnitUserData(Unit) // 4
set DataSave=GetUnitUserData(Unit) // 5
set DataSave=GetUnitUserData(Unit) // 6
set DataSave=GetUnitUserData(Unit) // 7
set DataSave=GetUnitUserData(Unit) // 8
set DataSave=GetUnitUserData(Unit) // 9
set DataSave=GetUnitUserData(Unit) // 10
endloop
endfunction
private function OnEsc takes nothing returns nothing
local integer sw
local integer i
set i=0
set sw=StopWatchCreate()
loop
set i=i+1
call TestA1000.evaluate() // x10 - 100,000 executions altogether.
exitwhen i==10
endloop
call BJDebugMsg("Hashtable: "+R2S(StopWatchMark(sw)*100))
call StopWatchDestroy(sw)
set i=0
set sw=StopWatchCreate()
loop
set i=i+1
call TestB1000.evaluate() // x10 - 100,000 executions altogether.
exitwhen i==10
endloop
call BJDebugMsg("UnitData: "+R2S(StopWatchMark(sw)*100))
call StopWatchDestroy(sw)
endfunction
///////////////////////////////
// Registers the OnEsc event //
///////////////////////////////
private function OnInit takes nothing returns nothing
local trigger t=CreateTrigger()
call TriggerRegisterPlayerEvent(t,Player(0),EVENT_PLAYER_END_CINEMATIC)
call TriggerAddAction(t,function OnEsc)
call Init()
endfunction
endlibrary