@@ -50,6 +50,17 @@ Cookie: wp_ozh_wsa_visits=2; wp_ozh_wsa_visit_lasttime=xxxxxxxxxx; __utma=xxxxxx
50
50
parse ( b, data)
51
51
}
52
52
53
+ fn small_test ( b : & mut Bencher ) {
54
+ let data = include_bytes ! ( "../../http-requests.txt" ) ;
55
+ b. bytes = data. len ( ) as u64 ;
56
+ parse ( b, data)
57
+ }
58
+
59
+ fn bigger_test ( b : & mut Bencher ) {
60
+ let data = include_bytes ! ( "../../bigger.txt" ) ;
61
+ b. bytes = data. len ( ) as u64 ;
62
+ parse ( b, data)
63
+ }
53
64
54
65
fn parse ( b : & mut Bencher , buffer : & [ u8 ] ) {
55
66
use std:: mem;
@@ -60,34 +71,47 @@ fn parse(b: &mut Bencher, buffer: &[u8]) {
60
71
61
72
#[ repr( C ) ]
62
73
struct Headers < ' a > ( & ' a mut [ Header < ' a > ] ) ;
63
- let method = [ 0i8 ; 16 ] ;
64
- let path = [ 0i8 ; 100 ] ;
65
- let mut minor_version = 0 ;
66
- let mut h = [ Header ( & [ ] , & [ ] ) ; 16 ] ;
67
- let mut h_len = h. len ( ) ;
68
- let headers = Headers ( & mut h) ;
69
- let prev_buf_len = 0 ;
70
74
71
75
b. bytes = buffer. len ( ) as u64 ;
72
76
b. iter ( || {
73
77
let mut buf = black_box ( buffer) ;
74
- let ret = unsafe {
75
- pico:: ffi:: phr_parse_request (
76
- buf. as_ptr ( ) as * const _ ,
77
- buf. len ( ) ,
78
- & mut method. as_ptr ( ) ,
79
- & mut 16 ,
80
- & mut path. as_ptr ( ) ,
81
- & mut 100 ,
82
- & mut minor_version,
83
- mem:: transmute :: < * mut Header , * mut pico:: ffi:: phr_header > ( headers. 0 . as_mut_ptr ( ) ) ,
84
- & mut h_len as * mut usize as * mut _ ,
85
- prev_buf_len
86
- )
87
- } ;
88
- assert_eq ! ( ret, buf. len( ) as i32 ) ;
78
+ let mut index = 0 ;
79
+ let len = buf. len ( ) ;
80
+ while index < len {
81
+ let slice = & buf[ index..] ;
82
+
83
+ let method = [ 0i8 ; 16 ] ;
84
+ let path = [ 0i8 ; 100 ] ;
85
+ let mut minor_version = 0 ;
86
+ let mut h = [ Header ( & [ ] , & [ ] ) ; 16 ] ;
87
+ let mut h_len = h. len ( ) ;
88
+ let headers = Headers ( & mut h) ;
89
+ let prev_buf_len = 0 ;
90
+
91
+ let ret = unsafe {
92
+ pico:: ffi:: phr_parse_request (
93
+ slice. as_ptr ( ) as * const _ ,
94
+ slice. len ( ) ,
95
+ & mut method. as_ptr ( ) ,
96
+ & mut 16 ,
97
+ & mut path. as_ptr ( ) ,
98
+ & mut 100 ,
99
+ & mut minor_version,
100
+ mem:: transmute :: < * mut Header , * mut pico:: ffi:: phr_header > ( headers. 0 . as_mut_ptr ( ) ) ,
101
+ & mut h_len as * mut usize as * mut _ ,
102
+ prev_buf_len
103
+ )
104
+ } ;
105
+
106
+ if ret < 0 {
107
+ println ! ( "error: ret = {}" , ret) ;
108
+ break ;
109
+ }
110
+
111
+ index += ret as usize ;
112
+ }
89
113
} ) ;
90
114
}
91
115
92
- benchmark_group ! ( http, one_test, httparse_example_test) ;
116
+ benchmark_group ! ( http, one_test, small_test , bigger_test , httparse_example_test) ;
93
117
benchmark_main ! ( http) ;
0 commit comments