diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-01-17 12:40:45 +0100 |
commit | 3e45412327a2654a77944249962b3652e6142299 (patch) | |
tree | bc3bf69452afa055423cbe0c5cfa8ca357df6ccf /test/bench | |
parent | c533680039762cacbc37db8dc7eed074c3e497be (diff) | |
download | golang-upstream/2011.01.12.tar.gz |
Imported Upstream version 2011.01.12upstream/2011.01.12
Diffstat (limited to 'test/bench')
-rw-r--r-- | test/bench/fannkuch-parallel.go | 2 | ||||
-rw-r--r-- | test/bench/fasta.c | 4 | ||||
-rw-r--r-- | test/bench/fasta.go | 47 | ||||
-rw-r--r-- | test/bench/k-nucleotide-parallel.go | 2 | ||||
-rw-r--r-- | test/bench/pidigits.go | 8 | ||||
-rw-r--r-- | test/bench/regex-dna-parallel.go | 4 | ||||
-rw-r--r-- | test/bench/regex-dna.go | 2 | ||||
-rw-r--r-- | test/bench/timing.log | 108 | ||||
-rwxr-xr-x | test/bench/timing.sh | 42 |
9 files changed, 160 insertions, 59 deletions
diff --git a/test/bench/fannkuch-parallel.go b/test/bench/fannkuch-parallel.go index 7897eac05..7e9b98d50 100644 --- a/test/bench/fannkuch-parallel.go +++ b/test/bench/fannkuch-parallel.go @@ -44,7 +44,7 @@ import ( ) var n = flag.Int("n", 7, "count") -var nCPU = flag.Int("ncpu", 2, "number of cpus") +var nCPU = flag.Int("ncpu", 4, "number of cpus") type Job struct { start []int diff --git a/test/bench/fasta.c b/test/bench/fasta.c index 78a8490d7..64c1c5205 100644 --- a/test/bench/fasta.c +++ b/test/bench/fasta.c @@ -41,10 +41,12 @@ POSSIBILITY OF SUCH DAMAGE. #include <stdlib.h> #include <string.h> +#ifndef fwrite_unlocked // not available on OS X #define fwrite_unlocked fwrite #define fputc_unlocked fputc #define fputs_unlocked fputs +#endif #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) #define unlikely(x) __builtin_expect((x), 0) @@ -214,4 +216,4 @@ main(int argc, const char **argv) { ">THREE Homo sapiens frequency\n", n*5, &rand); return 0; -}
\ No newline at end of file +} diff --git a/test/bench/fasta.go b/test/bench/fasta.go index 470bdb328..d13edd5dc 100644 --- a/test/bench/fasta.go +++ b/test/bench/fasta.go @@ -37,7 +37,6 @@ POSSIBILITY OF SUCH DAMAGE. package main import ( - "bytes" "flag" "os" ) @@ -49,7 +48,7 @@ var n = flag.Int("n", 1000, "length of result") const Line = 60 func Repeat(alu []byte, n int) { - buf := bytes.Add(alu, alu) + buf := append(alu, alu...) off := 0 for n > 0 { m := n @@ -138,28 +137,28 @@ func main() { flag.Parse() iub := []Acid{ - Acid{prob: 0.27, sym: 'a'}, - Acid{prob: 0.12, sym: 'c'}, - Acid{prob: 0.12, sym: 'g'}, - Acid{prob: 0.27, sym: 't'}, - Acid{prob: 0.02, sym: 'B'}, - Acid{prob: 0.02, sym: 'D'}, - Acid{prob: 0.02, sym: 'H'}, - Acid{prob: 0.02, sym: 'K'}, - Acid{prob: 0.02, sym: 'M'}, - Acid{prob: 0.02, sym: 'N'}, - Acid{prob: 0.02, sym: 'R'}, - Acid{prob: 0.02, sym: 'S'}, - Acid{prob: 0.02, sym: 'V'}, - Acid{prob: 0.02, sym: 'W'}, - Acid{prob: 0.02, sym: 'Y'}, + {prob: 0.27, sym: 'a'}, + {prob: 0.12, sym: 'c'}, + {prob: 0.12, sym: 'g'}, + {prob: 0.27, sym: 't'}, + {prob: 0.02, sym: 'B'}, + {prob: 0.02, sym: 'D'}, + {prob: 0.02, sym: 'H'}, + {prob: 0.02, sym: 'K'}, + {prob: 0.02, sym: 'M'}, + {prob: 0.02, sym: 'N'}, + {prob: 0.02, sym: 'R'}, + {prob: 0.02, sym: 'S'}, + {prob: 0.02, sym: 'V'}, + {prob: 0.02, sym: 'W'}, + {prob: 0.02, sym: 'Y'}, } homosapiens := []Acid{ - Acid{prob: 0.3029549426680, sym: 'a'}, - Acid{prob: 0.1979883004921, sym: 'c'}, - Acid{prob: 0.1975473066391, sym: 'g'}, - Acid{prob: 0.3015094502008, sym: 't'}, + {prob: 0.3029549426680, sym: 'a'}, + {prob: 0.1979883004921, sym: 'c'}, + {prob: 0.1975473066391, sym: 'g'}, + {prob: 0.3015094502008, sym: 't'}, } alu := []byte( @@ -192,9 +191,7 @@ func (b *buffer) Flush() { func (b *buffer) WriteString(s string) { p := b.NextWrite(len(s)) - for i := 0; i < len(s); i++ { - p[i] = s[i] - } + copy(p, s) } func (b *buffer) NextWrite(n int) []byte { @@ -204,6 +201,6 @@ func (b *buffer) NextWrite(n int) []byte { p = *b } out := p[len(p) : len(p)+n] - *b = p[0 : len(p)+n] + *b = p[:len(p)+n] return out } diff --git a/test/bench/k-nucleotide-parallel.go b/test/bench/k-nucleotide-parallel.go index 0234f33d1..96c80d8f0 100644 --- a/test/bench/k-nucleotide-parallel.go +++ b/test/bench/k-nucleotide-parallel.go @@ -41,6 +41,7 @@ import ( "fmt" "io/ioutil" "os" + "runtime" "sort" ) @@ -97,6 +98,7 @@ func printKnucs(a kNucArray) { } func main() { + runtime.GOMAXPROCS(4) in := bufio.NewReader(os.Stdin) three := []byte(">THREE ") for { diff --git a/test/bench/pidigits.go b/test/bench/pidigits.go index dcfb502ce..e59312177 100644 --- a/test/bench/pidigits.go +++ b/test/bench/pidigits.go @@ -49,6 +49,7 @@ var silent = flag.Bool("s", false, "don't print result") var ( tmp1 = big.NewInt(0) tmp2 = big.NewInt(0) + tmp3 = big.NewInt(0) y2 = big.NewInt(0) bigk = big.NewInt(0) numer = big.NewInt(1) @@ -80,7 +81,6 @@ func extract_digit() int64 { } func next_term(k int64) { - // TODO(eds) If big.Int ever gets a Scale method, y2 and bigk could be int64 y2.SetInt64(k*2 + 1) bigk.SetInt64(k) @@ -92,15 +92,15 @@ func next_term(k int64) { } func eliminate_digit(d int64) { - tmp := big.NewInt(0).Set(denom) - accum.Sub(accum, tmp.Mul(tmp, big.NewInt(d))) + tmp3.SetInt64(d) + accum.Sub(accum, tmp3.Mul(denom, tmp3)) accum.Mul(accum, ten) numer.Mul(numer, ten) } func printf(s string, arg ...interface{}) { if !*silent { - fmt.Printf(s, arg) + fmt.Printf(s, arg...) } } diff --git a/test/bench/regex-dna-parallel.go b/test/bench/regex-dna-parallel.go index d33f2466e..e8e62b806 100644 --- a/test/bench/regex-dna-parallel.go +++ b/test/bench/regex-dna-parallel.go @@ -77,8 +77,8 @@ func countMatches(pat string, bytes []byte) int { re := regexp.MustCompile(pat) n := 0 for { - e := re.Execute(bytes) - if len(e) == 0 { + e := re.FindIndex(bytes) + if e == nil { break } n++ diff --git a/test/bench/regex-dna.go b/test/bench/regex-dna.go index 22de2c6aa..dc31db768 100644 --- a/test/bench/regex-dna.go +++ b/test/bench/regex-dna.go @@ -76,7 +76,7 @@ func countMatches(pat string, bytes []byte) int { re := regexp.MustCompile(pat) n := 0 for { - e := re.Execute(bytes) + e := re.FindIndex(bytes) if len(e) == 0 { break } diff --git a/test/bench/timing.log b/test/bench/timing.log index e7b0b48c1..f2b6a1f40 100644 --- a/test/bench/timing.log +++ b/test/bench/timing.log @@ -90,7 +90,7 @@ mandelbrot 5500 gc mandelbrot 74.32u 0.00s 74.35r gc_B mandelbrot 74.28u 0.01s 74.31r -meteor 16000 +meteor 2100 # we don't know gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r gccgo -O2 meteor-contest.go 0.12u 0.00s 0.14r @@ -209,7 +209,7 @@ mandelbrot 16000 gc mandelbrot 64.05u 0.02s 64.08r # *** -14% gc_B mandelbrot 64.10u 0.02s 64.14r # *** -14% -meteor 16000 +meteor 2100 # we don't know gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r gccgo -O2 meteor-contest.go 0.12u 0.00s 0.12r @@ -307,7 +307,7 @@ mandelbrot 16000 gc mandelbrot 63.31u 0.01s 63.35r # -1% gc_B mandelbrot 63.29u 0.00s 63.31r # -1% -meteor 16000 +meteor 2100 # we don't know gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r gccgo -O2 meteor-contest.go 0.11u 0.00s 0.12r @@ -414,7 +414,7 @@ chameneos 6000000 gcc -O2 chameneosredux.c -lpthread 18.00u 303.29s 83.64r gc chameneosredux 12.10u 0.00s 12.10r # 2.22X faster -Jan 6, 2009 +Jan 6, 2010 # Long-overdue update. All numbers included in this complete run. # Some programs (e.g. reverse-complement) rewritten for speed. @@ -429,7 +429,7 @@ fasta -n 25000000 reverse-complement < output-of-fasta-25000000 gcc -O2 reverse-complement.c 2.00u 0.80s 9.54r - gccgo -O2 reverse-complement.go 4.57u 0.35s 4.94r # 33% faster +# gccgo -O2 reverse-complement.go 4.57u 0.35s 4.94r # 33% faster gc reverse-complement 2.01u 0.38s 2.40r # 3.3X faster gc_B reverse-complement 1.88u 0.36s 2.24r # 3.2X faster GOGC=off @@ -445,7 +445,6 @@ nbody -n 50000000 binary-tree 15 # too slow to use 20 gcc -O2 binary-tree.c -lm 0.86u 0.00s 0.87r gccgo -O2 binary-tree.go 4.82u 0.41s 5.24r # 2.5X slower - gccgo -O2 binary-tree-freelist.go 0.00u 0.00s 0.00r gc binary-tree 7.23u 0.01s 7.25r # # -19% gc binary-tree-freelist 0.43u 0.00s 0.44r # -9% @@ -478,7 +477,7 @@ mandelbrot 16000 gc mandelbrot 66.05u 0.00s 66.07r # -3% gc_B mandelbrot 66.06u 0.00s 66.07r # -3% -meteor 16000 +meteor 2100 gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r gccgo -O2 meteor-contest.go 0.12u 0.00s 0.12r gc meteor-contest 0.17u 0.00s 0.17r @@ -498,3 +497,98 @@ chameneos 6000000 gcc -O2 chameneosredux.c -lpthread 19.02u 331.08s 90.79r gc chameneosredux 12.54u 0.00s 12.55r +Oct 19, 2010 + +# Another long-overdue update. Some of the code is new; parallel versions +# of some are added. A few significant improvements. + +fasta -n 25000000 + gcc -O2 fasta.c 4.92u 0.00s 4.93r + gccgo -O2 fasta.go 3.31u 0.00s 3.34r # new code + gc fasta 3.68u 0.00s 3.69r # 2.5X faster with no code + gc_B fasta 3.68u 0.00s 3.69r # 2.3X faster with no code + +reverse-complement < output-of-fasta-25000000 + gcc -O2 reverse-complement.c 1.93u 0.81s 11.24r + gccgo -O2 reverse-complement.go 1.58u 0.43s 2.04r # first run with new code? + gc reverse-complement 1.84u 0.34s 2.20r # 10% faster + gc_B reverse-complement 1.85u 0.32s 2.18r + +nbody -n 50000000 + gcc -O2 nbody.c 21.35u 0.00s 21.36r + gccgo -O2 nbody.go 21.62u 0.00s 21.66r # 3.7X faster - why?? + gc nbody 29.78u 0.00s 29.79r + gc_B nbody 29.72u 0.00s 29.72r + +binary-tree 15 # too slow to use 20 + gcc -O2 binary-tree.c -lm 0.86u 0.00s 0.88r + gccgo -O2 binary-tree.go 4.05u 0.02s 4.08r # 28% faster + gccgo -O2 binary-tree-freelist 0.34u 0.08s 0.34r + gc binary-tree 5.94u 0.00s 5.95r # 20% faster + gc binary-tree-freelist 0.50u 0.01s 0.54r + +fannkuch 12 + gcc -O2 fannkuch.c 60.45u 0.00s 60.45r + gccgo -O2 fannkuch.go 64.64u 0.00s 64.64r + gccgo -O2 fannkuch-parallel.go 115.63u 0.00s 31.58r + gc fannkuch 126.52u 0.04s 126.68r + gc fannkuch-parallel 238.82u 0.10s 65.93r # GOMAXPROCS=4 + gc_B fannkuch 88.99u 0.00s 89.02r + +regex-dna 100000 + gcc -O2 regex-dna.c -lpcre 0.89u 0.00s 0.89r + gc regex-dna 8.99u 0.02s 9.03r + gc regex-dna-parallel 8.94u 0.02s 3.68r # GOMAXPROCS=4 + gc_B regex-dna 9.12u 0.00s 9.14r + +spectral-norm 5500 + gcc -O2 spectral-norm.c -lm 11.55u 0.00s 11.57r + gccgo -O2 spectral-norm.go 11.73u 0.00s 11.75r + gc spectral-norm 23.74u 0.00s 23.79r + gc_B spectral-norm 24.49u 0.02s 24.54r + +k-nucleotide 1000000 + gcc -O2 k-nucleotide.c 11.44u 0.06s 11.50r + gccgo -O2 k-nucleotide.go 8.65u 0.04s 8.71r + gccgo -O2 k-nucleotide-parallel.go 8.75u 0.03s 2.97r # set GOMAXPROCS=4 + gc k-nucleotide 14.92u 0.05s 15.01r + gc k-nucleotide-parallel 16.96u 0.06s 6.53r # set GOMAXPROCS=4 + gc_B k-nucleotide 15.97u 0.03s 16.08r + +mandelbrot 16000 + gcc -O2 mandelbrot.c 56.32u 0.00s 56.35r + gccgo -O2 mandelbrot.go 55.62u 0.02s 55.77r + gc mandelbrot 64.85u 0.01s 64.94r + gc_B mandelbrot 65.02u 0.01s 65.14r + +meteor 2100 + gcc -O2 meteor-contest.c 0.10u 0.00s 0.10r + gccgo -O2 meteor-contest.go 0.10u 0.00s 0.11r + gc meteor-contest 0.17u 0.00s 0.18r + gc_B meteor-contest 0.16u 0.00s 0.16r + +pidigits 10000 + gcc -O2 pidigits.c -lgmp 2.58u 0.00s 2.59r + gccgo -O2 pidigits.go 14.06u 0.01s 14.09r # first run? + gc pidigits 8.47u 0.05s 8.55r # 4.5X faster due to package big + gc_B pidigits 8.33u 0.01s 8.36r # 4.5X faster due to package big + +threadring 50000000 + gcc -O2 threadring.c 28.18u 153.19s 186.47r + gccgo -O2 threadring.go 110.10u 516.48s 515.25r + gc threadring 40.39u 0.00s 40.40r + +chameneos 6000000 + gcc -O2 chameneosredux.c -lpthread 18.20u 301.55s 83.10r + gccgo -O2 chameneosredux.go 52.22u 324.54s 201.21r + gc chameneosredux 13.52u 0.00s 13.54r + +Dec 14, 2010 + +# Improved regex code (same algorithm) gets ~30%. + +regex-dna 100000 + gcc -O2 regex-dna.c -lpcre 0.77u 0.01s 0.78r + gc regex-dna 6.80u 0.00s 6.81r + gc regex-dna-parallel 6.82u 0.01s 2.75r + gc_B regex-dna 6.69u 0.02s 6.70r diff --git a/test/bench/timing.sh b/test/bench/timing.sh index 5cd82dfd9..fec39182c 100755 --- a/test/bench/timing.sh +++ b/test/bench/timing.sh @@ -5,11 +5,15 @@ set -e -GOBIN="${GOBIN:-$HOME/bin}" - -. "$GOROOT"/src/Make.$GOARCH +eval $(gomake --no-print-directory -f ../../src/Make.inc go-env) PATH=.:$PATH +havegccgo=false +if which gccgo >/dev/null 2>&1 +then + havegccgo=true +fi + mode=run case X"$1" in X-test) @@ -18,11 +22,11 @@ X-test) esac gc() { - "$GOBIN"/$GC $1.go; "$GOBIN"/$LD $1.$O + $GC $1.go; $LD $1.$O } gc_B() { - "$GOBIN"/$GC -B $1.go; "$GOBIN"/$LD $1.$O + $GC -B $1.go; $LD $1.$O } runonly() { @@ -32,8 +36,6 @@ runonly() { fi } - - run() { if [ $mode = test ] then @@ -59,6 +61,10 @@ run() { fi return fi + if ! $havegccgo && echo $1 | grep -q '^gccgo ' + then + return + fi echo -n ' '$1' ' $1 shift @@ -69,7 +75,7 @@ run() { fasta() { runonly echo 'fasta -n 25000000' run 'gcc -O2 fasta.c' a.out 25000000 - #run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio + run 'gccgo -O2 fasta.go' a.out -n 25000000 #commented out until WriteString is in bufio run 'gc fasta' $O.out -n 25000000 run 'gc_B fasta' $O.out -n 25000000 } @@ -87,7 +93,7 @@ revcomp() { nbody() { runonly echo 'nbody -n 50000000' - run 'gcc -O2 nbody.c' a.out 50000000 + run 'gcc -O2 -lm nbody.c' a.out 50000000 run 'gccgo -O2 nbody.go' a.out -n 50000000 run 'gc nbody' $O.out -n 50000000 run 'gc_B nbody' $O.out -n 50000000 @@ -117,7 +123,7 @@ regexdna() { runonly a.out 100000 > x runonly echo 'regex-dna 100000' run 'gcc -O2 regex-dna.c -lpcre' a.out <x -# run 'gccgo -O2 regex-dna.go' a.out <x # pages badly; don't run +# run 'gccgo -O2 regex-dna.go' a.out <x # restore after regexp.FindIndex is in library run 'gc regex-dna' $O.out <x run 'gc regex-dna-parallel' $O.out <x run 'gc_B regex-dna' $O.out <x @@ -137,8 +143,8 @@ knucleotide() { runonly a.out 1000000 > x # should be using 25000000 runonly echo 'k-nucleotide 1000000' run 'gcc -O2 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include k-nucleotide.c -lglib-2.0' a.out <x - run 'gccgo -O2 k-nucleotide.go' a.out <x # warning: pages badly! - run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x # warning: pages badly! + run 'gccgo -O2 k-nucleotide.go' a.out <x + run 'gccgo -O2 k-nucleotide-parallel.go' a.out <x run 'gc k-nucleotide' $O.out <x run 'gc k-nucleotide-parallel' $O.out <x run 'gc_B k-nucleotide' $O.out <x @@ -154,17 +160,17 @@ mandelbrot() { } meteor() { - runonly echo 'meteor 16000' - run 'gcc -O2 meteor-contest.c' a.out - run 'gccgo -O2 meteor-contest.go' a.out - run 'gc meteor-contest' $O.out - run 'gc_B meteor-contest' $O.out + runonly echo 'meteor 2098' + run 'gcc -O2 meteor-contest.c' a.out 2098 + run 'gccgo -O2 meteor-contest.go' a.out -n 2098 + run 'gc meteor-contest' $O.out -n 2098 + run 'gc_B meteor-contest' $O.out -n 2098 } pidigits() { runonly echo 'pidigits 10000' run 'gcc -O2 pidigits.c -lgmp' a.out 10000 -# run 'gccgo -O2 pidigits.go' a.out -n 10000 # uncomment when gccgo library updated + run 'gccgo -O2 pidigits.go' a.out -n 10000 run 'gc pidigits' $O.out -n 10000 run 'gc_B pidigits' $O.out -n 10000 } |