You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							96 lines
						
					
					
						
							2.8 KiB
						
					
					
				| #!/usr/bin/env perl
 | |
| #
 | |
| # Copyright by The HDF Group.
 | |
| # All rights reserved.
 | |
| #
 | |
| # This file is part of HDF5.  The full HDF5 copyright notice, including
 | |
| # terms governing use, modification, and redistribution, is contained in
 | |
| # the COPYING file, which can be found at the root of the source code
 | |
| # distribution tree, or in https://www.hdfgroup.org/licenses.
 | |
| # If you do not have access to either file, you may request a copy from
 | |
| # help@hdfgroup.org.
 | |
| #
 | |
| 
 | |
| # Usage: pipe the output of Linux's `strace' program into the stdin of
 | |
| # this command, and the output of this command into gnuplot.
 | |
| 
 | |
| my ($fast,$npasses);
 | |
| if ($ARGV[0] =~ /^--?fast$/) {
 | |
|   $fast = 1;
 | |
|   shift;
 | |
| }
 | |
| 
 | |
| my $filename = shift || "tstab2.h5";
 | |
| my $total = 0;
 | |
| my %What;			# What{pos}{nbytes}{r|w} = naccesses
 | |
| my($total_writes, $total_bytes_out, $total_reads, $total_bytes_in);
 | |
| 
 | |
| while (<>) {
 | |
|   if (!defined $fd) {
 | |
|     if (/^open\("(.*?)".*=\s+(\d+)/ && $1 eq $filename) {
 | |
|       $fd = $2;
 | |
|       $pos = 0;
 | |
|     }
 | |
|   } elsif (/^close\((\d+)/ && $1==$fd) {
 | |
|     $fd = undef;
 | |
|   } elsif (!$fast &&
 | |
| 	   /^lseek\((\d+), -?\d+,.*= (\d+)/ &&
 | |
| 	   $1==$fd && $2>=0) {
 | |
|     $pos = $2;
 | |
|   } elsif (!$fast && /^lseek\((\d+),/ && $1==$fd) {
 | |
|     die $_;
 | |
|   } elsif (/^write\((\d+), ".*?"(\.\.\.)?, \d+\)\s*= (\d+)/ &&
 | |
| 	   $1==$fd && $3>=0) {
 | |
|     my $nbytes = $3;
 | |
|     if ($fast) {
 | |
|       $total_writes++;
 | |
|       $total_bytes_out += $nbytes;
 | |
|     } else {
 | |
|       $What{$pos}{$nbytes}{w}++;
 | |
|       printf "%d %d\n", $total, $pos;
 | |
|       $pos += $nbytes;
 | |
|       $total += $nbytes;
 | |
|     }
 | |
|   } elsif (/^write\((\d+),/ && $1==$fd) {
 | |
|     die $_;
 | |
|   } elsif (/^read\((\d+), ".*?"(\.\.\.)?, \d+\)\s*= (\d+)/ &&
 | |
| 	   $1==$fd && $3>=0) {
 | |
|     my $nbytes = $3;
 | |
|     if ($fast) {
 | |
|       $total_reads++;
 | |
|       $total_bytes_in += $nbytes;
 | |
|     } else {
 | |
|       $What{$pos}{$nbytes}{r}++;
 | |
|       printf "%d %d\n", $total, $pos;
 | |
|       $pos += $nbytes;
 | |
|       $total += $nbytes;
 | |
|     }
 | |
|   } elsif (/^read\((\d+),/ && $1==$fd) {
 | |
|     die $_;
 | |
|   }
 | |
| }
 | |
|      
 | |
| 
 | |
| if (!$fast) {
 | |
|   print "="x36, "\n"; 
 | |
|   printf "%8s %8s %8s %8s\n","Position","NBytes","NReads","NWrites";
 | |
|   for $pos (sort {$a<=>$b} keys %What) {
 | |
|     for $nbytes (sort {$a<=>$b} keys %{$What{$pos}}) {
 | |
|       printf("%8d %8d %8d %8d\n", $pos, $nbytes,
 | |
| 	     $What{$pos}{$nbytes}{r},
 | |
| 	     $What{$pos}{$nbytes}{w});
 | |
|       $total_writes += $What{$pos}{$nbytes}{w};
 | |
|       $total_reads  += $What{$pos}{$nbytes}{r};
 | |
|       $total_bytes_out += $What{$pos}{$nbytes}{w} * $nbytes;
 | |
|       $total_bytes_in  += $What{$pos}{$nbytes}{r} * $nbytes;
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| print "="x36, "\n";
 | |
| printf("Write: %8d calls, %10d total bytes, %10g average bytes\n",
 | |
|        $total_writes, $total_bytes_out, $total_bytes_out/$total_writes)
 | |
|   if $total_writes;
 | |
| printf("Read:  %8d calls, %10d total bytes, %10g average bytes\n",
 | |
|        $total_reads, $total_bytes_in, $total_bytes_in/$total_reads)
 | |
|   if $total_reads;
 | |
| 
 |