← Index
NYTProf Performance Profile   « line view »
For webmerge/scripts/webmerge.pl
  Run on Mon Oct 7 02:42:42 2013
Reported on Mon Oct 7 03:03:21 2013

Filename/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/RTP/Webmerge/IO.pm
StatementsExecuted 62863 statements in 7.25s
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
1542113.72s3.72sRTP::Webmerge::IO::::CORE:syswriteRTP::Webmerge::IO::CORE:syswrite (opcode)
39331.87s5.70sRTP::Webmerge::IO::::writefileRTP::Webmerge::IO::writefile
261864842ms4.53sRTP::Webmerge::IO::::readfileRTP::Webmerge::IO::readfile
265321360ms391msRTP::Webmerge::IO::::lock_fileRTP::Webmerge::IO::lock_file
261411200ms200msRTP::Webmerge::IO::::CORE:sysopenRTP::Webmerge::IO::CORE:sysopen (opcode)
71581177.3ms77.3msRTP::Webmerge::IO::::CORE:sysreadRTP::Webmerge::IO::CORE:sysread (opcode)
26141164.0ms64.0msRTP::Webmerge::IO::::CORE:closeRTP::Webmerge::IO::CORE:close (opcode)
26532142.8ms42.8msRTP::Webmerge::IO::::CORE:ftisRTP::Webmerge::IO::CORE:ftis (opcode)
26922131.5ms31.5msRTP::Webmerge::IO::::CORE:flockRTP::Webmerge::IO::CORE:flock (opcode)
26141110.8ms10.8msRTP::Webmerge::IO::::CORE:substRTP::Webmerge::IO::CORE:subst (opcode)
1112.21ms17.7msRTP::Webmerge::IO::::BEGIN@38RTP::Webmerge::IO::BEGIN@38
39111.05ms1.05msRTP::Webmerge::IO::::CORE:ftdirRTP::Webmerge::IO::CORE:ftdir (opcode)
11185µs340µsRTP::Webmerge::IO::::BEGIN@8RTP::Webmerge::IO::BEGIN@8
11159µs310µsRTP::Webmerge::IO::::BEGIN@29RTP::Webmerge::IO::BEGIN@29
11158µs320µsRTP::Webmerge::IO::::BEGIN@32RTP::Webmerge::IO::BEGIN@32
11154µs87µsRTP::Webmerge::IO::::BEGIN@10RTP::Webmerge::IO::BEGIN@10
11153µs53µsRTP::Webmerge::IO::::BEGIN@18.12RTP::Webmerge::IO::BEGIN@18.12
11152µs385µsRTP::Webmerge::IO::::BEGIN@35RTP::Webmerge::IO::BEGIN@35
11150µs140µsRTP::Webmerge::IO::::BEGIN@9RTP::Webmerge::IO::BEGIN@9
11128µs28µsRTP::Webmerge::IO::::BEGIN@21RTP::Webmerge::IO::BEGIN@21
11126µs26µsRTP::Webmerge::IO::::BEGIN@24RTP::Webmerge::IO::BEGIN@24
11122µs22µsRTP::Webmerge::IO::::BEGIN@18RTP::Webmerge::IO::BEGIN@18
11122µs22µsRTP::Webmerge::IO::::BEGIN@15RTP::Webmerge::IO::BEGIN@15
0000s0sRTP::Webmerge::IO::::__ANON__[:66]RTP::Webmerge::IO::__ANON__[:66]
0000s0sRTP::Webmerge::IO::::filelistRTP::Webmerge::IO::filelist
0000s0sRTP::Webmerge::IO::::processfileRTP::Webmerge::IO::processfile
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1###################################################################################################
2# Copyright 2013 by Marcel Greter
3# This file is part of Webmerge (GPL3)
4###################################################################################################
5package RTP::Webmerge::IO;
6###################################################################################################
7
82157µs2595µs
# spent 340µs (85+255) within RTP::Webmerge::IO::BEGIN@8 which was called: # once (85µs+255µs) by main::BEGIN@29 at line 8
use Carp;
# spent 340µs making 1 call to RTP::Webmerge::IO::BEGIN@8 # spent 255µs making 1 call to Exporter::import
92145µs2231µs
# spent 140µs (50+91) within RTP::Webmerge::IO::BEGIN@9 which was called: # once (50µs+91µs) by main::BEGIN@29 at line 9
use strict;
# spent 140µs making 1 call to RTP::Webmerge::IO::BEGIN@9 # spent 91µs making 1 call to strict::import
102193µs2119µs
# spent 87µs (54+32) within RTP::Webmerge::IO::BEGIN@10 which was called: # once (54µs+32µs) by main::BEGIN@29 at line 10
use warnings;
# spent 87µs making 1 call to RTP::Webmerge::IO::BEGIN@10 # spent 32µs making 1 call to warnings::import
11
12###################################################################################################
13
14# define our version string
151145µs122µs
# spent 22µs within RTP::Webmerge::IO::BEGIN@15 which was called: # once (22µs+0s) by main::BEGIN@29 at line 15
BEGIN { $RTP::Webmerge::IO::VERSION = "0.70" }
# spent 22µs making 1 call to RTP::Webmerge::IO::BEGIN@15
16
17# load exporter and inherit from it
183369µs275µs
# spent 22µs within RTP::Webmerge::IO::BEGIN@18 which was called: # once (22µs+0s) by main::BEGIN@29 at line 18 # spent 53µs within RTP::Webmerge::IO::BEGIN@18.12 which was called: # once (53µs+0s) by main::BEGIN@29 at line 18
BEGIN { use Exporter qw(); our @ISA = qw(Exporter) }
# spent 53µs making 1 call to RTP::Webmerge::IO::BEGIN@18.12 # spent 22µs making 1 call to RTP::Webmerge::IO::BEGIN@18
19
20# define our functions to be exported
211178µs128µs
# spent 28µs within RTP::Webmerge::IO::BEGIN@21 which was called: # once (28µs+0s) by main::BEGIN@29 at line 21
BEGIN { our @EXPORT = qw(readfile writefile); }
# spent 28µs making 1 call to RTP::Webmerge::IO::BEGIN@21
22
23# define our functions to be exported
241148µs126µs
# spent 26µs within RTP::Webmerge::IO::BEGIN@24 which was called: # once (26µs+0s) by main::BEGIN@29 at line 24
BEGIN { our @EXPORT_OK = qw(processfile filelist); }
# spent 26µs making 1 call to RTP::Webmerge::IO::BEGIN@24
25
26###################################################################################################
27
28# resolve filepath
292165µs2561µs
# spent 310µs (59+251) within RTP::Webmerge::IO::BEGIN@29 which was called: # once (59µs+251µs) by main::BEGIN@29 at line 29
use File::Basename;
# spent 310µs making 1 call to RTP::Webmerge::IO::BEGIN@29 # spent 251µs making 1 call to Exporter::import
30
31# load webmerge core path module
322171µs2582µs
# spent 320µs (58+262) within RTP::Webmerge::IO::BEGIN@32 which was called: # once (58µs+262µs) by main::BEGIN@29 at line 32
use RTP::Webmerge::Path;
# spent 320µs making 1 call to RTP::Webmerge::IO::BEGIN@32 # spent 262µs making 1 call to Exporter::import
33
34# override core glob (case insensitive)
352184µs2717µs
# spent 385µs (52+332) within RTP::Webmerge::IO::BEGIN@35 which was called: # once (52µs+332µs) by main::BEGIN@29 at line 35
use File::Glob qw(:globally :nocase bsd_glob);
# spent 385µs making 1 call to RTP::Webmerge::IO::BEGIN@35 # spent 332µs making 1 call to File::Glob::import
36
37# load flags for the system file operation calls
3827.28ms220.2ms
# spent 17.7ms (2.21+15.4) within RTP::Webmerge::IO::BEGIN@38 which was called: # once (2.21ms+15.4ms) by main::BEGIN@29 at line 38
use Fcntl qw(O_RDWR O_RDONLY LOCK_EX SEEK_SET LOCK_UN);
# spent 17.7ms making 1 call to RTP::Webmerge::IO::BEGIN@38 # spent 2.54ms making 1 call to Exporter::import
39
40###################################################################################################
41
42# lock file exclusive
43# return false if lock could not be
44# aquired after the given timeout (in s)
45sub lock_file
46
# spent 391ms (360+31.1) within RTP::Webmerge::IO::lock_file which was called 2653 times, avg 147µs/call: # 2614 times (354ms+30.7ms) by RTP::Webmerge::IO::readfile at line 143, avg 147µs/call # 39 times (5.62ms+454µs) by RTP::Webmerge::IO::writefile at line 259, avg 156µs/call
{
47
48 # get input variables
49265313.7ms my ($fh, $flag, $timeout) = @_;
50
51 # simply lock with blocking when no timeout given
5226533.80ms return flock($fh, $flag) unless defined $timeout;
53
54 # this is an alternative locking mechanism with timeout
55 # it has the disadvantage that while we are waiting in the
56 # select call another process might get the lock before us
57 # my $time = time; while($time + $timeout > time) {
58 # return 1 if(flock($fh, $lock | LOCK_NB));
59 # select(undef, undef, undef, $intervall) }
60
61 # eval in perl is a bit like try/catch
62 eval
63265313.3ms {
64
65 # die needs the "\n" to not append trace
662653134ms local $SIG{ALRM} = sub { die "alarm\n" };
67
68 # setup the alarm
69265326.8ms alarm $timeout;
70
71 # try to lock the file
72265374.0ms265331.1ms flock($fh, $flag);
# spent 31.1ms making 2653 calls to RTP::Webmerge::IO::CORE:flock, avg 12µs/call
73
74 # reset alarm
75265381.0ms alarm 0;
76
77 };
78
79 # there was an error
8026532.54ms if ($@)
81 {
82
83 # propagate unexpected errors
84 die unless $@ eq "alarm\n";
85
86 # return failure
87 return 0;
88
89 }
90
91 # return success
92265349.0ms return 1;
93
94}
95# EO lock_file
96
97###################################################################################################
98
99# read file and return data (flocked)
100sub readfile ($;$$)
101
# spent 4.53s (842ms+3.69) within RTP::Webmerge::IO::readfile which was called 2618 times, avg 1.73ms/call: # 2560 times (732ms+3.60s) by RTP::Webmerge::Process::CSS::Inlinedata::inline_url at line 273 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Inlinedata.pm, avg 1.69ms/call # 20 times (43.7ms+29.5ms) by RTP::Webmerge::IO::CSS::incCSS at line 80 of webmerge/scripts/modules/RTP/Webmerge/IO/CSS.pm, avg 3.66ms/call # 18 times (61.9ms+35.8ms) by RTP::Webmerge::Checksum::crcCheckEntry at line 80 of webmerge/scripts/modules/RTP/Webmerge/Checksum.pm, avg 5.43ms/call # 18 times (4.21ms+23.6ms) by RTP::Webmerge::Checksum::crcCheckEntry at line 70 of webmerge/scripts/modules/RTP/Webmerge/Checksum.pm, avg 1.54ms/call # once (372µs+1.24ms) by main::read_xml at line 310 of webmerge/scripts/webmerge.pl # once (206µs+939µs) by main::get_xml at line 283 of webmerge/scripts/webmerge.pl
{
102
103 # get input variables
104261816.5ms my ($file, $atomic, $binary) = @_;
105
106 # check if file has already beed written
107261815.8ms if ($atomic && exists $atomic->{$file})
108 { return $atomic->{$file}->[0]; }
109
110 # check if file does exist
111 # check_path may bail otherwise
1122614151ms52282.83s if (-e $file)
# spent 2.79s making 2614 calls to RTP::Webmerge::Path::check_path, avg 1.07ms/call # spent 41.4ms making 2614 calls to RTP::Webmerge::IO::CORE:ftis, avg 16µs/call
113 {
114
115 # resolve path and make absolute
116 $file = check_path($file) || $file;
117
118 } else {
119
120 # parse into filename and path
121 # the path must exists at this point
122 my ($name, $path) = fileparse($file);
123
124 # resolve path and make absolute
125 $path = check_path($path) || $path;
126
127 # re-join the complete file uri
128 $file = join('/', $path, $name);
129
130 }
131
132 # check if file has already beed written
133261420.1ms if ($atomic && exists $atomic->{$file})
134 { return $atomic->{$file}->[0]; }
135
136 # declare local variables
137261412.0ms my $rv, my $data = '';
138
139 # open the file
1402614280ms2614200ms croak "could not open $file: $!" unless sysopen(my $fh, $file, O_RDWR);
# spent 200ms making 2614 calls to RTP::Webmerge::IO::CORE:sysopen, avg 76µs/call
141
142 # aquire exclusive lock on the file (will block)
143261441.1ms2614385ms croak "could not lock $file: $!" unless lock_file($fh, LOCK_EX, 4);
# spent 385ms making 2614 calls to RTP::Webmerge::IO::lock_file, avg 147µs/call
144
145 # use binmode
146261439.3ms2614120ms $fh->binmode;
# spent 120ms making 2614 calls to IO::File::binmode, avg 46µs/call
147
148 # read the whole file buffer by buffer
1492614324ms715877.3ms while($rv = sysread($fh, my $buffer, 4096)) { $data .= $buffer; }
# spent 77.3ms making 7158 calls to RTP::Webmerge::IO::CORE:sysread, avg 11µs/call
150
151 # check for error conditions
15226143.42ms croak "read error: $!" unless defined $rv;
15326143.20ms croak "unknown read error: $!" unless $rv == 0;
154
155 # close the file (this should probably never error)
1562614127ms261464.0ms croak "could not close input file: $!" unless close $fh;
# spent 64.0ms making 2614 calls to RTP::Webmerge::IO::CORE:close, avg 24µs/call
157
158 # remove unwanted utf8 boms
159 # this must not be protected
160 # we seldomly use the data again
161 # if it is not a text type
1622614108ms261410.8ms $data =~ s/^\xEF\xBB\xBF// unless $binary;
# spent 10.8ms making 2614 calls to RTP::Webmerge::IO::CORE:subst, avg 4µs/call
163
164 # return a data ref
165 # this will safe memory
1662614103ms return \$data
167
168}
169# EO sub readfile
170
171###################################################################################################
172
173# write data to a file (flocked)
174sub writefile ($$;$$)
175
# spent 5.70s (1.87+3.82) within RTP::Webmerge::IO::writefile which was called 39 times, avg 146ms/call: # 18 times (1.86s+3.77s) by RTP::Webmerge::IO::CSS::writeCSS at line 171 of webmerge/scripts/modules/RTP/Webmerge/IO/CSS.pm, avg 313ms/call # 18 times (5.75ms+44.6ms) by RTP::Webmerge::Merge::writer at line 151 of webmerge/scripts/modules/RTP/Webmerge/Merge.pm, avg 2.80ms/call # 3 times (3.77ms+14.1ms) by RTP::Webmerge::Process::CSS::Spritesets::__ANON__[/home/ocbnet/domain/ocbnet.ch/vhost/webmerge/htdocs/webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm:98] at line 88 of webmerge/scripts/modules/RTP/Webmerge/Process/CSS/Spritesets.pm, avg 5.97ms/call
{
176
1773943µs my $fh;
178
179 # get input variables
18039334µs my ($file, $out, $atomic, $binary) = @_;
181
182 # check if file does exist
183 # check_path may bail otherwise
184392.85ms7841.0ms if (-e $file)
# spent 39.6ms making 39 calls to RTP::Webmerge::Path::check_path, avg 1.01ms/call # spent 1.40ms making 39 calls to RTP::Webmerge::IO::CORE:ftis, avg 36µs/call
185 {
186
187 # resolve path and make absolute
188 $file = check_path($file) || $file;
189
190 } else {
191
192 # parse into filename and path
193 # the path must exists at this point
194 my ($name, $path) = fileparse($file);
195
196 # resolve path and make absolute
197 $path = check_path($path) || $path;
198
199 # re-join the complete file uri
200 $file = join('/', $path, $name);
201
202 }
203
204 # declare local variables
2053994µs my $rv = undef;
206
207 # create a memory copy of content
208397.76ms my $data = \(my $foo = ${$out});
209
210 # convert from mac/win newlines to unix newlines
211 # ${$data} =~ s/(?:\r\n|\n\r)/\n/gm unless $binary;
212
213 # open the file via atomic interface
214 # my $fh = RTP::IO::AtomicFile->open($file, 'w');
215
21639785µs3913.4ms my $dir = dirname $file;
# spent 13.4ms making 39 calls to File::Basename::dirname, avg 344µs/call
217
218391.61ms391.05ms die "directory does not exist: ", $dir unless -d $dir;
# spent 1.05ms making 39 calls to RTP::Webmerge::IO::CORE:ftdir, avg 27µs/call
219
220 # looks like we already written this file
221 # truncate, sync and unlock, then write again
22239550µs if (exists $atomic->{$file})
223 {
224
225 # get the stored old handle
226 $fh = $atomic->{$file}->[1];
227 # enable autoflush
228 # $fh->autoflush(1);
229 # set the position to start
230 $fh->seek(0, SEEK_SET);
231 $fh->sysseek(0, SEEK_SET);
232 # make the file empty
233 $fh->truncate(0);
234 # write out changes
235 $fh->flush;
236 # release file locks
237 flock($fh, LOCK_UN);
238 }
239 else
240 {
241 # open the file via atomic interface
242391.35ms3911.7ms $fh = RTP::IO::AtomicFile->new;
# spent 11.7ms making 39 calls to RTP::IO::AtomicFile::new, avg 300µs/call
243 # append another suffix as some optimizers
244 # already use the same, be on the save side
24539180µs ${*$fh}{'io_atomicfile_suffix'} = '.webmerge';
246 # open the file via atomic interface
24739618µs3924.2ms $fh->open($file, 'w');
# spent 24.2ms making 39 calls to RTP::IO::AtomicFile::open, avg 620µs/call
248 }
249
25039107µs die "could not open file: $file: $!" unless defined $fh;
251
252 # use binmode
25339772µs391.74ms $fh->binmode;
# spent 1.74ms making 39 calls to IO::File::binmode, avg 45µs/call
254
255 # error out if there was an error opening the file
2563959µs croak "could not open $file: $!" unless $fh;
257
258 # aquire exclusive lock on the file (will block)
25939563µs396.07ms croak "could not lock $file: $!" unless lock_file($fh, LOCK_EX, 4);
# spent 6.07ms making 39 calls to RTP::Webmerge::IO::lock_file, avg 156µs/call
260
261 # $file = ${*$fh}{'io_atomicfile_temp'} if ${*$fh}{'io_atomicfile_temp'};
262
263 # only store if atomic is given
26439647µs $atomic->{$file} = [$out, $fh] if $atomic;
265
26639780µs if (defined(my $temp = ${*$fh}{'io_atomicfile_temp'}))
267 {
268 # only store if atomic is given
269 $atomic->{$temp} = [$out, $fh] if $atomic;
270 }
271
272 # write the whole file buffer by buffer
27315425.58s15423.72s while($rv = syswrite($fh, ${$data}, 4096)) { substr(${$data}, 0, $rv, ''); }
# spent 3.72s making 1542 calls to RTP::Webmerge::IO::CORE:syswrite, avg 2.42ms/call
274
275 # check for error conditions
2763985µs croak "write error: $!" unless defined $rv;
2773955µs croak "unknown write error: $!" unless $rv == 0;
278
27939951µs39398µs flock($fh, LOCK_UN);
# spent 398µs making 39 calls to RTP::Webmerge::IO::CORE:flock, avg 10µs/call
280
281 # return file handle
282 # store to block file
283391.13ms return $fh
284
285}
286# EO sub writefile
287
288
289###################################################################################################
290
291# process a file on disk
292# it does open the file first
293# aquires an exclusive lock
294# then reads the whole file
295# call the processor on the data
296# then write back the new data
297# flush, close und release lock
298sub processfile
299{
300
301 # get input variables
302 my ($file, $processor, $config, $options) = @_;
303
304 # resolve path
305 $file = check_path($file);
306
307 # declare local variables
308 my $rv, my $data = '';
309
310 # open the file in read write mode
311 croak "could not open $file: $!" unless sysopen(my $fh, $file, O_RDWR);
312
313 # put all file into binary mode for eol handling
314 croak "could not binmode $file: $!" unless binmode($fh);
315
316 # aquire exclusive lock on the file (will block)
317 croak "could not lock $file: $!" unless lock_file($fh, LOCK_EX, 1000);
318
319 # read the whole file buffer by buffer
320 while($rv = sysread($fh, my $buffer, 4096)) { $data .= $buffer; }
321
322 # check for read error conditions
323 croak "read error: $!" unless defined $rv;
324 croak "unknown read error: $!" unless $rv == 0;
325
326 # call the processor to change the content
327 unless (&{$processor}(\$data, $config, $options))
328 { croak "could not process content: $!"; }
329
330 # seek to the file begining after processing is done
331 croak "could not seek $file: $!" unless sysseek($fh, 0, SEEK_SET);
332
333 # then truncate the file to zero size (make it empty)
334 croak "could not truncate $file: $!" unless truncate($fh, 0);
335
336 # then write the complete content again to the file
337 croak "could not write to $file: $!" unless print $fh $data;
338
339 # close the file (this should probably never error)
340 croak "could not close file: $!" unless close $fh;
341
342}
343# EO sub processfile
344
345###################################################################################################
346
347# get a list of files from a directory
348sub filelist
349{
350
351 # get input variables
352 my ($root, $file, $recursive) = @_;
353
354 # resolve path
355 $root = check_path($root);
356
357 # declare local variables
358 my @dirs = ($root), my @files;
359
360 while(defined(my $root = shift(@dirs)))
361 {
362
363 # use glob function to match the files
364 # could implement my own regex match, but
365 # glob is much simpler and securer to use
366 push(@files, bsd_glob(join('/', $root, $file)));
367
368 # open the directory to read all entries
369 opendir(my $dh, $root) or die "could not opendir $root: $!";
370
371 # read all entries in this directory
372 foreach my $entry (readdir($dh))
373 {
374
375 # dont handle directory pointers
376 next if $entry eq '.' || $entry eq '..';
377
378 # create the complete file path
379 my $path = join('/', $root, $entry);
380
381 # add directory to processings if recursive
382 push(@dirs, $path) if -d $path && $recursive;
383
384 }
385 # EO each readdir
386
387 # close directory
388 closedir($dh);
389
390 }
391 # EO while readdir
392
393 # return array ref
394 return \ @files;
395
396}
397# EO sub filelist
398
399###################################################################################################
400###################################################################################################
401113µs1;
 
# spent 64.0ms within RTP::Webmerge::IO::CORE:close which was called 2614 times, avg 24µs/call: # 2614 times (64.0ms+0s) by RTP::Webmerge::IO::readfile at line 156, avg 24µs/call
sub RTP::Webmerge::IO::CORE:close; # opcode
# spent 31.5ms within RTP::Webmerge::IO::CORE:flock which was called 2692 times, avg 12µs/call: # 2653 times (31.1ms+0s) by RTP::Webmerge::IO::lock_file at line 72, avg 12µs/call # 39 times (398µs+0s) by RTP::Webmerge::IO::writefile at line 279, avg 10µs/call
sub RTP::Webmerge::IO::CORE:flock; # opcode
# spent 1.05ms within RTP::Webmerge::IO::CORE:ftdir which was called 39 times, avg 27µs/call: # 39 times (1.05ms+0s) by RTP::Webmerge::IO::writefile at line 218, avg 27µs/call
sub RTP::Webmerge::IO::CORE:ftdir; # opcode
# spent 42.8ms within RTP::Webmerge::IO::CORE:ftis which was called 2653 times, avg 16µs/call: # 2614 times (41.4ms+0s) by RTP::Webmerge::IO::readfile at line 112, avg 16µs/call # 39 times (1.40ms+0s) by RTP::Webmerge::IO::writefile at line 184, avg 36µs/call
sub RTP::Webmerge::IO::CORE:ftis; # opcode
# spent 10.8ms within RTP::Webmerge::IO::CORE:subst which was called 2614 times, avg 4µs/call: # 2614 times (10.8ms+0s) by RTP::Webmerge::IO::readfile at line 162, avg 4µs/call
sub RTP::Webmerge::IO::CORE:subst; # opcode
# spent 200ms within RTP::Webmerge::IO::CORE:sysopen which was called 2614 times, avg 76µs/call: # 2614 times (200ms+0s) by RTP::Webmerge::IO::readfile at line 140, avg 76µs/call
sub RTP::Webmerge::IO::CORE:sysopen; # opcode
# spent 77.3ms within RTP::Webmerge::IO::CORE:sysread which was called 7158 times, avg 11µs/call: # 7158 times (77.3ms+0s) by RTP::Webmerge::IO::readfile at line 149, avg 11µs/call
sub RTP::Webmerge::IO::CORE:sysread; # opcode
# spent 3.72s within RTP::Webmerge::IO::CORE:syswrite which was called 1542 times, avg 2.42ms/call: # 1542 times (3.72s+0s) by RTP::Webmerge::IO::writefile at line 273, avg 2.42ms/call
sub RTP::Webmerge::IO::CORE:syswrite; # opcode