Commit 4e7d5f190afcbcfa44cc0d019cbf7d3b4496522b

Authored by Jay Berkenbilt
1 parent ceeb25f3

Include memory usage in performance test output

manual/release-notes.rst
... ... @@ -253,6 +253,14 @@ For a detailed list of changes, please see the file
253 253 some additional caching to reduce the overhead of repeatedly
254 254 reading environment variables at runtime.
255 255  
  256 + - The test files used by the ``performance_check`` script at the
  257 + top of the repository are now available in the
  258 + `qpdf/performance-test-files github repository
  259 + <https://github.com/qpdf/performance-test-files>`__. In addition
  260 + to running time, memory usage is also included in performance
  261 + test results. The ``performance_check`` tool has only been
  262 + tested on Linux.
  263 +
256 264 - Lots of code cleanup and refactoring work was contributed in
257 265 multiple pull requests by M. Holger.
258 266  
... ...
performance_check
... ... @@ -5,6 +5,8 @@ use strict;
5 5 use File::Basename;
6 6 use Time::HiRes qw(gettimeofday tv_interval);
7 7 use File::Path qw(make_path);
  8 +use IPC::Open3;
  9 +use IO::Pipe;
8 10  
9 11 my $whoami = basename($0);
10 12 $| = 1;
... ... @@ -29,6 +31,7 @@ my %arg_compat = (
29 31 '--remove-unreferenced-resources=no' => '--preserve-unreferenced-resources',
30 32 '--remove-unreferenced-resources=yes' => '',
31 33 '--remove-unreferenced-resources=auto' => undef,
  34 + '--report-memory-usage' => '',
32 35 );
33 36  
34 37 my $executable = undef;
... ... @@ -172,6 +175,20 @@ Repository URL: https://github.com/qpdf/performance-test-files
172 175 }
173 176 }
174 177  
  178 +my $report_mem = filter_args(["--report-memory-usage"]);
  179 +{
  180 + my ($r, $mem) = run_cmd($executable, @$report_mem,
  181 + "--empty", File::Spec->devnull());
  182 + if ($r != 0)
  183 + {
  184 + die "$whoami: $executable doesn't seem to work\n";
  185 + }
  186 + if ($mem == 0)
  187 + {
  188 + print "** Note: memory information is not available **\n";
  189 + }
  190 +}
  191 +
175 192 run_tests();
176 193 print "\n";
177 194  
... ... @@ -211,6 +228,7 @@ sub run_tests
211 228  
212 229 chomp(my $commit = `git describe @`);
213 230 print "commit: $commit\n";
  231 + print "Format: time-in-seconds RAM-in-MiB filename\n";
214 232 make_path($workdir);
215 233 foreach my $test (@tests)
216 234 {
... ... @@ -259,16 +277,17 @@ sub run_test
259 277 last;
260 278 }
261 279 }
262   - my @cmd = ($executable, @$args, $file, "$workdir/$outfile");
  280 + my @cmd = ($executable, @$args, @$report_mem, $file, "$workdir/$outfile");
263 281 # Run once and discard to update caches
264 282 system("sync");
265   - system(@cmd);
  283 + run_cmd(@cmd);
266 284 my $i = 0;
267 285 my $total = 0;
  286 + my $max_mem = 0;
268 287 while ($i < $iterations)
269 288 {
270 289 my $start = [gettimeofday];
271   - my $r = system(@cmd);
  290 + my ($r, $mem) = run_cmd(@cmd);
272 291 if ($r == 2)
273 292 {
274 293 # interrupt
... ... @@ -280,6 +299,7 @@ sub run_test
280 299 print " command failed; ignoring results\n";
281 300 return undef;
282 301 }
  302 + $max_mem = $mem > $max_mem ? $mem : $max_mem;
283 303 my $elapsed = tv_interval($start, $end);
284 304 $total += $elapsed;
285 305 ++$i;
... ... @@ -289,5 +309,28 @@ sub run_test
289 309 last;
290 310 }
291 311 }
292   - return sprintf("%0.4f", $total / $i);
  312 + return sprintf("%8.4f %8.4f", $total / $i, $max_mem / 1048576);
  313 +}
  314 +
  315 +sub run_cmd
  316 +{
  317 + my @cmd = @_;
  318 + my $pipe = IO::Pipe->new();
  319 + my $pid = open3(my $child_in, '>&STDOUT', $pipe->writer(), @cmd);
  320 + $child_in->close();
  321 + waitpid($pid, 0);
  322 + my $r = $?;
  323 + my $mem = 0;
  324 + while (<$pipe>)
  325 + {
  326 + if (m/qpdf-max-memory-usage (\d+)/)
  327 + {
  328 + $mem = $1;
  329 + }
  330 + else
  331 + {
  332 + warn $_;
  333 + }
  334 + }
  335 + ($r, $mem);
293 336 }
... ...