GetEnumUnit() vs. local unit u

Narks

Vastly intelligent whale-like being from the stars
Reaction score
90
My function says something like:

DoStuff(GetEnumUnit())
DoMoreStuff(GetEnumUnit())
EvenMoreStuff(GetEnumUnit())


Is it faster to replace GetEnumUnit with a local unit var?
 

Romek

Super Moderator
Reaction score
964
Yes.
 

Narks

Vastly intelligent whale-like being from the stars
Reaction score
90
Do I need to null the unit after? (I think I do?)
 

Romek

Super Moderator
Reaction score
964
Unless it's a hero that won't be removed.

But people tend to null them anyway - It's good practice (And you rarely know whether or not GetEnumUnit() is a hero, unless you check it, which is crappier than just nulling it anyway. :p)
 

Viikuna

No Marlo no game.
Reaction score
265
Yes, variable is probably faster, because function calls are pretty slow and there is 3 of them.

You can use FilterFunction for doing actions:

JASS:


globals
    private filterfunc F
    private group G=CreateGroup() 
endglobals

private function FilterFunction takes nothing returns boolean
   local unit u=GetFilterUnit()
   if someCondition then
        // do actions for u
   endif
   set u=null
   return false
endfunction

private function Action takes nothing returns nothing
   // stuff...
   call GroupEnumUnitsInRange(G,0.0,0.0,1000.,F)
   // no need to do any ForGroups now
   // more stuff
endfunction

// initializer
private function init takes nothing returns nothing
    set F=Filter(function FilterFunction)
endfunction
 

Troll-Brain

You can change this now in User CP.
Reaction score
85
Yes, variable is probably faster, because function calls are pretty slow and there is 3 of them.
Hmm don't be so sure about that, this it is a native function, not a custom one, the difference wouldn't be so much.
 

jig7c

Stop reading me...-statement
Reaction score
123
can you null/remove/destroy intergers/reals by a custom script?
 

Jesus4Lyf

Good Idea™
Reaction score
397
No. Nor do you need to. You can set to 0 if you need to set to 0.

Viikuna, that still executes a callback as opposed to a loop, so I'm not -sure- that it would be faster than a loop. Indeex, a loop is usually better to use, because it gives access to local variables in the caller. For example, damage all units in group... It is at very least more stable to use a loop instead of global carry variables (in case the function is for whatever reason recursive). :D
 

Viikuna

No Marlo no game.
Reaction score
265
I believe that Filter is faster. Loop requires you to call FirstOfGroup and GroupRemoveUnit and stuff like that.

Also null boolexprs leaks something with GroupEnum calls, so if you use it a lot it can be pretty nasty.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
I don't know if this exactly relates but;
FirstOfGroup() can cause problems though I've heard.
If the unit gets out of the group or stuff like that.
Using FoG loops after some time from filling the group isn't totally safe. If a unit who is in the group is removed from the game (using RemoveUnit IIRC), its place in the group will be set to the value
JASS:
null
. So the
JASS:
exitwhen u == null
will return true on its position, though there'd be more units after it in the group. Or at least this is what I recall reading from WC3C some time ago. Using a ForGroup should be safe, me thinks. And you should prolly get rid of CRConditions.
 

Viikuna

No Marlo no game.
Reaction score
265
Yea, but Griffens GroupRefresh kinda fixes that issue.
 

Jesus4Lyf

Good Idea™
Reaction score
397
>Also null boolexprs leaks something with GroupEnum calls, so if you use it a lot it can be pretty nasty.
Proove it, please. Until then I won't believe that one. :)

>FirstOfGroup() can cause problems though I've heard.
>If the unit gets out of the group or stuff like that.
Correct. In this case, a unit can't possibly be removed between the group filling and the loop, so this is irrelevant. ;)

>I believe that Filter is faster. Loop requires you to call FirstOfGroup and GroupRemoveUnit and stuff like that.
I forgot about GroupRemoveUnit. Hmm. ForGroup has a function call and a GetEnumUnit(). 2 for 2? Pending bench tests then, I suppose.

Recall my other point, as it is very relevant: "a loop is usually better to use, because it gives access to local variables in the caller".
 

Romek

Super Moderator
Reaction score
964
The Unit-Removable bug cannot possibly happen with temporary groups, or groups that are filled, and emptied instantly. So that's hardly a problem.

The only time when that'd cause a problem would be when a group is filled over time, then a FoG loop is used to call actions and empty it.
Though this is quite rare. People either fill and empty instantly with FoG, or gradually add units, and use ForGroup.

I don't think any speed difference would be significant by the way. =)
 

Troll-Brain

You can change this now in User CP.
Reaction score
85
Jesus4Lyf said:
Proove it, please. Until then I won't believe that one.
JASS:
scope ThisDoesntLeak initializer init

private function Actions takes nothing returns nothing
    local trigger t=CreateTrigger()
    
    call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_DEATH)
    call DestroyTrigger(t)
    set t = null
endfunction

//===========================================================================
public function init takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterTimerEventPeriodic( trig, 0.01 )
    call TriggerAddAction( trig, function Actions)
endfunction

endscope


JASS:
scope ThisDoesLeaks initializer init

globals
    private group G = CreateGroup()
endglobals

private function Actions takes nothing returns nothing
    call GroupEnumUnitsInRange(G,0,0,0,null)
endfunction

//===========================================================================
public function init takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterTimerEventPeriodic( trig, 0.01 )
    call TriggerAddAction( trig, function Actions)
endfunction

endscope


JASS:
scope ThisFixTheLeaks initializer init

globals
    private group G = CreateGroup()
    private boolexpr B_TRUE
endglobals

private function True takes nothing returns boolean
    return true
endfunction

private function Actions takes nothing returns nothing
    call GroupEnumUnitsInRange(G,0,0,0,B_TRUE)
endfunction

//===========================================================================
public function init takes nothing returns nothing
    local trigger trig = CreateTrigger()
    call TriggerRegisterTimerEventPeriodic( trig, 0.01 )
    call TriggerAddAction( trig, function Actions)
    set B_TRUE = Condition(function True)
endfunction

endscope


Sure it's an inaccurate way to know if it leaks or not and how many, but you just have to be check the memory used by the process war3 and that war3 is still running, not a big deal.
 

Viikuna

No Marlo no game.
Reaction score
265
I read it from wc3c (luls) link

And, yea, using locals is nicer than using some global struct instance for filters, but I not so much that I would use loops ( unless they are really really fast ).

And if you feel like benchmarking this, dont forget to tell me which one was faster. If loop is really much faster, I need to start using it.


edit. If you benchmark it, use FilterFunc for actions and global struct instance for passing data ( No ForGroup ) against that loop thingy.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • Monovertex Monovertex:
    Hmm, how do I change my signature?
  • tom_mai78101 tom_mai78101:
    Signatures can be edit in your account profile. As for the old stuffs, I'm thinking it's because Blizzard is now under Microsoft, and because of Microsoft Xbox going the way it is, it's dreadful.
  • The Helper The Helper:
    I am not big on the recipes I am just promoting them - I use the site as a practice place promoting stuff
    +2
  • Monovertex Monovertex:
    @tom_mai78101 I must be blind. If I go on my profile I don't see any area to edit the signature; If I go to account details (settings) I don't see any signature area either.
  • The Helper The Helper:
    You can get there if you click the bell icon (alerts) and choose preferences from the bottom, signature will be in the menu on the left there https://www.thehelper.net/account/preferences
  • The Helper The Helper:
    I think I need to split the Sci/Tech news forum into 2 one for Science and one for Tech but I am hating all the moving of posts I would have to do
  • The Helper The Helper:
    What is up Old Mountain Shadow?
  • The Helper The Helper:
    Happy Thursday!
    +1
  • Varine Varine:
    Crazy how much 3d printing has come in the last few years. Sad that it's not as easily modifiable though
  • Varine Varine:
    I bought an Ender 3 during the pandemic and tinkered with it all the time. Just bought a Sovol, not as easy. I'm trying to make it use a different nozzle because I have a fuck ton of Volcanos, and they use what is basically a modified volcano that is just a smidge longer, and almost every part on this thing needs to be redone to make it work
  • Varine Varine:
    Luckily I have a 3d printer for that, I guess. But it's ridiculous. The regular volcanos are 21mm, these Sovol versions are about 23.5mm
  • Varine Varine:
    So, 2.5mm longer. But the thing that measures the bed is about 1.5mm above the nozzle, so if I swap it with a volcano then I'm 1mm behind it. So cool, new bracket to swap that, but THEN the fan shroud to direct air at the part is ALSO going to be .5mm to low, and so I need to redo that, but by doing that it is a little bit off where it should be blowing and it's throwing it at the heating block instead of the part, and fuck man
  • Varine Varine:
    I didn't realize they designed this entire thing to NOT be modded. I would have just got a fucking Bambu if I knew that, the whole point was I could fuck with this. And no one else makes shit for Sovol so I have to go through them, and they have... interesting pricing models. So I have a new extruder altogether that I'm taking apart and going to just design a whole new one to use my nozzles. Dumb design.
  • Varine Varine:
    Can't just buy a new heatblock, you need to get a whole hotend - so block, heater cartridge, thermistor, heatbreak, and nozzle. And they put this fucking paste in there so I can't take the thermistor or cartridge out with any ease, that's 30 dollars. Or you can get the whole extrudor with the direct driver AND that heatblock for like 50, but you still can't get any of it to come apart
  • Varine Varine:
    Partsbuilt has individual parts I found but they're expensive. I think I can get bits swapped around and make this work with generic shit though
  • Ghan Ghan:
    Heard Houston got hit pretty bad by storms last night. Hope all is well with TH.
  • The Helper The Helper:
    Power back on finally - all is good here no damage
    +2
  • V-SNES V-SNES:
    Happy Friday!
    +1
  • The Helper The Helper:
    New recipe is another summer dessert Berry and Peach Cheesecake - https://www.thehelper.net/threads/recipe-berry-and-peach-cheesecake.194169/
  • The Helper The Helper:
    I think we need to add something to the bottom of the front page that shows the Headline News forum that has a link to go to the News Forum Index so people can see there is more news. Do you guys see what I am saying, lets say you read all the articles on the front page and you get to the end and it just ends, no kind of link for MOAR!
  • The Helper The Helper:
    Happy Wednesday!
    +1

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top