WordPress.org

Make WordPress Core

Ticket #16137: wplf-test.php

File wplf-test.php, 2.6 KB (added by scribu, 3 years ago)

Speed test

Line 
1<?php
2
3function wp_list_filter_old( $list, $args = array(), $operator = 'AND' ) {
4        if ( ! is_array( $list ) )
5                return array();
6
7        if ( empty( $args ) )
8                return $list;
9
10        $operator = strtoupper( $operator );
11        $count = count( $args );
12        $filtered = array();
13
14        foreach ( $list as $key => $obj ) {
15                $matched = count( array_intersect_assoc( (array) $obj, $args ) );
16                if ( ( 'AND' == $operator && $matched == $count )
17                  || ( 'OR' == $operator && $matched <= $count )
18                  || ( 'NOT' == $operator && 0 == $matched ) ) {
19                        $filtered[$key] = $obj;
20                }
21        }
22
23        return $filtered;
24}
25
26function wp_list_filter_new( $list, $args = array(), $operator = 'AND' ) {
27        if ( ! is_array( $list ) )
28                return array();
29
30        if ( empty( $args ) )
31                return $list;
32
33        $operator = strtoupper( $operator );
34        $count = count( $args );
35        $filtered = array();
36
37        foreach ( $list as $key => $obj ) {
38                $to_match = (array) $obj;
39
40                $matched = 0;
41                foreach ( $args as $m_key => $m_value ) {
42                        if ( $m_value == $to_match[$m_key] )
43                                $matched++;
44                }
45
46                if ( ( 'AND' == $operator && $matched == $count )
47                  || ( 'OR' == $operator && $matched <= $count )
48                  || ( 'NOT' == $operator && 0 == $matched ) ) {
49                        $filtered[$key] = $obj;
50                }
51        }
52
53        return $filtered;
54}
55
56function wp_list_filter_new2( $list, $args = array(), $operator = 'AND' ) {
57        if ( ! is_array( $list ) )
58                return array();
59
60        if ( empty( $args ) )
61                return $list;
62
63        $operator = strtoupper( $operator );
64        $count = count( $args );
65        $filtered = array();
66
67        foreach ( $list as $key => $to_match ) {
68                if ( is_object( $to_match ) )
69                        $to_match = get_object_vars( $to_match );
70
71                $matched = 0;
72                foreach ( $args as $m_key => $m_value ) {
73                        if ( $m_value == $to_match[$m_key] )
74                                $matched++;
75                }
76
77                if ( ( 'AND' == $operator && $matched == $count )
78                  || ( 'OR' == $operator && $matched <= $count )
79                  || ( 'NOT' == $operator && 0 == $matched ) ) {
80                        $filtered[$key] = $obj;
81                }
82        }
83
84        return $filtered;
85}
86
87function run_test( $callback, $args, $times ) {
88        $start = microtime(true);
89
90        for ( $i = 0; $i < $times; $i++ )
91                call_user_func_array( $callback, $args );
92
93        $stop = microtime(true);
94
95        echo "$callback: " . ($stop - $start) . "\n";
96}
97
98
99$list = array();
100foreach ( range( 1, 200 ) as $i ) {
101        $list[] = (object) array(
102                'foo' => rand(-100, 100),
103                'bar' => rand(-100, 100),
104                'baz' => rand(-100, 100),
105                'bam' => rand(-100, 100),
106        );
107}
108
109$args = array( $list, array( 'foo' => 100, 'baz' => '50', 'bam' => 0 ), 'AND' );
110
111$times = 2000;
112
113echo '<pre>';
114
115run_test( 'wp_list_filter_old', $args, $times );
116
117run_test( 'wp_list_filter_new', $args, $times );
118
119run_test( 'wp_list_filter_new2', $args, $times );