WordPress.org

Make WordPress Core

Ticket #30430: test.php

File test.php, 2.9 KB (added by jamesgol, 6 years ago)

Code to test efficiency of new function

Line 
1<?php
2
3
4$methods =  array(  'my_data_clone', 'wrapped_test', 'unserser', 'shallowcopy');
5$count = 1000000;
6
7
8echo "Number of iterations per: $count\n";
9
10$a = (string) 'Some simple string';
11run_tests( 'string', $a );
12
13$a = (integer) 1234567;
14run_tests( 'integer', $a );
15
16$a = (float) 123456.78;
17run_tests( 'float', $a );
18
19$a = new StdClass();
20$a->test = 'the';
21$a->test2 = 'the';
22$a->test3 = 'the';
23
24$new = run_tests( 'stdclass', $a, 'unset($new->test2);' );
25
26$a = array();
27$a['test'] = 'the';
28$a['test2'] = 'the';
29$a['test3'] = 'the';
30run_tests( 'array', $a, 'unset( $new["test2"] );');
31
32
33$a = array();
34$a['test'] = new StdClass();
35$a['test']->test = 'the';
36$a['test']->test2 = 'the';
37$a['test']->test3 = 'the';
38run_tests( 'array of obj', $a, 'unset( $new["test"]->test2 );');
39
40$a = array();
41$a['test'] = array();
42$a['test']['leveltwo'] = new StdClass();
43$a['test']['leveltwo']->test = 'something';
44$a['test']['leveltwo']->test2 = 'something';
45$a['test']['leveltwo']->test3 = 'something';
46
47$a['test']['leveltwoa'] = new StdClass();
48$a['test']['leveltwoa']->test = 'something';
49$a['test']['leveltwoa']->test2 = 'something';
50$a['test']['leveltwoa']->test3 = 'something';
51run_tests( 'array of array of obj', $a, 'unset( $new["test"]["leveltwo"]->test2);' );
52
53
54function run_tests( $name, $what, $changer = null ) {
55        global $methods;
56        global $count;
57        foreach ($methods as $method) {
58                $start = microtime( true );
59                $new = run_test( $method, $what, $count);
60                $stop = microtime( true );
61
62                echo "Total ($name $method): " . number_format(($stop - $start), 5) . " sec\n";
63
64                $old_b4_json = json_encode( $what );
65                if (isset( $changer ) ) {
66                        eval( $changer );
67
68                }
69                $old_after_json = json_encode( $what );
70                $new_json = json_encode( $new );
71                if ( $old_b4_json !== $old_after_json ) {
72                        echo "old_b4 !== old_after ($name) ($method)\n";
73                        var_dump( $old_b4_json );
74                        var_dump( $old_after_json );
75                }
76        }
77}
78
79
80function run_test( $method, $what, $count ) {
81
82
83        for ($x = 0; $x < $count; $x++ ) {
84                $new = call_user_func( $method, $what );
85        }
86
87        return $new;
88}
89
90
91function shallowcopy( $what ) {
92        $new = $what;
93        return $new;
94}
95
96function unserser( $what ) {
97        return unserialize( serialize( $what ) );
98
99}
100
101// This was the my first attempt at the deep copy and it turned out to be the fastest
102function my_data_clone( $what ) {
103        if ( is_object( $what ) ) {
104                return clone $what;
105        } elseif ( is_array( $what ) ) {
106                $new = array();
107                foreach  ( $what as $key => $value ) {
108                        if ( is_object( $value ) ) {
109                                $new[ $key ] = clone $value;
110                        } elseif ( is_array( $value ) ) {
111                                $new[ $key ] = my_data_clone( $value );
112                        } else {
113                                $new[ $key ] = $value;
114                        }
115
116                }
117                return $new;
118        } else {
119                return $what;
120        }
121
122        return null;
123}
124
125// This is closer to what WP would do since the cache setter already does is_object
126function wrapped_test( $what ) {
127        if ( is_object( $what ) ) {
128                return clone $what;
129        } elseif ( is_array( $what ) ) {
130                return my_data_clone( $what );
131        }
132        return $what;
133}
134