Filename | /home/rdrake/code/netaddr-ip-fastnew/lib/NetAddr/IP/FastNew.pm |
Statements | Executed 1798405 statements in 8.59s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
405857 | 1 | 1 | 2.07s | 2.41s | new_ipv4_mask | NetAddr::IP::FastNew::
432500 | 1 | 1 | 1.88s | 2.09s | new_ipv4_cidr | NetAddr::IP::FastNew::
527528 | 1 | 1 | 1.79s | 2.01s | new_ipv4 | NetAddr::IP::FastNew::
1 | 1 | 1 | 1.26ms | 22.9ms | BEGIN@5 | NetAddr::IP::FastNew::
1 | 1 | 1 | 15µs | 28µs | BEGIN@3 | NetAddr::IP::FastNew::
1 | 1 | 1 | 14µs | 485µs | BEGIN@7 | NetAddr::IP::FastNew::
1 | 1 | 1 | 8µs | 8µs | BEGIN@11 | NetAddr::IP::FastNew::
1 | 1 | 1 | 7µs | 11µs | BEGIN@4 | NetAddr::IP::FastNew::
1 | 1 | 1 | 7µs | 62µs | BEGIN@8 | NetAddr::IP::FastNew::
0 | 0 | 0 | 0s | 0s | new | NetAddr::IP::FastNew::
0 | 0 | 0 | 0s | 0s | new_ipv6 | NetAddr::IP::FastNew::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | package NetAddr::IP::FastNew; | ||||
2 | |||||
3 | 2 | 26µs | 2 | 40µs | # spent 28µs (15+12) within NetAddr::IP::FastNew::BEGIN@3 which was called:
# once (15µs+12µs) by main::BEGIN@5 at line 3 # spent 28µs making 1 call to NetAddr::IP::FastNew::BEGIN@3
# spent 12µs making 1 call to strict::import |
4 | 2 | 22µs | 2 | 15µs | # spent 11µs (7+4) within NetAddr::IP::FastNew::BEGIN@4 which was called:
# once (7µs+4µs) by main::BEGIN@5 at line 4 # spent 11µs making 1 call to NetAddr::IP::FastNew::BEGIN@4
# spent 4µs making 1 call to warnings::import |
5 | 2 | 109µs | 2 | 23.0ms | # spent 22.9ms (1.26+21.6) within NetAddr::IP::FastNew::BEGIN@5 which was called:
# once (1.26ms+21.6ms) by main::BEGIN@5 at line 5 # spent 22.9ms making 1 call to NetAddr::IP::FastNew::BEGIN@5
# spent 76µs making 1 call to NetAddr::IP::import |
6 | # 1.95 required for inet_pton | ||||
7 | 3 | 44µs | 3 | 956µs | # spent 485µs (14+471) within NetAddr::IP::FastNew::BEGIN@7 which was called:
# once (14µs+471µs) by main::BEGIN@5 at line 7 # spent 485µs making 1 call to NetAddr::IP::FastNew::BEGIN@7
# spent 462µs making 1 call to Exporter::import
# spent 8µs making 1 call to UNIVERSAL::VERSION |
8 | 2 | 32µs | 2 | 116µs | # spent 62µs (7+55) within NetAddr::IP::FastNew::BEGIN@8 which was called:
# once (7µs+55µs) by main::BEGIN@5 at line 8 # spent 62µs making 1 call to NetAddr::IP::FastNew::BEGIN@8
# spent 55µs making 1 call to NetAddr::IP::Util::import |
9 | # the minimum version I test with. 5.10 doesn't support inet_pton. | ||||
10 | # MSWin32 also doesn't support Socket::inet_pton | ||||
11 | 2 | 1.07ms | 1 | 8µs | # spent 8µs within NetAddr::IP::FastNew::BEGIN@11 which was called:
# once (8µs+0s) by main::BEGIN@5 at line 11 # spent 8µs making 1 call to NetAddr::IP::FastNew::BEGIN@11 |
12 | |||||
13 | # The following code is from spamassassin. I may use this to workaround Socket issues, but it only | ||||
14 | # helps if Socket6 is available. Currently this only affects two platforms on | ||||
15 | # cpantesters. OpenBSD (5.5) and GNUkfreebsd (8.1), so they could just upgrade to a | ||||
16 | # version of Socket.pm that supports inet_pton (they're both running 1.94 so | ||||
17 | # they only have to go up to 1.95) | ||||
18 | |||||
19 | # # try to load inet_pton from Socket or Socket6 | ||||
20 | # my $ip6 = eval { | ||||
21 | # require Socket; | ||||
22 | # Socket->VERSION(1.95); | ||||
23 | # Socket->import( 'inet_pton' ); | ||||
24 | # 1; | ||||
25 | # } || eval { | ||||
26 | # require Socket6; | ||||
27 | # Socket6->import( 'inet_pton' ); | ||||
28 | # 1; | ||||
29 | # }; | ||||
30 | |||||
31 | 1 | 12µs | our $VERSION = eval '0.3'; # spent 2µs executing statements in string eval | ||
32 | |||||
33 | =head1 NAME | ||||
34 | |||||
35 | NetAddr::IP::FastNew - NetAddr::IP new() methods with no validation | ||||
36 | |||||
37 | =head1 VERSION | ||||
38 | |||||
39 | 0.3 | ||||
40 | |||||
41 | =head1 SYNOPSIS | ||||
42 | |||||
43 | use NetAddr::IP::FastNew; | ||||
44 | |||||
45 | my $ip = new NetAddr::IP::FastNew( '10.10.10.5' ); | ||||
46 | |||||
47 | =head1 DESCRIPTION | ||||
48 | |||||
49 | This module is designed to quickly create NetAddr::IP objects. | ||||
50 | |||||
51 | If you have a situation where you need 200_000 NetAddr::IP objects then the | ||||
52 | initialization speed can really become a problem. | ||||
53 | |||||
54 | =head1 CREDITS | ||||
55 | |||||
56 | Robert Drake, E<lt>rdrake@cpan.orgE<gt> | ||||
57 | |||||
58 | =head1 COPYRIGHT AND LICENSE | ||||
59 | |||||
60 | Copyright (C) 2014 by Robert Drake | ||||
61 | |||||
62 | This library is free software; you can redistribute it and/or modify | ||||
63 | it under the same terms as Perl itself, either Perl version 5.8.7 or, | ||||
64 | at your option, any later version of Perl 5 you may have available. | ||||
65 | |||||
66 | =cut | ||||
67 | |||||
68 | 1 | 500ns | my $zeros = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; | ||
69 | 1 | 400ns | my $ones = ~$zeros; | ||
70 | # this is to zero the ipv6 portion of the address. This is used when we're | ||||
71 | # building IPv4 objects. | ||||
72 | 1 | 200ns | my $zerov6 = "\0\0\0\0\0\0\0\0\0\0\0\0"; | ||
73 | |||||
74 | 1 | 58µs | my $masks = { | ||
75 | 0 => "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
76 | 1 => "\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
77 | 10 => "\377\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
78 | 100 => "\377\377\377\377\377\377\377\377\377\377\377\377\360\0\0\0", | ||||
79 | 101 => "\377\377\377\377\377\377\377\377\377\377\377\377\370\0\0\0", | ||||
80 | 102 => "\377\377\377\377\377\377\377\377\377\377\377\377\374\0\0\0", | ||||
81 | 103 => "\377\377\377\377\377\377\377\377\377\377\377\377\376\0\0\0", | ||||
82 | 104 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0", | ||||
83 | 105 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\200\0\0", | ||||
84 | 106 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\300\0\0", | ||||
85 | 107 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\340\0\0", | ||||
86 | 108 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\360\0\0", | ||||
87 | 109 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\370\0\0", | ||||
88 | 11 => "\377\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
89 | 110 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\374\0\0", | ||||
90 | 111 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\376\0\0", | ||||
91 | 112 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0\0", | ||||
92 | 113 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\200\0", | ||||
93 | 114 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\300\0", | ||||
94 | 115 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\340\0", | ||||
95 | 116 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\360\0", | ||||
96 | 117 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\370\0", | ||||
97 | 118 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374\0", | ||||
98 | 119 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376\0", | ||||
99 | 12 => "\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
100 | 120 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\0", | ||||
101 | 121 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\200", | ||||
102 | 122 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\300", | ||||
103 | 123 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\340", | ||||
104 | 124 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\360", | ||||
105 | 125 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\370", | ||||
106 | 126 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\374", | ||||
107 | 127 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\376", | ||||
108 | 128 => "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377", | ||||
109 | 13 => "\377\370\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
110 | 14 => "\377\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
111 | 15 => "\377\376\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
112 | 16 => "\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
113 | 17 => "\377\377\200\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
114 | 18 => "\377\377\300\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
115 | 19 => "\377\377\340\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
116 | 2 => "\300\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
117 | 20 => "\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
118 | 21 => "\377\377\370\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
119 | 22 => "\377\377\374\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
120 | 23 => "\377\377\376\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
121 | 24 => "\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
122 | 25 => "\377\377\377\200\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
123 | 26 => "\377\377\377\300\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
124 | 27 => "\377\377\377\340\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
125 | 28 => "\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
126 | 29 => "\377\377\377\370\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
127 | 3 => "\340\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
128 | 30 => "\377\377\377\374\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
129 | 31 => "\377\377\377\376\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
130 | 32 => "\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
131 | 33 => "\377\377\377\377\200\0\0\0\0\0\0\0\0\0\0\0", | ||||
132 | 34 => "\377\377\377\377\300\0\0\0\0\0\0\0\0\0\0\0", | ||||
133 | 35 => "\377\377\377\377\340\0\0\0\0\0\0\0\0\0\0\0", | ||||
134 | 36 => "\377\377\377\377\360\0\0\0\0\0\0\0\0\0\0\0", | ||||
135 | 37 => "\377\377\377\377\370\0\0\0\0\0\0\0\0\0\0\0", | ||||
136 | 38 => "\377\377\377\377\374\0\0\0\0\0\0\0\0\0\0\0", | ||||
137 | 39 => "\377\377\377\377\376\0\0\0\0\0\0\0\0\0\0\0", | ||||
138 | 4 => "\360\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
139 | 40 => "\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0\0", | ||||
140 | 41 => "\377\377\377\377\377\200\0\0\0\0\0\0\0\0\0\0", | ||||
141 | 42 => "\377\377\377\377\377\300\0\0\0\0\0\0\0\0\0\0", | ||||
142 | 43 => "\377\377\377\377\377\340\0\0\0\0\0\0\0\0\0\0", | ||||
143 | 44 => "\377\377\377\377\377\360\0\0\0\0\0\0\0\0\0\0", | ||||
144 | 45 => "\377\377\377\377\377\370\0\0\0\0\0\0\0\0\0\0", | ||||
145 | 46 => "\377\377\377\377\377\374\0\0\0\0\0\0\0\0\0\0", | ||||
146 | 47 => "\377\377\377\377\377\376\0\0\0\0\0\0\0\0\0\0", | ||||
147 | 48 => "\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0\0", | ||||
148 | 49 => "\377\377\377\377\377\377\200\0\0\0\0\0\0\0\0\0", | ||||
149 | 5 => "\370\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
150 | 50 => "\377\377\377\377\377\377\300\0\0\0\0\0\0\0\0\0", | ||||
151 | 51 => "\377\377\377\377\377\377\340\0\0\0\0\0\0\0\0\0", | ||||
152 | 52 => "\377\377\377\377\377\377\360\0\0\0\0\0\0\0\0\0", | ||||
153 | 53 => "\377\377\377\377\377\377\370\0\0\0\0\0\0\0\0\0", | ||||
154 | 54 => "\377\377\377\377\377\377\374\0\0\0\0\0\0\0\0\0", | ||||
155 | 55 => "\377\377\377\377\377\377\376\0\0\0\0\0\0\0\0\0", | ||||
156 | 56 => "\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0\0", | ||||
157 | 57 => "\377\377\377\377\377\377\377\200\0\0\0\0\0\0\0\0", | ||||
158 | 58 => "\377\377\377\377\377\377\377\300\0\0\0\0\0\0\0\0", | ||||
159 | 59 => "\377\377\377\377\377\377\377\340\0\0\0\0\0\0\0\0", | ||||
160 | 6 => "\374\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
161 | 60 => "\377\377\377\377\377\377\377\360\0\0\0\0\0\0\0\0", | ||||
162 | 61 => "\377\377\377\377\377\377\377\370\0\0\0\0\0\0\0\0", | ||||
163 | 62 => "\377\377\377\377\377\377\377\374\0\0\0\0\0\0\0\0", | ||||
164 | 63 => "\377\377\377\377\377\377\377\376\0\0\0\0\0\0\0\0", | ||||
165 | 64 => "\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0\0", | ||||
166 | 65 => "\377\377\377\377\377\377\377\377\200\0\0\0\0\0\0\0", | ||||
167 | 66 => "\377\377\377\377\377\377\377\377\300\0\0\0\0\0\0\0", | ||||
168 | 67 => "\377\377\377\377\377\377\377\377\340\0\0\0\0\0\0\0", | ||||
169 | 68 => "\377\377\377\377\377\377\377\377\360\0\0\0\0\0\0\0", | ||||
170 | 69 => "\377\377\377\377\377\377\377\377\370\0\0\0\0\0\0\0", | ||||
171 | 7 => "\376\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
172 | 70 => "\377\377\377\377\377\377\377\377\374\0\0\0\0\0\0\0", | ||||
173 | 71 => "\377\377\377\377\377\377\377\377\376\0\0\0\0\0\0\0", | ||||
174 | 72 => "\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0\0", | ||||
175 | 73 => "\377\377\377\377\377\377\377\377\377\200\0\0\0\0\0\0", | ||||
176 | 74 => "\377\377\377\377\377\377\377\377\377\300\0\0\0\0\0\0", | ||||
177 | 75 => "\377\377\377\377\377\377\377\377\377\340\0\0\0\0\0\0", | ||||
178 | 76 => "\377\377\377\377\377\377\377\377\377\360\0\0\0\0\0\0", | ||||
179 | 77 => "\377\377\377\377\377\377\377\377\377\370\0\0\0\0\0\0", | ||||
180 | 78 => "\377\377\377\377\377\377\377\377\377\374\0\0\0\0\0\0", | ||||
181 | 79 => "\377\377\377\377\377\377\377\377\377\376\0\0\0\0\0\0", | ||||
182 | 8 => "\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
183 | 80 => "\377\377\377\377\377\377\377\377\377\377\0\0\0\0\0\0", | ||||
184 | 81 => "\377\377\377\377\377\377\377\377\377\377\200\0\0\0\0\0", | ||||
185 | 82 => "\377\377\377\377\377\377\377\377\377\377\300\0\0\0\0\0", | ||||
186 | 83 => "\377\377\377\377\377\377\377\377\377\377\340\0\0\0\0\0", | ||||
187 | 84 => "\377\377\377\377\377\377\377\377\377\377\360\0\0\0\0\0", | ||||
188 | 85 => "\377\377\377\377\377\377\377\377\377\377\370\0\0\0\0\0", | ||||
189 | 86 => "\377\377\377\377\377\377\377\377\377\377\374\0\0\0\0\0", | ||||
190 | 87 => "\377\377\377\377\377\377\377\377\377\377\376\0\0\0\0\0", | ||||
191 | 88 => "\377\377\377\377\377\377\377\377\377\377\377\0\0\0\0\0", | ||||
192 | 89 => "\377\377\377\377\377\377\377\377\377\377\377\200\0\0\0\0", | ||||
193 | 9 => "\377\200\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
194 | 90 => "\377\377\377\377\377\377\377\377\377\377\377\300\0\0\0\0", | ||||
195 | 91 => "\377\377\377\377\377\377\377\377\377\377\377\340\0\0\0\0", | ||||
196 | 92 => "\377\377\377\377\377\377\377\377\377\377\377\360\0\0\0\0", | ||||
197 | 93 => "\377\377\377\377\377\377\377\377\377\377\377\370\0\0\0\0", | ||||
198 | 94 => "\377\377\377\377\377\377\377\377\377\377\377\374\0\0\0\0", | ||||
199 | 95 => "\377\377\377\377\377\377\377\377\377\377\377\376\0\0\0\0", | ||||
200 | 96 => "\377\377\377\377\377\377\377\377\377\377\377\377\0\0\0\0", | ||||
201 | 97 => "\377\377\377\377\377\377\377\377\377\377\377\377\200\0\0\0", | ||||
202 | 98 => "\377\377\377\377\377\377\377\377\377\377\377\377\300\0\0\0", | ||||
203 | 99 => "\377\377\377\377\377\377\377\377\377\377\377\377\340\0\0\0" | ||||
204 | }; | ||||
205 | |||||
206 | |||||
207 | 1 | 14µs | my $masks4 = { | ||
208 | 0 => "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", | ||||
209 | 1 => "\0\0\0\0\0\0\0\0\0\0\0\0\200\0\0\0", | ||||
210 | 3 => "\0\0\0\0\0\0\0\0\0\0\0\0\340\0\0\0", | ||||
211 | 2 => "\0\0\0\0\0\0\0\0\0\0\0\0\300\0\0\0", | ||||
212 | 4 => "\0\0\0\0\0\0\0\0\0\0\0\0\360\0\0\0", | ||||
213 | 5 => "\0\0\0\0\0\0\0\0\0\0\0\0\370\0\0\0", | ||||
214 | 6 => "\0\0\0\0\0\0\0\0\0\0\0\0\374\0\0\0", | ||||
215 | 7 => "\0\0\0\0\0\0\0\0\0\0\0\0\376\0\0\0", | ||||
216 | 8 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0", | ||||
217 | 9 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\200\0\0", | ||||
218 | 10 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\300\0\0", | ||||
219 | 11 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\340\0\0", | ||||
220 | 12 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\360\0\0", | ||||
221 | 13 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\370\0\0", | ||||
222 | 14 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\374\0\0", | ||||
223 | 15 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\376\0\0", | ||||
224 | 16 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\0\0", | ||||
225 | 17 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\200\0", | ||||
226 | 18 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\300\0", | ||||
227 | 19 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\340\0", | ||||
228 | 20 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\360\0", | ||||
229 | 21 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\370\0", | ||||
230 | 22 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\374\0", | ||||
231 | 23 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\376\0", | ||||
232 | 24 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\0", | ||||
233 | 25 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\200", | ||||
234 | 26 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\300", | ||||
235 | 27 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\340", | ||||
236 | 28 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\360", | ||||
237 | 29 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\370", | ||||
238 | 30 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\374", | ||||
239 | 31 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\376", | ||||
240 | 32 => "\0\0\0\0\0\0\0\0\0\0\0\0\377\377\377\377", | ||||
241 | }; | ||||
242 | |||||
- - | |||||
245 | =head1 METHODS | ||||
246 | |||||
247 | =head2 new | ||||
248 | |||||
249 | Right now this just calls NetAddr::IP->new(). | ||||
250 | |||||
251 | my $ip = NetAddr::IP::FastNew->new("127.0.0.1"); | ||||
252 | |||||
253 | =cut | ||||
254 | |||||
255 | sub new { | ||||
256 | # attempt to beat NetAddr::IP speeds by guessing the type of address and | ||||
257 | # initializing it. This will probably not support nearly as many formats | ||||
258 | # as the original, but will be useful to some users who want something | ||||
259 | # fast and easy. | ||||
260 | my $class = shift; | ||||
261 | return NetAddr::IP->new(@_); | ||||
262 | } | ||||
263 | |||||
264 | |||||
265 | =head2 new_ipv4 | ||||
266 | |||||
267 | Create a real NetAddr::IP from a single IPv4 address with almost no | ||||
268 | validation. This has more overhead than the FastNew new() but it's much | ||||
269 | faster if you make use of the IP object. | ||||
270 | |||||
271 | This only takes one argument, the single IP address. Anything else will fail | ||||
272 | in (probably) bad ways. Validation is completely up to you and is not done | ||||
273 | here. | ||||
274 | |||||
275 | my $ip = NetAddr::IP::FastNew->new_ipv4("127.0.0.1"); | ||||
276 | |||||
277 | =cut | ||||
278 | |||||
279 | |||||
280 | # spent 2.01s (1.79+219ms) within NetAddr::IP::FastNew::new_ipv4 which was called 527528 times, avg 4µs/call:
# 527528 times (1.79s+219ms) by main::__ANON__[examples/benchmark4.pl:10] at line 10 of examples/benchmark4.pl, avg 4µs/call | ||||
281 | 527528 | 2.81s | 527528 | 219ms | return bless { # spent 219ms making 527528 calls to Socket::inet_pton, avg 416ns/call |
282 | addr => $zerov6 . inet_pton(AF_INET, $_[1]), | ||||
283 | mask => $ones, | ||||
284 | isv6 => 0, | ||||
285 | }, 'NetAddr::IP'; | ||||
286 | } | ||||
287 | |||||
288 | =head2 new_ipv4_mask | ||||
289 | |||||
290 | Create a real NetAddr::IP from a IPv4 subnet with almost no | ||||
291 | validation. | ||||
292 | |||||
293 | This requires the IP address and the subnet mask as it's two arguments. | ||||
294 | Anything else will fail in (probably) bad ways. Validation is completely | ||||
295 | up to the caller is not done here. | ||||
296 | |||||
297 | my $ip = NetAddr::IP::FastNew->new_ipv4_mask("127.0.0.0", "255.255.255.0"); | ||||
298 | |||||
299 | =cut | ||||
300 | |||||
301 | # spent 2.41s (2.07+338ms) within NetAddr::IP::FastNew::new_ipv4_mask which was called 405857 times, avg 6µs/call:
# 405857 times (2.07s+338ms) by main::__ANON__[examples/benchmark4.pl:11] at line 11 of examples/benchmark4.pl, avg 6µs/call | ||||
302 | 405857 | 3.01s | 811714 | 338ms | return bless { # spent 338ms making 811714 calls to Socket::inet_pton, avg 417ns/call |
303 | addr => $zerov6 . inet_pton(AF_INET, $_[1]), | ||||
304 | mask => $zerov6 . inet_pton(AF_INET, $_[2]), | ||||
305 | isv6 => 0, | ||||
306 | }, 'NetAddr::IP'; | ||||
307 | } | ||||
308 | |||||
309 | =head2 new_ipv4_cidr | ||||
310 | |||||
311 | Create a real NetAddr::IP object from a IPv4 cidr with almost no | ||||
312 | validation. | ||||
313 | |||||
314 | This requires the IP address and the cidr in a single argument. | ||||
315 | Anything else will fail in (probably) bad ways. Validation is completely | ||||
316 | up to the caller is not done here. | ||||
317 | |||||
318 | my $ip = NetAddr::IP::FastNew->new_ipv4_cidr("127.0.0.0/24"); | ||||
319 | |||||
320 | =cut | ||||
321 | |||||
322 | # you can use the ipv6 mask table by saying $masks->{128-32+$cidr}. Since | ||||
323 | # it's an IPv4 address NetAddr::IP ignores the first 2 hextets. | ||||
324 | # Unfortunately, it seems to be about 50,000 calls/sec slower than having an | ||||
325 | # ipv4 mask table (I guess the overhead of doing the simple 96+$cidr math..) | ||||
326 | |||||
327 | # for whatever reason, split is faster for this too, but this is the slowest | ||||
328 | # function. Try to use the other two when possible. | ||||
329 | |||||
330 | # spent 2.09s (1.88+218ms) within NetAddr::IP::FastNew::new_ipv4_cidr which was called 432500 times, avg 5µs/call:
# 432500 times (1.88s+218ms) by main::__ANON__[examples/benchmark4.pl:12] at line 12 of examples/benchmark4.pl, avg 5µs/call | ||||
331 | 432500 | 325ms | my ($ip, $cidr) = split('/', $_[1]); | ||
332 | #my $pos = index($_[1],'/'); | ||||
333 | #my $ip = substr($_[1], 0, $pos); | ||||
334 | |||||
335 | 432500 | 2.44s | 432500 | 218ms | return bless { 'addr' => $zerov6 . inet_pton(AF_INET, $ip), # spent 218ms making 432500 calls to Socket::inet_pton, avg 504ns/call |
336 | 'mask' => $masks4->{$cidr}, | ||||
337 | 'isv6' => 0 | ||||
338 | }, 'NetAddr::IP'; | ||||
339 | } | ||||
340 | |||||
341 | =head2 new_ipv6 | ||||
342 | |||||
343 | Create a real NetAddr::IP object from an IPv6 subnet with no validation. This | ||||
344 | is almost as fast as the lazy object. The only caveat being it requires a | ||||
345 | cidr mask. | ||||
346 | |||||
347 | my $ip = NetAddr::IP::FastNew->new_ipv6("fe80::/64"); | ||||
348 | |||||
349 | =cut | ||||
350 | |||||
351 | sub new_ipv6 { | ||||
352 | my $pos = index($_[1],'/'); | ||||
353 | my $ip = substr($_[1], 0, $pos); | ||||
354 | return bless { 'addr' => inet_pton(AF_INET6, $ip), 'mask' => $masks->{substr($_[1], $pos+1)}, 'isv6' => 1 }, 'NetAddr::IP'; | ||||
355 | } | ||||
356 | |||||
357 | |||||
358 | 1 | 23µs | 1; |