Filename | /usr/local/lib/perl/5.14.2/MongoDB/Cursor.pm |
Statements | Executed 114 statements in 13.4s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 840µs | 4.00ms | BEGIN@25 | MongoDB::Cursor::
4 | 3 | 3 | 352µs | 13.4s | next (xsub) | MongoDB::Cursor::
4 | 3 | 3 | 229µs | 13.4s | _do_query | MongoDB::Cursor::
1 | 1 | 1 | 56µs | 5.85s | count | MongoDB::Cursor::
1 | 1 | 1 | 39µs | 5.24s | explain | MongoDB::Cursor::
3 | 2 | 2 | 30µs | 47µs | DESTROY (xsub) | MongoDB::Cursor::
3 | 2 | 2 | 30µs | 49µs | _dt_type | MongoDB::Cursor::
3 | 2 | 2 | 23µs | 63µs | limit | MongoDB::Cursor::
3 | 2 | 2 | 19µs | 31µs | _inflate_dbrefs | MongoDB::Cursor::
2 | 1 | 1 | 17µs | 26µs | fields | MongoDB::Cursor::
1 | 1 | 1 | 15µs | 27µs | _ensure_special | MongoDB::Cursor::
1 | 1 | 1 | 12µs | 3.51ms | BEGIN@24 | MongoDB::Cursor::
2 | 2 | 1 | 11µs | 19µs | reset (xsub) | MongoDB::Cursor::
1 | 1 | 1 | 9µs | 9µs | BEGIN@26 | MongoDB::Cursor::
3 | 1 | 1 | 6µs | 6µs | _init (xsub) | MongoDB::Cursor::
1 | 1 | 1 | 4µs | 4µs | CORE:match (opcode) | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | all | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | hint | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | skip | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | snapshot | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | sort | MongoDB::Cursor::
0 | 0 | 0 | 0s | 0s | tailable | MongoDB::Cursor::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # | ||||
2 | # Copyright 2009-2013 MongoDB, Inc. | ||||
3 | # | ||||
4 | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||
5 | # you may not use this file except in compliance with the License. | ||||
6 | # You may obtain a copy of the License at | ||||
7 | # | ||||
8 | # http://www.apache.org/licenses/LICENSE-2.0 | ||||
9 | # | ||||
10 | # Unless required by applicable law or agreed to in writing, software | ||||
11 | # distributed under the License is distributed on an "AS IS" BASIS, | ||||
12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||
13 | # See the License for the specific language governing permissions and | ||||
14 | # limitations under the License. | ||||
15 | # | ||||
16 | |||||
17 | package MongoDB::Cursor; | ||||
18 | { | ||||
19 | 2 | 1µs | $MongoDB::Cursor::VERSION = '0.702.2'; | ||
20 | } | ||||
21 | |||||
22 | |||||
23 | # ABSTRACT: A cursor/iterator for Mongo query results | ||||
24 | 2 | 32µs | 2 | 7.00ms | # spent 3.51ms (12µs+3.50) within MongoDB::Cursor::BEGIN@24 which was called:
# once (12µs+3.50ms) by MongoDB::Connection::BEGIN@27 at line 24 # spent 3.51ms making 1 call to MongoDB::Cursor::BEGIN@24
# spent 3.50ms making 1 call to Moose::Exporter::__ANON__[Moose/Exporter.pm:519] |
25 | 2 | 118µs | 2 | 4.00ms | # spent 4.00ms (840µs+3.16) within MongoDB::Cursor::BEGIN@25 which was called:
# once (840µs+3.16ms) by MongoDB::Connection::BEGIN@27 at line 25 # spent 4.00ms making 1 call to MongoDB::Cursor::BEGIN@25
# spent 6µs making 1 call to boolean::import |
26 | 2 | 953µs | 1 | 9µs | # spent 9µs within MongoDB::Cursor::BEGIN@26 which was called:
# once (9µs+0s) by MongoDB::Connection::BEGIN@27 at line 26 # spent 9µs making 1 call to MongoDB::Cursor::BEGIN@26 |
27 | |||||
28 | |||||
29 | 1 | 20µs | $MongoDB::Cursor::_request_id = int(rand(1000000)); | ||
30 | |||||
31 | |||||
32 | 1 | 100ns | $MongoDB::Cursor::slave_okay = 0; | ||
33 | |||||
34 | |||||
35 | 1 | 100ns | $MongoDB::Cursor::timeout = 30000; | ||
36 | |||||
37 | |||||
38 | 1 | 3µs | 1 | 2.55ms | has started_iterating => ( # spent 2.55ms making 1 call to Moose::has |
39 | is => 'rw', | ||||
40 | isa => 'Bool', | ||||
41 | required => 1, | ||||
42 | default => 0, | ||||
43 | ); | ||||
44 | |||||
45 | 1 | 2µs | 1 | 2.33ms | has _client => ( # spent 2.33ms making 1 call to Moose::has |
46 | is => 'ro', | ||||
47 | isa => 'MongoDB::MongoClient', | ||||
48 | required => 1, | ||||
49 | ); | ||||
50 | |||||
51 | 1 | 1µs | 1 | 1.53ms | has _ns => ( # spent 1.53ms making 1 call to Moose::has |
52 | is => 'ro', | ||||
53 | isa => 'Str', | ||||
54 | required => 1, | ||||
55 | ); | ||||
56 | |||||
57 | 1 | 2µs | 1 | 1.43ms | has _query => ( # spent 1.43ms making 1 call to Moose::has |
58 | is => 'rw', | ||||
59 | required => 1, | ||||
60 | ); | ||||
61 | |||||
62 | 1 | 1µs | 1 | 1.33ms | has _fields => ( # spent 1.33ms making 1 call to Moose::has |
63 | is => 'rw', | ||||
64 | required => 0, | ||||
65 | ); | ||||
66 | |||||
67 | 1 | 1µs | 1 | 1.76ms | has _limit => ( # spent 1.76ms making 1 call to Moose::has |
68 | is => 'rw', | ||||
69 | isa => 'Int', | ||||
70 | required => 0, | ||||
71 | default => 0, | ||||
72 | ); | ||||
73 | |||||
74 | 1 | 1µs | 1 | 1.74ms | has _skip => ( # spent 1.74ms making 1 call to Moose::has |
75 | is => 'rw', | ||||
76 | isa => 'Int', | ||||
77 | required => 0, | ||||
78 | default => 0, | ||||
79 | ); | ||||
80 | |||||
81 | 1 | 1µs | 1 | 1.70ms | has _tailable => ( # spent 1.70ms making 1 call to Moose::has |
82 | is => 'rw', | ||||
83 | isa => 'Bool', | ||||
84 | required => 0, | ||||
85 | default => 0, | ||||
86 | ); | ||||
87 | |||||
- - | |||||
93 | 1 | 1µs | 1 | 1.70ms | has immortal => ( # spent 1.70ms making 1 call to Moose::has |
94 | is => 'rw', | ||||
95 | isa => 'Bool', | ||||
96 | required => 0, | ||||
97 | default => 0, | ||||
98 | ); | ||||
99 | |||||
- - | |||||
102 | 1 | 1µs | 1 | 1.73ms | has partial => ( # spent 1.73ms making 1 call to Moose::has |
103 | is => 'rw', | ||||
104 | isa => 'Bool', | ||||
105 | required => 0, | ||||
106 | default => 0, | ||||
107 | ); | ||||
108 | |||||
109 | |||||
110 | 1 | 1µs | 1 | 1.72ms | has slave_okay => ( # spent 1.72ms making 1 call to Moose::has |
111 | is => 'rw', | ||||
112 | isa => 'Bool', | ||||
113 | required => 0, | ||||
114 | default => 0, | ||||
115 | ); | ||||
116 | |||||
117 | |||||
118 | # stupid hack for inconsistent database handling of queries | ||||
119 | 1 | 1µs | 1 | 1.80ms | has _grrrr => ( # spent 1.80ms making 1 call to Moose::has |
120 | is => 'rw', | ||||
121 | isa => 'Bool', | ||||
122 | default => 0, | ||||
123 | ); | ||||
124 | |||||
125 | 1 | 2µs | 1 | 1.77ms | has _request_id => ( # spent 1.77ms making 1 call to Moose::has |
126 | is => 'rw', | ||||
127 | isa => 'Int', | ||||
128 | default => 0, | ||||
129 | ); | ||||
130 | |||||
131 | |||||
132 | # spent 27µs (15+12) within MongoDB::Cursor::_ensure_special which was called:
# once (15µs+12µs) by MongoDB::Cursor::explain at line 256 | ||||
133 | 4 | 11µs | my ($self) = @_; | ||
134 | |||||
135 | 1 | 3µs | if ($self->_grrrr) { # spent 3µs making 1 call to MongoDB::Cursor::_grrrr | ||
136 | return; | ||||
137 | } | ||||
138 | |||||
139 | 1 | 5µs | $self->_grrrr(1); # spent 5µs making 1 call to MongoDB::Cursor::_grrrr | ||
140 | 2 | 5µs | $self->_query({'query' => $self->_query}) # spent 5µs making 2 calls to MongoDB::Cursor::_query, avg 2µs/call | ||
141 | } | ||||
142 | |||||
143 | # this does the query if it hasn't been done yet | ||||
144 | # spent 13.4s (229µs+13.4) within MongoDB::Cursor::_do_query which was called 4 times, avg 3.35s/call:
# 2 times (129µs+5.85s) by MongoDB::Cursor::next at line 144 of MongoDB/Collection.pm, avg 2.92s/call
# once (48µs+5.24s) by MongoDB::Cursor::next at line 259
# once (52µs+2.31s) by MongoDB::Cursor::next at line 40 of mentat.storage.mongo.pl | ||||
145 | 32 | 378µs | my ($self) = @_; | ||
146 | |||||
147 | 4 | 12µs | if ($self->started_iterating) { # spent 12µs making 4 calls to MongoDB::Cursor::started_iterating, avg 3µs/call | ||
148 | return; | ||||
149 | } | ||||
150 | |||||
151 | 16 | 44µs | my $opts = ($self->_tailable() << 1) | # spent 12µs making 4 calls to MongoDB::Cursor::_tailable, avg 3µs/call
# spent 11µs making 4 calls to MongoDB::Cursor::partial, avg 3µs/call
# spent 11µs making 4 calls to MongoDB::Cursor::slave_okay, avg 3µs/call
# spent 10µs making 4 calls to MongoDB::Cursor::immortal, avg 3µs/call | ||
152 | (($MongoDB::Cursor::slave_okay | $self->slave_okay) << 2) | | ||||
153 | ($self->immortal << 4) | | ||||
154 | ($self->partial << 7); | ||||
155 | |||||
156 | 1 | 38µs | 36 | 241µs | my ($query, $info) = MongoDB::write_query($self->_ns, $opts, $self->_skip, $self->_limit, $self->_query, $self->_fields); # spent 176µs making 4 calls to MongoDB::write_query, avg 44µs/call
# spent 15µs making 6 calls to MongoDB::BSON::Binary::subtype, avg 2µs/call
# spent 12µs making 6 calls to MongoDB::BSON::Binary::data, avg 2µs/call
# spent 11µs making 4 calls to MongoDB::Cursor::_ns, avg 3µs/call
# spent 11µs making 4 calls to MongoDB::Cursor::_skip, avg 3µs/call
# spent 7µs making 4 calls to MongoDB::Cursor::_query, avg 2µs/call
# spent 6µs making 4 calls to MongoDB::Cursor::_fields, avg 2µs/call
# spent 4µs making 4 calls to MongoDB::Cursor::_limit, avg 1µs/call |
157 | 4 | 41µs | $self->_request_id($info->{'request_id'}); # spent 41µs making 4 calls to MongoDB::Cursor::_request_id, avg 10µs/call | ||
158 | |||||
159 | 8 | 84µs | $self->_client->send($query); # spent 75µs making 4 calls to MongoDB::MongoClient::send, avg 19µs/call
# spent 9µs making 4 calls to MongoDB::Cursor::_client, avg 2µs/call | ||
160 | 1 | 13.4s | 20 | 13.4s | $self->_client->recv($self); # spent 13.4s making 4 calls to MongoDB::MongoClient::recv, avg 3.35s/call
# spent 38µs making 4 calls to MongoDB::Cursor::_request_id, avg 10µs/call
# spent 26µs making 8 calls to MongoDB::Cursor::_client, avg 3µs/call
# spent 11µs making 4 calls to MongoDB::MongoClient::query_timeout, avg 3µs/call |
161 | |||||
162 | 4 | 38µs | $self->started_iterating(1); # spent 38µs making 4 calls to MongoDB::Cursor::started_iterating, avg 10µs/call | ||
163 | } | ||||
164 | |||||
165 | |||||
166 | # spent 26µs (17+9) within MongoDB::Cursor::fields which was called 2 times, avg 13µs/call:
# 2 times (17µs+9µs) by MongoDB::Collection::find_one at line 144 of MongoDB/Collection.pm, avg 13µs/call | ||||
167 | 10 | 15µs | my ($self, $f) = @_; | ||
168 | 2 | 2µs | confess "cannot set fields after querying" # spent 2µs making 2 calls to MongoDB::Cursor::started_iterating, avg 1µs/call | ||
169 | if $self->started_iterating; | ||||
170 | confess 'not a hash reference' | ||||
171 | unless ref $f eq 'HASH' || ref $f eq 'Tie::IxHash'; | ||||
172 | |||||
173 | 2 | 7µs | $self->_fields($f); # spent 7µs making 2 calls to MongoDB::Cursor::_fields, avg 3µs/call | ||
174 | return $self; | ||||
175 | } | ||||
176 | |||||
177 | |||||
178 | sub sort { | ||||
179 | my ($self, $order) = @_; | ||||
180 | confess "cannot set sort after querying" | ||||
181 | if $self->started_iterating; | ||||
182 | confess 'not a hash reference' | ||||
183 | unless ref $order eq 'HASH' || ref $order eq 'Tie::IxHash'; | ||||
184 | |||||
185 | $self->_ensure_special; | ||||
186 | $self->_query->{'orderby'} = $order; | ||||
187 | return $self; | ||||
188 | } | ||||
189 | |||||
- - | |||||
192 | # spent 63µs (23+40) within MongoDB::Cursor::limit which was called 3 times, avg 21µs/call:
# 2 times (15µs+26µs) by MongoDB::Collection::find_one at line 144 of MongoDB/Collection.pm, avg 21µs/call
# once (8µs+14µs) by MongoDB::Cursor::explain at line 260 | ||||
193 | 12 | 20µs | my ($self, $num) = @_; | ||
194 | 3 | 7µs | confess "cannot set limit after querying" # spent 7µs making 3 calls to MongoDB::Cursor::started_iterating, avg 2µs/call | ||
195 | if $self->started_iterating; | ||||
196 | |||||
197 | 3 | 32µs | $self->_limit($num); # spent 32µs making 3 calls to MongoDB::Cursor::_limit, avg 11µs/call | ||
198 | return $self; | ||||
199 | } | ||||
200 | |||||
- - | |||||
203 | sub tailable { | ||||
204 | my($self, $bool) = @_; | ||||
205 | confess "cannot set tailable after querying" | ||||
206 | if $self->started_iterating; | ||||
207 | |||||
208 | $self->_tailable($bool); | ||||
209 | return $self; | ||||
210 | } | ||||
211 | |||||
- - | |||||
215 | sub skip { | ||||
216 | my ($self, $num) = @_; | ||||
217 | confess "cannot set skip after querying" | ||||
218 | if $self->started_iterating; | ||||
219 | |||||
220 | $self->_skip($num); | ||||
221 | return $self; | ||||
222 | } | ||||
223 | |||||
224 | |||||
225 | sub snapshot { | ||||
226 | my ($self) = @_; | ||||
227 | confess "cannot set snapshot after querying" | ||||
228 | if $self->started_iterating; | ||||
229 | |||||
230 | $self->_ensure_special; | ||||
231 | $self->_query->{'$snapshot'} = 1; | ||||
232 | return $self; | ||||
233 | } | ||||
234 | |||||
235 | |||||
236 | sub hint { | ||||
237 | my ($self, $index) = @_; | ||||
238 | confess "cannot set hint after querying" | ||||
239 | if $self->started_iterating; | ||||
240 | confess 'not a hash reference' | ||||
241 | unless ref $index eq 'HASH' || ref $index eq 'Tie::IxHash'; | ||||
242 | |||||
243 | $self->_ensure_special; | ||||
244 | $self->_query->{'$hint'} = $index; | ||||
245 | return $self; | ||||
246 | } | ||||
247 | |||||
248 | |||||
249 | # spent 5.24s (39µs+5.24) within MongoDB::Cursor::explain which was called:
# once (39µs+5.24s) by Mentat::Storage::Mongo::_set_last_index at line 829 of Mentat/Storage/Mongo.pm | ||||
250 | 9 | 25µs | my ($self) = @_; | ||
251 | 1 | 2µs | my $temp = $self->_limit; # spent 2µs making 1 call to MongoDB::Cursor::_limit | ||
252 | 1 | 1µs | if ($self->_limit > 0) { # spent 1µs making 1 call to MongoDB::Cursor::_limit | ||
253 | $self->_limit($self->_limit * -1); | ||||
254 | } | ||||
255 | |||||
256 | 1 | 27µs | $self->_ensure_special; # spent 27µs making 1 call to MongoDB::Cursor::_ensure_special | ||
257 | 2 | 3µs | $self->_query->{'$explain'} = boolean::true; # spent 2µs making 1 call to boolean::true
# spent 1µs making 1 call to MongoDB::Cursor::_query | ||
258 | |||||
259 | 1 | 242µs | 27 | 10.5s | my $retval = $self->reset->next; # spent 5.24s making 1 call to MongoDB::Cursor::next
# spent 5.24s making 1 call to MongoDB::Cursor::_do_query
# spent 17µs making 19 calls to boolean::false, avg 900ns/call
# spent 15µs making 1 call to MongoDB::Cursor::_dt_type
# spent 11µs making 1 call to MongoDB::Cursor::_inflate_dbrefs
# spent 8µs making 1 call to MongoDB::Cursor::reset
# spent 3µs making 1 call to MongoDB::Cursor::started_iterating
# spent 3µs making 1 call to MongoDB::Cursor::_limit
# spent 1µs making 1 call to MongoDB::Cursor::_client |
260 | 1 | 5µs | 3 | 37µs | $self->reset->limit($temp); # spent 21µs making 1 call to MongoDB::Cursor::limit
# spent 11µs making 1 call to MongoDB::Cursor::reset
# spent 5µs making 1 call to MongoDB::Cursor::started_iterating |
261 | |||||
262 | 1 | 3µs | undef $self->_query->{'$explain'}; # spent 3µs making 1 call to MongoDB::Cursor::_query | ||
263 | |||||
264 | return $retval; | ||||
265 | } | ||||
266 | |||||
267 | |||||
268 | # spent 5.85s (56µs+5.85) within MongoDB::Cursor::count which was called:
# once (56µs+5.85s) by Mentat::Storage::Mongo::find_i at line 398 of Mentat/Storage/Mongo.pm | ||||
269 | 8 | 41µs | my ($self, $all) = @_; | ||
270 | |||||
271 | 2 | 5µs | my ($db, $coll) = $self->_ns =~ m/^([^\.]+)\.(.*)/; # spent 4µs making 1 call to MongoDB::Cursor::CORE:match
# spent 2µs making 1 call to MongoDB::Cursor::_ns | ||
272 | 1 | 21µs | my $cmd = new Tie::IxHash(count => $coll); # spent 21µs making 1 call to Tie::IxHash::new | ||
273 | |||||
274 | 1 | 3µs | 1 | 4µs | if ($self->_grrrr) { # spent 4µs making 1 call to MongoDB::Cursor::_grrrr |
275 | $cmd->Push(query => $self->_query->{'query'}); | ||||
276 | } | ||||
277 | else { | ||||
278 | 2 | 9µs | $cmd->Push(query => $self->_query); # spent 8µs making 1 call to Tie::IxHash::Push
# spent 1µs making 1 call to MongoDB::Cursor::_query | ||
279 | } | ||||
280 | |||||
281 | if ($all) { | ||||
282 | $cmd->Push(limit => $self->_limit) if $self->_limit; | ||||
283 | $cmd->Push(skip => $self->_skip) if $self->_skip; | ||||
284 | } | ||||
285 | |||||
286 | 3 | 5.85s | my $result = $self->_client->get_database($db)->run_command($cmd); # spent 5.85s making 1 call to MongoDB::Database::run_command
# spent 20µs making 1 call to MongoDB::MongoClient::get_database
# spent 1µs making 1 call to MongoDB::Cursor::_client | ||
287 | |||||
288 | # returns "ns missing" if collection doesn't exist | ||||
289 | 1 | 1µs | 1 | 5µs | return 0 unless ref $result eq 'HASH'; # spent 5µs making 1 call to MongoDB::Database::DESTROY |
290 | return $result->{'n'}; | ||||
291 | } | ||||
292 | |||||
293 | |||||
294 | # shortcut to make some XS code saner | ||||
295 | # spent 49µs (30+19) within MongoDB::Cursor::_dt_type which was called 3 times, avg 16µs/call:
# 2 times (21µs+12µs) by MongoDB::Cursor::next at line 144 of MongoDB/Collection.pm, avg 17µs/call
# once (8µs+7µs) by MongoDB::Cursor::next at line 259 | ||||
296 | 6 | 26µs | my $self = shift; | ||
297 | 6 | 19µs | return $self->_client->dt_type; # spent 12µs making 3 calls to MongoDB::MongoClient::dt_type, avg 4µs/call
# spent 7µs making 3 calls to MongoDB::Cursor::_client, avg 2µs/call | ||
298 | } | ||||
299 | |||||
300 | # spent 31µs (19+12) within MongoDB::Cursor::_inflate_dbrefs which was called 3 times, avg 10µs/call:
# 2 times (12µs+7µs) by MongoDB::Cursor::next at line 144 of MongoDB/Collection.pm, avg 10µs/call
# once (6µs+4µs) by MongoDB::Cursor::next at line 259 | ||||
301 | 6 | 17µs | my $self = shift; | ||
302 | 6 | 12µs | return $self->_client->inflate_dbrefs; # spent 9µs making 3 calls to MongoDB::MongoClient::inflate_dbrefs, avg 3µs/call
# spent 3µs making 3 calls to MongoDB::Cursor::_client, avg 1µs/call | ||
303 | } | ||||
304 | |||||
- - | |||||
307 | sub all { | ||||
308 | my ($self) = @_; | ||||
309 | my @ret; | ||||
310 | |||||
311 | while (my $entry = $self->next) { | ||||
312 | push @ret, $entry; | ||||
313 | } | ||||
314 | |||||
315 | return @ret; | ||||
316 | } | ||||
317 | |||||
318 | |||||
319 | 1 | 6µs | 2 | 22.7ms | __PACKAGE__->meta->make_immutable (inline_destructor => 0); # spent 22.6ms making 1 call to Class::MOP::Class::make_immutable
# spent 13µs making 1 call to MongoDB::Cursor::meta |
320 | |||||
321 | 1 | 18µs | 1; | ||
322 | |||||
323 | __END__ | ||||
# spent 4µs within MongoDB::Cursor::CORE:match which was called:
# once (4µs+0s) by MongoDB::Cursor::count at line 271 | |||||
# spent 47µs (30+17) within MongoDB::Cursor::DESTROY which was called 3 times, avg 16µs/call:
# 2 times (18µs+8µs) by MongoDB::Database::run_command at line 110 of MongoDB/Database.pm, avg 13µs/call
# once (13µs+9µs) by main::NULL at line 0 of mentat.storage.mongo.pl | |||||
# spent 6µs within MongoDB::Cursor::_init which was called 3 times, avg 2µs/call:
# 3 times (6µs+0s) by MongoDB::Collection::find at line 125 of MongoDB/Collection.pm, avg 2µs/call | |||||
# spent 13.4s (352µs+13.4) within MongoDB::Cursor::next which was called 4 times, avg 3.35s/call:
# 2 times (76µs+5.85s) by MongoDB::Collection::find_one at line 144 of MongoDB/Collection.pm, avg 2.92s/call
# once (256µs+5.24s) by MongoDB::Cursor::explain at line 259
# once (20µs+2.31s) by main::RUNTIME at line 40 of mentat.storage.mongo.pl | |||||
sub MongoDB::Cursor::reset; # xsub |