After further reviews I determined that 1000 request is too small and is often 
affected by external factors far too much and tends to fluctuate wildly. 
Therefor I've made a new set of tests based on 5 run of 10,000 request each  
for every SAPI. The tests were ran at a 10 second interval with a 20 second 
interval between different tests.
The source code of the tests is as follows:
bench.php
<?php
for ($i=0; $i<100;$i++) {
        echo $i;
}
?>

This test hopefuly allows to see the performance of many small writes

bench2.php
<?php
        $str = str_repeat('a', 4096);
        for ($i=0; $i<8; $i++) {
                echo $str;
        }
?>

A more realistic test designed to see how the same can handle a fewer number 
of larger writes one may expect to see when using output_buffering.

bench3.php
<?php
        echo str_repeat('a', 30000);
?>

A test designed to determine speed of hopefuly fast writes of large data 
chunks.


The tests were all based on identical configuration of PHP 4.3.2-cvs (debug 
version) made updated this morning. And they were executed from a local 
server to another server over a 100mbit lan with maximum capacity ~11meg/sec.

------                  AP1             AP2-filter              AP2-handler     
AP2-handler+patch
bench.php               232.73  139.50          87.70                   176.03
bench2.php      133.03  120.10          121.27          119.77
bench3.php      136.67  124.10          124.27          123.93


In an attempt to correct some remaining fluctuations, are particularly visible 
in Apache 2 tests, I've discounted the fastest & the slowest test and the 
number shown above represent the average speed of the 3 'middle' tests.

My interpretation of this is that writing large amounts of data in fewer steps 
seems to be the main performance difference between all filters. With the 
current AP2 handler being extremely slow. Writing large data is virtually 
identical across all Apache 2 sapis, so any difference maybe accounted by the 
margin of error. 
Apache 1 sapi is still faster and while the difference is not great only 10 
request/second it should be noted that Apache 1 module was 
[EMAIL PROTECTED] dynamically 
and another 10-20% can be added to it had the PHP module been compiled 
directly into apache.

Attached is the patch (ap2.txt) that prevents AP2 handler from constantly 
flushing the data as soon as it is passed. As you can see in the benchmarks 
this more the doubles the performance when many writes occur. I am hoping Ian 
can explain the need for this flush, since without it the code would be 
clearly faster.

Unfortunately the actual benchmarks cannot be posted due to the message limit 
of 30k, if you want to see those, e-mail me and I'll will forward them to 
you.

Ilia
Index: sapi_apache2.c
===================================================================
RCS file: /repository/php4/sapi/apache2handler/sapi_apache2.c,v
retrieving revision 1.1.2.5
diff -u -3 -p -r1.1.2.5 sapi_apache2.c
--- sapi_apache2.c      25 Mar 2003 01:34:39 -0000      1.1.2.5
+++ sapi_apache2.c      25 Mar 2003 21:40:51 -0000
@@ -84,6 +84,7 @@ php_apache_sapi_ub_write(const char *str
                                                 r->connection->bucket_alloc);
        APR_BRIGADE_INSERT_TAIL(brigade, bucket);
 
+#ifdef ilia_0
        /* Add a Flush bucket to the end of this brigade, so that
         * the transient buckets above are more likely to make it out
         * the end of the filter instead of having to be copied into
@@ -91,7 +92,7 @@ php_apache_sapi_ub_write(const char *str
         */
        bucket = apr_bucket_flush_create(r->connection->bucket_alloc);
        APR_BRIGADE_INSERT_TAIL(brigade, bucket);
-       
+#endif
        if (ap_pass_brigade(r->output_filters, brigade) != APR_SUCCESS) {
                php_handle_aborted_connection();
        }

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

Reply via email to