Hey:

On Wed, Jun 24, 2015 at 3:13 PM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:
> Hi all,
>
> On Wed, Jun 24, 2015 at 12:20 PM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:
>>
>> On Wed, Jun 24, 2015 at 12:05 PM, Juan Basso <jrba...@gmail.com> wrote:
>>>
>>> Did you test the performance impact on strings? Since you changed how it
>>> works the impact can be positive and maybe worth to make the method more
>>> broad.
>>
>>
>> It's a bit slower (~3%) for 'abc' as input string. If I remove redundant
>> type
>> check(convert_to_string), it's better though. ~3% seems too large for 2
>> additional if statements - parameter type check. I'll look into.
>>
>> [yohgaki@dev github-php-src]$ cat b.php
>> <?php
>> const LOOP=100000000;
>>
>> $start = microtime(true);
>> for ($i = 0; $i < LOOP; $i++) {
>> }
>> $loop_time = microtime(true) - $start;
>>
>>
>> $start = microtime(true);
>> for ($i = 0; $i < LOOP; $i++) {
>> htmlspecialchars('abc');
>> }
>> echo 'Time: '.(microtime(true) - $start - $loop_time)."\n";
>>
>> [yohgaki@dev github-php-src]$ ./php.old b.php
>> Time: 4.4925589561462
>> [yohgaki@dev github-php-src]$ ./php.old b.php
>> Time: 4.4821939468384
>> [yohgaki@dev github-php-src]$ ./php.new b.php
>> Time: 4.5892491340637
>> [yohgaki@dev github-php-src]$ ./php.new b.php
>> Time: 4.6097931861877
>
>
> Followings are better approximation. New code is a bit slower even if it's
> in
> benchmark error range. ~1% - ~3% slower for strings while it's much faster
> (~70% or more. This case is more than 100%) for integers depending on
> integer size. Since integer/float is much faster, only a few presence of
> int/float
> negates negative impact.
>
> As you can see, loop only benchmark varies a lot.
> I also counted total number of CPU instructions by perf. It varies too.
> However, new code is a bit slower for sure even if there is only 2 "if"
> addition
> for strings. I was expecting use of raw zval negates this...
>
> I would like to apply similar change to most string escape/conversion
> functions.
Sorry for saying this, but I don't see any reason to do so.

the benchmark make nothing to me, since it's actually not a
recommend(right) usage at all. as I said, the fastest way to
htmlspecicalchars an integer is not calling  htmlspecicalchars against
number.

and I can always get some "benchmark" to show my "optimization" works,
like if (EXPECT()); I can always make a "benchmark" which make the
condition fails, and get some "improvement"..

if you are insist to do so,  please write an RFC, I will vote NO for it.

sorry & thanks

> (Please note that subject is "escape and conversion" function only)
> Current patch allows "resource" type, but it should raise type error.
>
> Comments are appreciated.
> Sorry for flood of mails.
>
> Regards,
>
> [yohgaki@dev github-php-src]$ ./php.old b.php
> Loop time
> Loop: 0.08224892616272
> Loop: 0.08589506149292
> Loop: 0.087536096572876
> Loop: 0.082170963287354
> Loop: 0.082328081130981
> Loop: 0.081686019897461
> Loop: 0.087927103042603
> Loop: 0.081233024597168
> Loop: 0.082290887832642
> Loop: 0.081492900848389
> Loop: 0.081452131271362
> Loop: 0.081291913986206
> Loop Avg: 0.08220899105072
> Escaping string abcdefgh
> Time: 0.6288548707962
> Time: 0.61239206790924
> Time: 0.6169821023941
> Time: 0.61680710315704
> Time: 0.60974395275116
> Time: 0.61229383945465
> Time: 0.61705410480499
> Time: 0.61985099315643
> Time: 0.61954915523529
> Time: 0.62286603450775
> Time: 0.62001097202301
> Time: 0.6216961145401
> Time Avg: 0.6166380405426
> Escaping integer 12345678
> Time: 0.98103010654449
> Time: 0.97324693202972
> Time: 0.96535289287567
> Time: 0.962033867836
> Time: 0.95926511287689
> Time: 0.9667671918869
> Time: 0.96851003170013
> Time: 0.96103513240814
> Time: 0.96122300624847
> Time: 0.95892608165741
> Time: 0.96553599834442
> Time: 0.96350586414337
> Time Avg: 0.96321551799774
>
> [yohgaki@dev github-php-src]$ ./php.new b.php
> Loop time
> Loop: 0.082480907440186
> Loop: 0.081701993942261
> Loop: 0.081080913543701
> Loop: 0.080965042114258
> Loop: 0.081230163574219
> Loop: 0.08064603805542
> Loop: 0.081595897674561
> Loop: 0.081001043319702
> Loop: 0.080890893936157
> Loop: 0.084527969360352
> Loop: 0.082308053970337
> Loop: 0.081248998641968
> Loop Avg: 0.081266903877258
> Escaping string abcdefgh
> Time: 0.62283012866974
> Time: 0.62788126468658
> Time: 0.63206312656403
> Time: 0.62420103549957
> Time: 0.62370917797089
> Time: 0.62745521068573
> Time: 0.626731133461
> Time: 0.68132016658783
> Time: 0.62430212497711
> Time: 0.63127825260162
> Time: 0.63222811222076
> Time: 0.62956402301788
> Time Avg: 0.62700154781342
> Escaping integer 12345678
> Time: 0.41526029109955
> Time: 0.41403410434723
> Time: 0.41262814998627
> Time: 0.41230318546295
> Time: 0.41555306911469
> Time: 0.40698001384735
> Time: 0.41639611721039
> Time: 0.41320106983185
> Time: 0.41369721889496
> Time: 0.42157099246979
> Time: 0.42368505001068
> Time: 0.42184422016144
> Time Avg: 0.4141624212265
>
> [yohgaki@dev github-php-src]$ cat b.php
> <?php
> const LOOP=10000000;
> const ITER=12;
>
> echo "Loop time\n";
> $t = [];
> for ($n = 0; $n < ITER; $n++) {
> $start = microtime(true);
> for ($i = 0; $i < LOOP; $i++) {
> }
> $loop_time = microtime(true) - $start;
> echo 'Loop: '.$loop_time."\n";
> $t[] = $loop_time;
> }
> // Remove max for better approximation
> unset($t[array_search(max($t), $t)]);
> unset($t[array_search(max($t), $t)]);
> $loop_time = array_sum($t)/(ITER-2);
> echo "Loop Avg: ${loop_time}\n";
>
> $s = 'abcdefgh';
> echo "Escaping string ${s}\n";
> $t = [];
> for ($n = 0; $n < ITER; $n++) {
> $start = microtime(true);
> for ($i = 0; $i < LOOP; $i++) {
> htmlspecialchars($s);
> }
> $time = (microtime(true) - $start - $loop_time);
> echo "Time: ${time}\n";
> $t[] = $time;
> }
> // Remove max for better approximation
> unset($t[array_search(max($t), $t)]);
> unset($t[array_search(max($t), $t)]);
> $time = array_sum($t)/(ITER-2);
> echo "Time Avg: ${time}\n";
>
> $s = 12345678;
> echo "Escaping integer ${s}\n";
> $t = [];
> for ($n = 0; $n < ITER; $n++) {
> $start = microtime(true);
> for ($i = 0; $i < LOOP; $i++) {
> htmlspecialchars($s);
> }
> $time = (microtime(true) - $start - $loop_time);
> echo "Time: ${time}\n";
> $t[] = $time;
> }
> // Remove max for better approximation
> unset($t[array_search(max($t), $t)]);
> unset($t[array_search(max($t), $t)]);
> $time = array_sum($t)/(ITER-2);
> echo "Time Avg: ${time}\n";
>
>
>
> --
> Yasuo Ohgaki
> yohg...@ohgaki.net



-- 
Xinchen Hui
@Laruence
http://www.laruence.com/

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to