[nycphp-talk] Switch-Case v. if/else
oorza2k5 at gmail.com
oorza2k5 at gmail.com
Thu May 14 22:30:50 EDT 2009
I didn't think anonymous functions were ireleased until the 5.3 branch,
which isn't near stable enough for production yet?
On May 14, 2009 10:10pm, Andrew Muraco <amuraco at gmail.com> wrote:
> How about this for an idea:
> Write the code so that the switch returns the content of the case as a
> function, this way, you can hopefully avoid having to do all those
> comparisons. (obviously you would then be able to use this anonymous
> function in place of the switch)
> Not sure if your code would allow it tho.
> -Andrew Muraco
> oorza2k5 at gmail.com wrote:
> oops, just sent this to one guy =\
> On May 14, 2009 3:52pm, oorza2k5 at gmail.com wrote:
> > Alright! answers :P
> >
> > Profiling the code, this script (which bottlenecks on the switch-case)
> is 82% of execution time __with__ APC. Of the script itself, ~45% of the
> execution time is this particular switch-case.
> >
> > I can't send the code, NDA's and whatnot, but it was basically (these
> are all string comparisons that can't be refactored into numerical
> comparisons, I pulled two cases out into a loop for that):
> >
> > if($) {
> >
> > } elseif ($b || $c || $d || $e) {
> >
> > ) elseif ($f || $g) {
> >
> > } else {
> >
> > }
> >
> > After changing it to
> >
> > switch($condition) {
> >
> > case 'a':
> > blah;
> > case 'b':
> > case 'c':
> > case 'd':
> > case 'e':
> > blah
> > case 'f':
> > case 'g':
> > blah
> > default:
> > blah
> >
> > that conditional is about 5% faster.
> >
> > The script itself isn't slow, it's that it's an autoloader that has to
> be ran 15-30 times per pageload and there's no viable way to make the
> necessary infrastructure changes to remove it, nor is it viable to
> require() manually, as that would take even more time. Before anyone
> suggests, the original __autoload() was >90% of page time, and I split it
> into an autoloading class and registered 4 different methods on the
> autoloading stack ordered, of course, in order from most->least used.
> >
> > One of the things I was thinking about trying was keeping track of
> classnames and paths in an internal array and serializing that resulting
> array and pushing it into and pulling it out of APC (in the destructor
> and constructor, respectively) and the first method on the autoloading
> stack would check for $this->includeMap[$className] but I'm unsure if
> that would be a sane approach or not.
> >
> > On May 14, 2009 5:38pm, John Campbell jcampbell1 at gmail.com> wrote:
> > > PHP should run ~1M switch tests per second on decent hardware. Either
> > >
> > > you are misinterpreting you profiling data, or running a switch
> > >
> > > statement a hell of a lot of time. I can't imagine any sort of
> > >
> > > if/else vs switch vs. jump table is going to make much of a
> > >
> > > difference. At best you will see a speedup of 30% or so, but that
> > >
> > > won't really fix the underlying problem.
> > >
> > >
> > >
> > > On Thu, May 14, 2009 at 2:12 PM, Eddie Drapkin oorza2k5 at gmail.com>
> wrote:
> > >
> > > > Does anyone know how the PHP Interpreter pulls switch/case
> statements
> > >
> > > > together? Does it emulate a C compiler and, for larger case sets,
> build a
> > >
> > > > huge if/else cascade? Does it do this always? Is there any way to
> know when
> > >
> > > > it builds a jump table (like as/c is supposed to)? I've got a slow
> script
> > >
> > > > (it's eating ~85% of execution time) that I can't work around and
> one of the
> > >
> > > > slower parts is a switch case (which is slightly faster than
> manually
> > >
> > > > building an if/else cascade) and was wondering if anyone had any
> performance
> > >
> > > > tips for cases like these.
> > >
> > > >
> > >
> > > > _______________________________________________
> > >
> > > > New York PHP User Group Community Talk Mailing List
> > >
> > > > http://lists.nyphp.org/mailman/listinfo/talk
> > >
> > > >
> > >
> > > > http://www.nyphp.org/show_participation.php
> > >
> > > >
> > >
> > > _______________________________________________
> > >
> > > New York PHP User Group Community Talk Mailing List
> > >
> > > http://lists.nyphp.org/mailman/listinfo/talk
> > >
> > >
> > >
> > > http://www.nyphp.org/show_participation.php
> > >
> ------------------------------------------------------------------------
> _______________________________________________
> New York PHP User Group Community Talk Mailing List
> http://lists.nyphp.org/mailman/listinfo/talk
> http://www.nyphp.org/show_participation.php
> _______________________________________________
> New York PHP User Group Community Talk Mailing List
> http://lists.nyphp.org/mailman/listinfo/talk
> http://www.nyphp.org/show_participation.php
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.nyphp.org/pipermail/talk/attachments/20090515/218d3e8b/attachment.html>
More information about the talk
mailing list