WordPress.org

Make WordPress Core

Ticket #14889: chrisbliss18-patch-benchmark.php

File chrisbliss18-patch-benchmark.php, 6.4 KB (added by chrisbliss18, 3 years ago)
Line 
1<?php
2
3error_reporting( E_ALL );
4
5$trials = 1000000;
6
7define( 'WP_MEMORY_LIMIT', '32M' );
8
9$functions = array( 'wp_function', 'patch_function_original', 'patch_function_new', 'patch_function_new_complete', 'wp_convert_hr_to_bytes', 'map', 'aaron' );
10$comparisons = array(
11        '-1'            => '-1',
12        '100'           => '32M',
13        '1m'            => '32M',
14        '7.5G'          => '7.5G',
15        '234k'          => '32M',
16        '94556M'        => '94556M',
17        '128 M'         => '128 M',
18        '52428800'      => '52428800',
19);
20
21$normalize_mem = create_function( '$val', '$val = trim($val); $last = strtolower($val[strlen($val)-1]); switch($last) { case \'g\': $val *= 1024; case \'m\': $val *= 1024; case \'k\': $val *= 1024; return max(0, (int) $val); }' );
22
23for ( $count = 0; $count < count( $functions ); $count++ ) {
24        $function = $functions[$count];
25       
26        foreach ( $comparisons as $size => $answer ) {
27                ini_set( 'memory_limit', $size );
28               
29                $function();
30               
31                $result = ini_get( 'memory_limit' );
32               
33                echo "$function  $size => $answer ($result) ";
34               
35                if ( $answer == $result )
36                        echo "Success\n";
37                else
38                        echo "Fail\n";
39        }
40        echo "\n";
41}
42
43$results = array();
44
45for ( $count = 0; $count < $trials; $count++ ) {
46        $function = $functions[ rand( 0, count( $functions ) - 1 ) ];
47       
48        if ( ! isset( $results[$function] ) ) {
49                $results[$function] = array(
50                        'trials'                => 0,
51                        'total_time'    => 0,
52                        'trial_time'    => array(),
53                        'success_count' => 0,
54                        'total_count'   => 0,
55                );
56        }
57       
58        run_trial( $function );
59}
60
61foreach ( $functions as $function ) {
62        $result = $results[$function];
63       
64        echo "$function\n";
65        echo "==========================\n";
66        echo "Trials:           {$result['trials']}\n";
67        echo "Total Time:       {$result['total_time']}\n";
68        echo "Average Time:     " . ( $result['total_time'] / $result['trials'] ) . "\n";
69        echo "Runs per Sec:     " . ( 1 / ( $result['total_time'] / $result['trials'] ) ) . "\n";
70       
71        if ( $result['total_count'] > 0 )
72                echo "Success Rate:     " . ( $result['success_count'] / $result['total_count'] ) . "\n";
73       
74        if ( isset( $results['wp_function']['total_time'] ) )
75                echo "Speed Difference: " . ( ( $result['total_time'] - $results['wp_function']['total_time'] ) / $results['wp_function']['total_time'] ) . "\n";
76       
77        echo "\n";
78}
79
80
81
82function run_trial( $function, $count = 10 ) {
83        global $results, $comparisons;
84       
85       
86        $time = 0;
87       
88        $success_count = $total_count = 0;
89       
90        for ( $i = 0; $i < $count; $i++ ) {
91                foreach ( $comparisons as $size => $answer ) {
92                        ini_set( 'memory_limit', $size );
93                       
94                        $start = microtime( true );
95                        $function();
96                        $end = microtime( true );
97                       
98                        $time += $end - $start;
99                       
100                       
101                        if ( $answer == ini_get( 'memory_limit' ) )
102                                $success_count++;
103                        $total_count++;
104                }
105        }
106       
107       
108        $results[$function]['trials']++;
109        $results[$function]['total_time'] += $time;
110        $results[$function]['success_count'] += $success_count;
111        $results[$function]['total_count'] += $total_count;
112}
113
114
115function wp_function() {
116        if ( function_exists('memory_get_usage') && ( (int) @ini_get('memory_limit') < abs(intval(WP_MEMORY_LIMIT)) ) )
117                @ini_set('memory_limit', WP_MEMORY_LIMIT);
118}
119
120function patch_function_original() {
121        global $normalize_mem;
122       
123        if (
124                function_exists( 'memory_get_usage' )
125                && ( function_exists( $normalize_mem ) )
126                && ( $normalize_mem( @ini_get( 'memory_limit' ) ) < $normalize_mem( WP_MEMORY_LIMIT ) )
127        ) {
128                @ini_set('memory_limit', WP_MEMORY_LIMIT);
129        }
130        unset( $normalize_mem );
131}
132
133function patch_function_new() {
134        if ( function_exists( 'memory_get_usage' ) ) {
135                $memory_limit = @ini_get( 'memory_limit' );
136               
137                if ( $memory_limit > -1 ) {
138                        switch( substr( $memory_limit, -1 ) ) {
139                                case 'M': case 'm':
140                                        $memory_limit = (int) $memory_limit;
141                                        break;
142                                case 'G': case 'g':
143                                        $memory_limit = (int) $memory_limit * 1024;
144                                        break;
145                                case 'K': case 'k':
146                                        $memory_limit = (int) $memory_limit / 1024;
147                                        break;
148                                default:
149                                        $memory_limit = (int) $memory_limit / 1048576;
150                        }
151                       
152                        if ( $memory_limit < abs( intval( WP_MEMORY_LIMIT ) ) )
153                                @ini_set( 'memory_limit', WP_MEMORY_LIMIT );
154                }
155        }
156}
157
158function patch_function_new_complete() {
159        $memory_limit = @ini_get( 'memory_limit' );
160       
161        if ( $memory_limit > -1 ) {
162                $unit = strtolower( substr( $memory_limit, -1 ) );
163               
164                $wp_memory_limit = WP_MEMORY_LIMIT;
165                $wp_unit = strtolower( substr( $wp_memory_limit, -1 ) );
166               
167                if ( 'm' == $unit )
168                        $memory_limit *= 1048576;
169                else if ( 'g' == $unit )
170                        $memory_limit *= 1073741824;
171                else if ( 'k' == $unit )
172                        $memory_limit *= 1024;
173               
174                if ( 'm' == $wp_unit )
175                        $wp_memory_limit *= 1048576;
176                else if ( 'g' == $wp_unit )
177                        $wp_memory_limit *= 1073741824;
178                else if ( 'k' == $wp_unit )
179                        $wp_memory_limit *= 1024;
180               
181                if ( (int) $memory_limit < (int) $wp_memory_limit )
182                        @ini_set( 'memory_limit', WP_MEMORY_LIMIT );
183        }
184}
185
186function wp_convert_hr_to_bytes() {
187        $size = strtolower(@ini_get('memory_limit'));
188        $bytes = (int) $size;
189        if ( strpos($size, 'k') !== false )
190                $bytes = intval($size) * 1024;
191        elseif ( strpos($size, 'm') !== false )
192                $bytes = intval($size) * 1024 * 1024;
193        elseif ( strpos($size, 'g') !== false )
194                $bytes = intval($size) * 1024 * 1024 * 1024;
195       
196        $wp_size = strtolower(@ini_get('memory_limit'));
197        $wp_bytes = (int) $wp_size;
198        if ( strpos($wp_size, 'k') !== false )
199                $wp_bytes = intval($wp_size) * 1024;
200        elseif ( strpos($wp_size, 'm') !== false )
201                $wp_bytes = intval($wp_size) * 1024 * 1024;
202        elseif ( strpos($wp_size, 'g') !== false )
203                $wp_bytes = intval($wp_size) * 1024 * 1024 * 1024;
204       
205        if ( $bytes < $wp_bytes )
206                @ini_set( 'memory_limit', WP_MEMORY_LIMIT );
207}
208
209function map() {
210        $memory_limit = @ini_get( 'memory_limit' );
211       
212        if ( $memory_limit > -1 ) {
213                $map = array('g' => 1073741824, 'm' => 1048576, 'k'=> 1024);
214               
215                $unit = strtolower( substr( $memory_limit, -1 ) );
216               
217                $wp_memory_limit = WP_MEMORY_LIMIT;
218                $wp_unit = strtolower( substr( $wp_memory_limit, -1 ) );
219               
220                $memory_limit *= isset($map[$unit]) ? $map[$unit] : 1;
221                $wp_memory_limit *= isset($map[$wp_unit]) ? $map[$wp_unit] : 1;
222               
223                if ( (int) $memory_limit < (int) $wp_memory_limit )
224                        @ini_set( 'memory_limit', WP_MEMORY_LIMIT );
225        }
226}
227
228function aaron() {
229        $memory_limit = @ini_get( 'memory_limit' );
230       
231        if ( $memory_limit > -1 ) {
232                $symbol = array('B', 'K', 'M', 'G');
233               
234                $unit = strtolower( substr( $memory_limit, -1 ) );
235               
236                $wp_memory_limit = WP_MEMORY_LIMIT;
237                $wp_unit = strtolower( substr( $wp_memory_limit, -1 ) );
238               
239                $memory_limit *= pow(1024, array_search(strtoupper($unit), $symbol));
240                $wp_memory_limit *= pow(1024, array_search(strtoupper($wp_unit), $symbol));
241               
242                if ( (int) $memory_limit < (int) $wp_memory_limit )
243                        @ini_set( 'memory_limit', WP_MEMORY_LIMIT );
244        }
245}