Thread history
Viewing a history listing
Time | User | Activity | Comment |
---|---|---|---|
14:09, 5 May 2013 | Skilgannon (talk | contribs) | New thread created | |
15:10, 5 May 2013 | MN (talk | contribs) | New reply created | (Reply to Decision Speed Optimisation) |
17:16, 5 May 2013 | Voidious (talk | contribs) | New reply created | (Reply to Decision Speed Optimisation) |
17:17, 5 May 2013 | Voidious (talk | contribs) | New reply created (since deleted) | (Reply to Decision Speed Optimisation) |
17:18, 5 May 2013 | Voidious (talk | contribs) | Deleted | (duplicate post) |
18:06, 5 May 2013 | Skilgannon (talk | contribs) | New reply created | (Reply to Decision Speed Optimisation) |
I was playing around with a speed comparison with manual point-in-field checks to the Rectangle2D.Double.contains(x,y) method, and discovered that if I used && between the booleans I got pretty much exactly the same speed, but if I use & I get double the speed and exactly the same result. I'm guessing this is due to my CPU being able to evaluate multiple boolean expressions simultaneously, but if && is used only one is allowed to be executed at a time, or perhaps & just allows the pipelines to stay more full because there is less branching.
Of course, there are some reasons you might want && instead, like null checking before examining an object property, and && is smaller codesize for those bots that are codesize restricted, but particularly for high-load situations like the inside of precise prediction or play-it-forward loops, using & for your decisions might gain you some speed =)
That's interesting and is something I didn't know. I don't think there would normally be parallel evaluation going on, so I do think it's the lack of branching and that bit-wise operations are just very simple/fast. I found a couple StackOverflow questions about it too, where people mostly mention branching. [1] [2]
I'm probably in the "not worth the cost to readability" camp, but I know you're a little closer to the "anything for speed" end of the spectrum. :-)
I'm actually implementing a rotated Rectangle2D.Double so that I can evaluate out-of-bounds PIF with a projected replay in Neuromancer. I was worried that it would be much slower than a standard .contains(x,y) function, so I was testing that. When I hit on the bitwise operations I thought I'd try a standard non-rotated function, and it was twice as fast as the awt.geom one. My rotated function is now slightly faster than the awt.geom as well.
I agree that sprinkling them around liberally isn't really going to make much of a difference, and will affect readability, but for something where you just have a bunch of numerical comparisons and the costs for all the branches will be more expensive than any saved time from the short-circuit provided in &&, this could be a decent speedup. The only real applications in RoboCode that would be intensive enough and have enough decisions to make this worthwhile, at least that I can think of, are in-field-bounds testing and range searches in Kd-Trees.