Structs v.s. Locations

Waaaaagh

I lost all my rep and my title being a jerk
Reaction score
70
Just out of curiosity, which of these is faster to get/set values (array set/get, loc set/get)

JASS:
struct coordinate
    real x
    real y

    static method create takes real x, real y returns coordinate
        local coordinate c=coordinate.allocate()
        set c.x=x
        set c.y=y
        return c
    endmethod

    method X takes nothing returns real
        return .x
    endmethod
    method Y takes nothing returns real
        return .y
    endmethod
    
    method SetX takes real x returns nothing
        set .x=x
    endmethod
    method SetY takes real y returns nothing
        set .y=y
    endmethod
endstruct


or a location.

I have a feeling that location is faster, IF you use the methods on the struct for get/set. If you just do it manually, I think structs would be faster.


I have decided that declaring new types is uber fun (expect to see some geometric figures declared using structs).
 

Vexorian

Why no custom sig?
Reaction score
187
Just out of curiosity, which of these is faster to get/set values (array set/get, loc set/get)

JASS:
struct coordinate
    real x
    real y

    static method create takes real x, real y returns coordinate
        local coordinate c=coordinate.allocate()
        set c.x=x
        set c.y=y
        return c
    endmethod

    method X takes nothing returns real
        return .x
    endmethod
    method Y takes nothing returns real
        return .y
    endmethod
    
    method SetX takes real x returns nothing
        set .x=x
    endmethod
    method SetY takes real y returns nothing
        set .y=y
    endmethod
endstruct


or a location.

I have a feeling that location is faster, IF you use the methods on the struct for get/set. If you just do it manually, I think structs would be faster.


I have decided that declaring new types is uber fun (expect to see some geometric figures declared using structs).


yes, with methods they are slower, otherwise much faster.

Not like you win anything from using methods for that, myloc.x = 3.4 is even much more readable than myloc.SetX(3.4) ...
 

N-a-z-g-u-l

New Member
Reaction score
30
quite interesting, i'd say locations are faster, but seems like i am wrong... a real "x" and a real "y" will be faster anyways :) and if you have multiple coordinates:

CasterX
CasterY
CasterUnit
TargetX
TargetY
TargetUnit
 

Doomhammer

Bob Kotick - Gamers' corporate spoilsport No. 1
Reaction score
67
Can you please state specific benchmark results? I'm a bit tired of the "blarg is faster than blah" argument without the exact results of tests/benchmarks and/or the operations of testing/benchmarking themselves.
 

Vexorian

Why no custom sig?
Reaction score
187
Can you please state specific benchmark results? I'm a bit tired of the "blarg is faster than blah" argument without the exact results of tests/benchmarks and/or the operations of testing/benchmarking themselves.
What's stopping you from making the benchmarks? I am a bit tired of people demanding benchmarks instead of doing them themselves.

My excuse is that I can't run grimoire on Linux and there fore I can't do proper benchmarks, unless your OS is not windows there's nothing that is stopping you from doing it...

And GetLocationX(loc,1) requires a hash check (for loc) n access to handle and some checking, etc then calling the native function, etc. x[loc] needs 2 hash reads (loc+x). So that's where my conclussion comes from.
 

Doomhammer

Bob Kotick - Gamers' corporate spoilsport No. 1
Reaction score
67
For one, great master, I simply don't know how to run benchmarks on jass issues, (which was part of my demand) as so far I never bothered to. I rather spend my creative energy on map- and spell making. Yet if there is an argument, and one of interest, then it better be funded on more than claims. true = false!
Your conclusion is a good approach already, like assuming a Ferrari to be faster than a Trabbi under most circumstances due to the engines horsepower...
 

Pyrogasm

There are some who would use any excuse to ban me.
Reaction score
134
You need the JAPI custom natives to do proper benchmarking.
 

SFilip

Gone but not forgotten
Reaction score
634
A somewhat short version...
Get grimoire (or newgen), make sure japi and nativepack are loaded in your ongameload.lua, create a new map, import the custom common.j (found in the japi directory of newgen/grimoire) and use something like this:
JASS:
function dotest takes nothing returns nothing
    local integer n = 0
    local integer swatch = StopWatchCreate()
    loop
        exitwhen n == 1000
        // do whatever you want to test here
        set n = n + 1
    endloop
    call BJDebugMsg(R2S(StopWatchMark(swatch)*1000.))
    call StopWatchDestroy(swatch)
endfunction

Now use startwar3 or war3win in grim/newgen directory to start the game, load your map and you should get the output in µs (1/10^6 seconds).
Of course it's recommended that you run this a couple of times (I usually get the average out of 100 runs) for more precise results. Also note that this can't get you the exact time something takes to run, should be used mainly for comparing.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top