NYCPHP Meetup

NYPHP.org

[nycphp-talk] Switch-Case v. if/else

Andrew Muraco amuraco at gmail.com
Thu May 14 22:10:24 EDT 2009


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 a s/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




More information about the talk mailing list