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
oorza...@gmail.com wrote:
oops, just sent this to one guy =\
On May 14, 2009 3:52pm, oorza...@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 jcampbe...@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 oorza...@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
_______________________________________________
New York PHP User Group Community Talk Mailing List
http://lists.nyphp.org/mailman/listinfo/talk
http://www.nyphp.org/show_participation.php