#! /bin/sh # ############################################################ # X11perfcompDR version 1.01 # # Usage: x11perfcompDR datafile reference_datafile # # X11perfcompDR -- Creates a Digital Review compatible breakdown of # x11perf v1.2 results as described in "Take Your Pick Of Graphics" # by John Montgomery, Digital Review, May 7th, 1990, Page 44. # # X11perfcompDR was written by Lonnie Mandigo (lonnie@hp-pcd.cv.hp.com). # # DISCLAIMER: This shell script is an interpretation of techniques # for massaging x11perf results as described in the aforementioned # Digital Review article. This shell script was not written by # Digital Review nor is it necessarily sanctioned by them. ############################################################ # CHANGE HISTORY: # # 8/30/90 v1.0 program created by Lonnie Mandigo # 1/18/91 Modification by Lonnie Mandigo # Fixed a bug to include UCIRC in data. # 2/5/91 Modification by Lonnie Mandigo # Now removes sum.tmp file when finished. # 3/18/91 v1.01 Increased resolution to handle zero ratios. # Minor aesethic cleanups and better error handling. # Lonnie Mandigo and Jason Levitt (jason@cs.utexas.edu) # ############################################################ # Copyright (c) 1991 by Hewlett-Packard Company # # Permission to use, copy, modify, and distribute this software # and its documentation for any purpose and without fee is hereby # granted, provided that the above copyright notice appear in all # copies and that both the copyright notice and this permission # notice appear in supporting documentation, and that the name of # Hewlett-Packard not be used in advertising or publicity # pertaining to distribution of the software without specific, # written prior permission. # ############################################################ # Instructions: # # Usage: x11perfcompDR datafile reference_datafile # # The x11perf data files, datafile and reference_datafile, # are created by running x11perf version 1.2 with the "-all" flag: # # x11perf -display grunt:0.0 -all > datafile # x11perf -display oxcart:0.0 -all > reference_datafile # # x11perfcompDR summarizes the results relative to the data # contained in reference_datafile. x11perfcompDR writes to # standard out, so if you want to capture the output in a # file, use: # # x11perfcompDR datafile reference_datafile > output.comp # # The output.comp contains summaries of the x11perf results # as described in the DR article. X11perfcompDR does not calculate # the jackknife value, scaled residuals, or 95% confidence interval # mentioned in DR. # ############################################################ # Notes on interpreting standard deviation (STD) and variance: # # If you look at one of the test categories and the STD is high # then that probably means that, for one or more tests that # went into that catagory, one of the systems had dramatically # different performance than the other system. Examine the # DETAILS section for that category and locate the places where # the ratios seem unusually large. Then compare the raw x11perf # data that are used to calculate those ratios to determine which # tests are throwing off the results. Unusually high isolated # test results are usually caused by specialized hardware # support, tricky software, or possibly a bug. Consult your vendor # for details. # # If the STD is low for a category, then all tests for one # system ran fairly uniformly faster (or slower) than the # other system. # # What constitutes a "high" or "low" STD will vary somewhat depending # on the software and hardware used, and the testing configuration. # jason@cs.utexas.edu: "For X terminals circa 1991, I've found that # a STD less than one is low and an STD greater than 5 is high. # Your mileage may vary. The 4/1/91 issue of Unix Today! compares # the performance of ten X terminals using x11perfcompDR." # # The variance is just the STD squared, and is included mainly # for compatibility with the DR article. # ############################################################ ############################################################ ############################################################ ############################################################ # stdform() - Converts the averages to standard form. # # $1 - Input file stdform() { cat > awkfile.$$ <<-'EOS' BEGIN { longName["Dot"] = "DOT:1"; longName["1x1 rectangle"] = "1RECT:1"; longName["10x10 rectangle"] = "RECT:1"; longName["100x100 rectangle"] = "RECT:1"; longName["500x500 rectangle"] = "5RECT:1"; longName["1x1 stippled rectangle"] = "1SRECT:1"; longName["10x10 stippled rectangle"] = "SRECT:1"; longName["100x100 stippled rectangle"] = "SRECT:1"; longName["500x500 stippled rectangle"] = "5SRECT:1"; longName["1x1 opaque stippled rectangle"] = "1OSREC:1"; longName["10x10 opaque stippled rectangle"] = "OSRECT:1"; longName["100x100 opaque stippled rectangle"] = "OSRECT:1"; longName["500x500 opaque stippled rectangle"] = "5OSREC:1"; longName["1x1 4x4 tiled rectangle"] = "1TREC1:1"; longName["10x10 4x4 tiled rectangle"] = "TRECT1:1"; longName["100x100 4x4 tiled rectangle"] = "TRECT1:1"; longName["500x500 4x4 tiled rectangle"] = "5TREC1:1"; longName["1x1 161x145 tiled rectangle"] = "1TREC2:1"; longName["10x10 161x145 tiled rectangle"] = "TRECT2:1"; longName["100x100 161x145 tiled rectangle"] = "TRECT2:1"; longName["500x500 161x145 tiled rectangle"] = "5TREC2:1"; longName["1-pixel line segment"] = "1SEG1:1"; longName["10-pixel line segment"] = "SEG1:1"; longName["100-pixel line segment"] = "SEG1:1"; longName["500-pixel line segment"] = "5SEG1:1"; longName["100-pixel line segment (1 kid)"] = "SEG2:1"; longName["100-pixel line segment (2 kids)"] = "SEG2:1"; longName["100-pixel line segment (3 kids)"] = "SEG2:1"; longName["10-pixel dashed segment"] = "DSEG:1"; longName["100-pixel dashed segment"] = "DSEG:1"; longName["100-pixel double-dashed segment"] = "DDSEG:1"; longName["1-pixel line"] = "1LINE:1"; longName["10-pixel line"] = "LINE:1"; longName["100-pixel line"] = "LINE:1"; longName["500-pixel line"] = "5LINE:1"; longName["10-pixel dashed line"] = "DLINE:1"; longName["100-pixel dashed line"] = "DLINE:1"; longName["100-pixel double-dashed line"] = "DDLINE:1"; longName["10x1 wide line"] = "WLINE:1"; longName["100x10 wide line"] = "WLINE:1"; longName["500x50 wide line"] = "5WLINE:1"; longName["100x10 wide dashed line"] = "WDLINE:1"; longName["100x10 wide double-dashed line"] = "WDDLIN:1"; longName["1-pixel circle"] = "1CIRC:1"; longName["10-pixel circle"] = "CIRCLE:1"; longName["100-pixel circle"] = "CIRCLE:1"; longName["500-pixel circle"] = "5CIRC:1"; longName["100-pixel dashed circle"] = "DCIRC:1"; longName["100-pixel double-dashed circle"] = "DDCIRC:1"; longName["10-pixel wide circle"] = "WCIRC:1"; longName["100-pixel wide circle"] = "WCIRC:1"; longName["500-pixel wide circle"] = "5WCIRC:1"; longName["100-pixel wide dashed circle"] = "WDCIRC:1"; longName["100-pixel wide double-dashed circle"] = "WDDCIR:1"; longName["10-pixel partial circle"] = "PARCIR:1"; longName["100-pixel partial circle"] = "PARCIR:1"; longName["1-pixel solid circle"] = "1SOLCI:1"; longName["10-pixel solid circle"] = "SOLCIR:1"; longName["100-pixel solid circle"] = "SOLCIR:1"; longName["500-pixel solid circle"] = "5SOLCI:1"; longName["10-pixel fill chord partial circle"] = "FCPCIR:1"; longName["100-pixel fill chord partial circle"] = "FCPCIR:1"; longName["10-pixel fill slice partial circle"] = "FSPCIR:1"; longName["100-pixel fill slice partial circle"] = "FSPCIR:1"; longName["10-pixel ellipse"] = "ELLIPS:1"; longName["100-pixel ellipse"] = "ELLIPS:1"; longName["500-pixel ellipse"] = "5ELLIP:1"; longName["100-pixel dashed ellipse"] = "DELLIP:1"; longName["100-pixel double-dashed ellipse"] = "DDELLI:1"; longName["10-pixel wide ellipse"] = "WELLIP:1"; longName["100-pixel wide ellipse"] = "WELLIP:1"; longName["500-pixel wide ellipse"] = "5WELLI:1"; longName["100-pixel wide dashed ellipse"] = "WDELLI:1"; longName["100-pixel wide double-dashed ellipse"] = "WDDELL:1"; longName["10-pixel partial ellipse"] = "PELLIP:1"; longName["100-pixel partial ellipse"] = "PELLIP:1"; longName["10-pixel filled ellipse"] = "FELLIP:1"; longName["100-pixel filled ellipse"] = "FELLIP:1"; longName["500-pixel filled ellipse"] = "5FELLI:1"; longName["10-pixel fill chord partial ellipse"] = "FCELLI:1"; longName["100-pixel fill chord ellipse"] = "FCELLI:1"; longName["10-pixel fill slice partial ellipse"] = "FSELLI:1"; longName["100-pixel fill slice ellipse"] = "FSELLI:1"; longName["Fill 1-pixel/side triangle"] = "1TRIAN:1"; longName["Fill 10-pixel/side triangle"] = "TRIANG:1"; longName["Fill 100-pixel/side triangle"] = "TRIANG:1"; longName["Fill 10x10 trapezoid"] = "TRAP:1"; longName["Fill 100x100 trapezoid"] = "TRAP:1"; longName["Fill 10x10 stippled trapezoid"] = "STRAP:1"; longName["Fill 100x100 stippled trapezoid"] = "STRAP:1"; longName["Fill 10x10 opaque stippled trapezoid"] = "OSTRAP:1"; longName["Fill 100x100 opaque stippled trapezoid"] = "OSTRAP:1"; longName["Fill 10x10 tiled trapezoid"] = "TTRAP:1"; longName["Fill 100x100 tiled trapezoid"] = "TTRAP:1"; longName["Fill 10-pixel/side complex polygon"] = "CPOLY:1"; longName["Fill 100-pixel/side complex polygons"] = "CPOLY:1"; longName["Char in 80-char line (6x13)"] = "TEXT1:2"; longName["Char in 80-char line (TR 10)"] = "TEXT1:2"; longName["Char in 30-char line (TR 24)"] = "TEXT1:2"; longName["Char in 20/40/20 line (6x13, TR 10)"] = "TEXT1:2"; longName["Char in 80-char image line (6x13)"] = "TEXT2:2"; longName["Char in 80-char image line (TR 10)"] = "TEXT2:2"; longName["Char in 30-char image line (TR 24)"] = "TEXT2:2"; longName["Scroll 10x10 pixels"] = "SCROLL:2"; longName["Scroll 100x100 pixels"] = "SCROLL:2"; longName["Scroll 500x500 pixels"] = "5SCROL:2"; longName["Copy 10x10 from window to window"] = "CPWTOW:3"; longName["Copy 100x100 from window to window"] = "CPWTOW:3"; longName["Copy 500x500 from window to window"] = "5CPWTW:3"; longName["Copy 10x10 from pixmap to window"] = "CPPTOW:3"; longName["Copy 100x100 from pixmap to window"] = "CPPTOW:3"; longName["Copy 500x500 from pixmap to window"] = "5CPPTW:3"; longName["Copy 10x10 from window to pixmap"] = "CPWTOP:3"; longName["Copy 100x100 from window to pixmap"] = "CPWTOP:3"; longName["Copy 500x500 from window to pixmap"] = "5CPWTP:3"; longName["Copy 10x10 from pixmap to pixmap"] = "CPPTOP:3"; longName["Copy 100x100 from pixmap to pixmap"] = "CPPTOP:3"; longName["Copy 500x500 from pixmap to pixmap"] = "5CPPTP:3"; longName["Copy 10x10 1-bit deep plane"] = "CPPLAN:3"; longName["Copy 100x100 1-bit deep plane"] = "CPPLAN:3"; longName["Copy 500x500 1-bit deep plane"] = "5CPPLA:3"; longName["PutImage 10x10 square"] = "PUTIMA:3"; longName["PutImage 100x100 square"] = "PUTIMA:3"; longName["PutImage 500x500 square"] = "5PUTIM:3"; longName["GetImage 10x10 square"] = "GETIMA:3"; longName["GetImage 100x100 square"] = "GETIMA:3"; longName["GetImage 500x500 square"] = "5GETIM:3"; longName["X protocol NoOperation"] = "NOOP:4"; longName["GetAtomName"] = "ATOM:4"; longName["GetProperty"] = "GETPRO:4"; longName["Change graphics context"] = "CGC:4"; longName["Create and map subwindows (4 kids)"] = "CMSUB:4"; longName["Create and map subwindows (16 kids)"] = "CMSUB:4"; longName["Create and map subwindows (25 kids)"] = "CMSUB:4"; longName["Create and map subwindows (50 kids)"] = "CMSUB:4"; longName["Create and map subwindows (75 kids)"] = "CMSUB:4"; longName["Create and map subwindows (100 kids)"] = "CMSUB:4"; longName["Create and map subwindows (200 kids)"] = "CMSUB:4"; longName["Create unmapped window (4 kids)"] = "CUNMAP:4"; longName["Create unmapped window (16 kids)"] = "CUNMAP:4"; longName["Create unmapped window (25 kids)"] = "CUNMAP:4"; longName["Create unmapped window (50 kids)"] = "CUNMAP:4"; longName["Create unmapped window (75 kids)"] = "CUNMAP:4"; longName["Create unmapped window (100 kids)"] = "CUNMAP:4"; longName["Create unmapped window (200 kids)"] = "CUNMAP:4"; longName["Map window via parent (4 kids)"] = "MAP:4"; longName["Map window via parent (16 kids)"] = "MAP:4"; longName["Map window via parent (25 kids)"] = "MAP:4"; longName["Map window via parent (50 kids)"] = "MAP:4"; longName["Map window via parent (75 kids)"] = "MAP:4"; longName["Map window via parent (100 kids)"] = "MAP:4"; longName["Map window via parent (200 kids)"] = "MAP:4"; longName["Unmap window via parent (4 kids)"] = "UMAP:4"; longName["Unmap window via parent (16 kids)"] = "UMAP:4"; longName["Unmap window via parent (25 kids)"] = "UMAP:4"; longName["Unmap window via parent (50 kids)"] = "UMAP:4"; longName["Unmap window via parent (75 kids)"] = "UMAP:4"; longName["Unmap window via parent (100 kids)"] = "UMAP:4"; longName["Unmap window via parent (200 kids)"] = "UMAP:4"; longName["Destroy window via parent (4 kids)"] = "DESTR:4"; longName["Destroy window via parent (16 kids)"] = "DESTR:4"; longName["Destroy window via parent (25 kids)"] = "DESTR:4"; longName["Destroy window via parent (50 kids)"] = "DESTR:4"; longName["Destroy window via parent (75 kids)"] = "DESTR:4"; longName["Destroy window via parent (100 kids)"] = "DESTR:4"; longName["Destroy window via parent (200 kids)"] = "DESTR:4"; longName["Hide/expose window via popup (4 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (16 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (25 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (50 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (75 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (100 kids)"] = "POPUP:4"; longName["Hide/expose window via popup (200 kids)"] = "POPUP:4"; longName["Move window (4 kids)"] = "MOVE:4"; longName["Move window (16 kids)"] = "MOVE:4"; longName["Move window (25 kids)"] = "MOVE:4"; longName["Move window (50 kids)"] = "MOVE:4"; longName["Move window (75 kids)"] = "MOVE:4"; longName["Move window (100 kids)"] = "MOVE:4"; longName["Move window (200 kids)"] = "MOVE:4"; longName["Moved unmapped window (4 kids)"] = "UMOVE:4"; longName["Moved unmapped window (16 kids)"] = "UMOVE:4"; longName["Moved unmapped window (25 kids)"] = "UMOVE:4"; longName["Moved unmapped window (50 kids)"] = "UMOVE:4"; longName["Moved unmapped window (75 kids)"] = "UMOVE:4"; longName["Moved unmapped window (100 kids)"] = "UMOVE:4"; longName["Moved unmapped window (200 kids)"] = "UMOVE:4"; longName["Move window via parent (4 kids)"] = "MOVPAR:4"; longName["Move window via parent (16 kids)"] = "MOVPAR:4"; longName["Move window via parent (25 kids)"] = "MOVPAR:4"; longName["Move window via parent (50 kids)"] = "MOVPAR:4"; longName["Move window via parent (75 kids)"] = "MOVPAR:4"; longName["Move window via parent (100 kids)"] = "MOVPAR:4"; longName["Move window via parent (200 kids)"] = "MOVPAR:4"; longName["Resize window (4 kids)"] = "RESIZ:4"; longName["Resize window (16 kids)"] = "RESIZ:4"; longName["Resize window (25 kids)"] = "RESIZ:4"; longName["Resize window (50 kids)"] = "RESIZ:4"; longName["Resize window (75 kids)"] = "RESIZ:4"; longName["Resize window (100 kids)"] = "RESIZ:4"; longName["Resize window (200 kids)"] = "RESIZ:4"; longName["Resize unmapped window (4 kids)"] = "URESIZ:4"; longName["Resize unmapped window (16 kids)"] = "URESIZ:4"; longName["Resize unmapped window (25 kids)"] = "URESIZ:4"; longName["Resize unmapped window (50 kids)"] = "URESIZ:4"; longName["Resize unmapped window (75 kids)"] = "URESIZ:4"; longName["Resize unmapped window (100 kids)"] = "URESIZ:4"; longName["Resize unmapped window (200 kids)"] = "URESIZ:4"; longName["Circulate window (4 kids)"] = "CIRC:4"; longName["Circulate window (16 kids)"] = "CIRC:4"; longName["Circulate window (25 kids)"] = "CIRC:4"; longName["Circulate window (50 kids)"] = "CIRC:4"; longName["Circulate window (75 kids)"] = "CIRC:4"; longName["Circulate window (100 kids)"] = "CIRC:4"; longName["Circulate window (200 kids)"] = "CIRC:4"; longName["Circulate Unmapped window (4 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (16 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (25 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (50 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (75 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (100 kids)"] = "UCIRC:4"; longName["Circulate Unmapped window (200 kids)"] = "UCIRC:4"; } { reps = $1; # get repetitions time = $4; # get time / operation split($0,parts,":"); # get name name = parts[2]; while (substr(name,1,1) == " ") { # remove leading spaces name = substr(name,2,length(name)); } printf("%s:%d:",longName[name],NR); # output in new format printf("%d:",reps); printf("%8.4f\n",time); } EOS awk -f awkfile.$$ $1 rm -f awkfile.$$ # cleanup } # stdform() ############################################################ # get500s() - Extracts the 500 pixel operations # # $1 - Input file get500s() { awk -F: ' # extract the lines { name = $1; category = $2; ord = $3; reps = $4; time = $5; if (substr(name,1,1) == "5") { printf("%s:",name); printf("%d:",category); printf("%d:",ord); printf("%d:",reps); printf("%.8g\n",1000/time); } }' $1 } # get500s() ############################################################ # get1s() - Extracts the 1 pixel operations # # $1 - Input file get1s() { awk -F: ' # extract the lines { name = $1; category = $2; ord = $3; reps = $4; time = $5; if (substr(name,1,1) == "1") { printf("%s:",name); printf("%d:",category); printf("%d:",ord); printf("%d:",reps); printf("%.8g\n",1000/time); } }' $1 } # get1s() ############################################################ # getKernel() - Gets the kernel measurements. # # $1 - Input file getKernel() { awk -F: ' { name = $1; if ((substr(name,1,1) != "1") && (substr(name,1,1) != "5")) print $0; } ' $1 | awk -F: ' BEGIN { prevName = "***"; logsum = 0; cnt = 0; } { name = $1; # get fields category = $2; ord = $3; reps = $4; time = $5; if (name != prevName && prevName != "***") { printf("%s:",prevName); printf("%d:",c); printf("%d:",o); printf("%d:",r); printf("%10.1f\n", exp(logsum / cnt)); logsum = 0; cnt = 0; } logsum += log( 1000 / time ); # generate log sum cnt++; prevName = name; c = category; r = reps; o = ord; } END { printf("%s:",prevName); printf("%d:",c); printf("%d:",o); printf("%d:",r); printf("%10.1f\n", exp(logsum / cnt)); } ' - } # getKernel() ############################################################ # doRatios() - Calculates the ratios for each of the entries # # $1 - datafile # $2 - reference datafile # doRatios() { sort +0 -1 -t: $1 > DR.JUNK1 sort +0 -1 -t: $2 > DR.JUNK2 join -j1 1 -j2 1 -t: DR.JUNK1 DR.JUNK2 | # join the together awk -F: ' { name = $1; # get fields cat = $2; ord = $3; count = $4; speed = $5; refcat = $6; reford = $7; refcount = $8; refspeed = $9; printf("%s:",name); printf("%d:",cat); printf("%d:",ord); printf("%s:",speed); printf("%s:",refspeed); printf("%6.16f\n",speed/refspeed); # print ratio } ' - rm -f DR.JUNK1 DR.JUNK2 # cleanup } # doRatios() ############################################################ # breakout() - Breaks out the data into each of the # necessary categories. # # $1 - datafile # $2 - suffix # breakout() { DF=$1 SFX=$2 grep trep $DF | # extract the averages stdform - > avgs.$SFX # convert to standard form get500s avgs.$SFX > 500s.$SFX # extract 500 pixel operations get1s avgs.$SFX > 1s.$SFX # get 1 pixel operations getKernel avgs.$SFX > kernel.$SFX # extract kernal measurements rm -f avgs.$SFX # cleanup } # breakout() ############################################################ # summarize() - Calculates a summary for the specific file # # $1 - input file summarize() { awk -F: ' BEGIN { cn[1] = "GENERAL GRAPHICS"; cn[2] = "TERMINAL EMULATION"; cn[3] = "WINDOW MANAGEMENT"; cn[4] = "X-SPECIFIC OPERATIONS"; sumname = "OVERALL"; cnt = 0; } { name = $1 # get fields cat = $2; ord = $3; speed = $4; refspeed = $5; ratio = $6; if (substr(name,1,1) == "1") { # its a 1 file sumname = "1 OVERALL"; } if (substr(name,1,1) == "5") { # its a 500 file sumname = "500 OVERALL"; } lsum[cat] += log( speed ); # accumulate sums rlsum[cat] += log( refspeed ); ratlsum[cat] += log(ratio); ratl2sum[cat] += ratio * ratio; ratsum[cat] += ratio; ccnt[cat]++; tsum += log( speed ); rtsum += log (refspeed); rattsum += log(ratio); ratt2sum += ratio * ratio; ratsumt += ratio; cnt++; } END { printf("%s:",sumname); printf("%10.2f:",exp(tsum/cnt)); printf("%10.2f:",exp(rtsum/cnt)); printf("%10.2f:",exp(rattsum/cnt)); printf("%10.4f",sqrt((cnt * ratt2sum - (ratsumt * ratsumt)) / (cnt * (cnt - 1)))); printf("\n"); for (i=1; i<=4; i++) { if (ccnt[i] != 0) { printf("%s:",cn[i]); printf("%10.2f:",exp( lsum[i] / ccnt[i])); printf("%10.2f:",exp( rlsum[i] / ccnt[i])); printf("%10.2f:",exp( ratlsum[i] / ccnt[i])); if (ccnt[i] > 1) { sum2 = ratsum[i] * ratsum[i]; printf("%10.4f",sqrt( (ccnt[i] * ratl2sum[i] - sum2) / (ccnt[i] * (ccnt[i] - 1)))); } else printf("%10.4f",0); printf("\n"); } } } ' $1 } # summarize ############################################################ # printout() - Printout the calculated data # printout() { echo "x11perf 1.2 Breakdown ala Digital Review" echo "----------------------------------------" echo "REFERENCE=$REF" echo "DATA=$DATA" echo echo "*** SUMMARY ***" sed -n -e '1p' 1s.sum > sum.tmp sed -n -e '1p' 500s.sum >> sum.tmp cat kernel.sum sum.tmp | awk -F: ' BEGIN { printf(" Geometric Mean of Ratios\n"); printf(" /--------------^---------------\\/----------^---------\\\n"); printf(" Test Reference Data Ratio Variance Standard\n"); printf(" Category (Ops/sec) (Ops/Sec) Deviation\n"); printf("----------------------------------------------------------------------------\n"); } { name = $1; # get fields datamean = $2; refmean = $3; ratmean = $4; ratstd = $5; printf("%21s ",name); printf("%10.2f ",refmean); printf("%10.2f ",datamean); printf("%10.2f ",ratmean); printf("%10.4f ",ratstd * ratstd); printf("%10.4f ",ratstd); printf("\n"); } ' - echo cat kernel.sum sum.tmp | # prints the graph awk -F: ' BEGIN { max = 1; cnt = 0; } { name[cnt] = $1; ratmean[cnt] = $4; if (max < ratmean[cnt]) max = ratmean[cnt]; cnt++; } END { step = max / 55; # calculate increment for (i=0; i(ratmean[i] / step)) # greater than data value printf(" "); else # less than data value printf("="); } printf("\n"); } } ' - echo echo "*** DETAILS ***" for i in kernel.detail 1s.detail 500s.detail ; do echo sort -t: -n +2 $i | # sort to original order awk -F: ' BEGIN { cn[1] = "GENERAL GRAPHICS"; cn[2] = "TERMINAL EMULATION"; cn[3] = "WINDOW MANAGEMENT"; cn[4] = "X-SPECIFIC OPERATIONS"; first = 1; prevcat = 0; printf(" Op Reference Data Ratio\n"); printf(" Name (Ops/Sec) (Ops/Sec)\n"); } { name = $1; # get fields cat = $2; ord = $3; speed = $4; refspeed = $5; ratio = $6; if (first) { first = 0; if (substr(name,1,1) == "1") paren = "(1 PIXEL)" else if (substr(name,1,1) == "5") paren = "(500 PIXEL)" else paren = ""; } if (cat != prevcat) { printf("----------------------------------------\n"); printf("%s %s\n",cn[cat],paren); printf("----------------------------------------\n"); prevcat = cat; } printf("%6s ",name); # print data printf("%10.2f ",refspeed); printf("%10.2f ",speed); printf("%10.2f ",ratio); printf("\n"); } ' - done rm sum.tmp # remove temp file } # printout() ############################################################ # deletetmp() - Deletes temporary files. Called by trap. # # deletetmp() { rm -f kernel.* 500s.* 1s.* avgs.* awkfile* sum.tmp DR.JUNK* } ############################################################ # MAIN PROGRAM ############################################################ # Don't print the OVERALL number. It's pretty bogus. DO_OVERALL=false # Cleanup on interrupt trap \ "echo Interrupt: removing temporary files. >& 2 ;deletetmp; exit 1" 1 2 15 # Must have two files specified if [ "$#" -ne 2 ] then echo "Usage: $0 datafile reference_datafile" >& 2 exit 1 fi # Must be ordinary files if [ ! -f "$1" -o ! -f "$2" ] then echo "Error: data files do not exist or are not ordinary." >& 2 exit 1 fi # Should have the same number of results unless something failed. LC1=`grep trep "$1" | wc -l` LC2=`grep trep "$2" | wc -l` if [ "$LC1" -ne "$LC2" ] then echo "Error: files do not have the same number of results. Check for errors." >& 2 exit 1 fi if [ "$LC1" -ne 222 ] then echo "Warning: $LC1 does not contain 222 results, summaries may be misleading." >& 2 fi if [ "$LC2" -ne 222 ] then echo "Warning: $LC2 does not contain 222 results, summaries may be misleading." >& 2 fi DATA=$1 REF=$2 breakout $DATA "DR" breakout $REF "ref" doRatios kernel.DR kernel.ref > kernel.detail doRatios 500s.DR 500s.ref > 500s.detail doRatios 1s.DR 1s.ref > 1s.detail if $DO_OVERALL then summarize kernel.detail > kernel.sum else summarize kernel.detail | grep -v OVERALL > kernel.sum fi summarize 500s.detail > 500s.sum summarize 1s.detail > 1s.sum printout deletetmp exit 0