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 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