Skip to content

Instantly share code, notes, and snippets.

@nobonobo
Last active June 13, 2021 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nobonobo/a88370102866117bc67599751bd5fafb to your computer and use it in GitHub Desktop.
Save nobonobo/a88370102866117bc67599751bd5fafb to your computer and use it in GitHub Desktop.
GZIPの作成速度C版とGo標準との比較
package main
import (
"compress/gzip"
"io"
"os"
"testing"
"github.com/mistsys/cgzip"
)
const (
level = 6
src = "alpine-rpi-3.13.4-aarch64.tar"
dst = "alpine-rpi-3.13.4-aarch64.tar.gz"
)
func BenchmarkCGipWriter(b *testing.B) {
for i := 0; i < b.N; i++ {
fp, err := os.Open(src)
if err != nil {
b.Error(err)
}
w, err := cgzip.NewWriterLevel(io.Discard, level)
if err != nil {
b.Error(err)
}
io.Copy(w, fp)
fp.Close()
w.Close()
}
}
func BenchmarkStdGipWriter(b *testing.B) {
for i := 0; i < b.N; i++ {
fp, err := os.Open(src)
if err != nil {
b.Error(err)
}
w, err := gzip.NewWriterLevel(io.Discard, level)
if err != nil {
b.Error(err)
}
io.Copy(w, fp)
fp.Close()
w.Close()
}
}
func BenchmarkCGipReader(b *testing.B) {
for i := 0; i < b.N; i++ {
fp, err := os.Open(dst)
if err != nil {
b.Error(err)
}
r, err := cgzip.NewReader(fp)
if err != nil {
b.Error(err)
}
io.Copy(io.Discard, r)
fp.Close()
r.Close()
}
}
func BenchmarkStdGipReader(b *testing.B) {
for i := 0; i < b.N; i++ {
fp, err := os.Open(dst)
if err != nil {
b.Error(err)
}
r, err := gzip.NewReader(fp)
if err != nil {
b.Error(err)
}
io.Copy(io.Discard, r)
fp.Close()
r.Close()
}
}
% go test -bench .
goos: darwin
goarch: amd64
pkg: gzip-perf
cpu: Intel(R) Core(TM) i5-8210Y CPU @ 1.60GHz
BenchmarkCGipWriter-4 1 5414332628 ns/op
BenchmarkStdGipWriter-4 1 4237315218 ns/op
BenchmarkCGipReader-4 3 444672552 ns/op
BenchmarkStdGipReader-4 2 989653348 ns/op
PASS
ok gzip-perf 15.340s
@nobonobo
Copy link
Author

Reader比較も加えてみた。Reader側は標準側が半分の速度でした。
これはNewReaderが重いという説があり、Readerインスタンスをsync.Poolで使い回すという案で高速化した事例もあるよ!

@nobonobo
Copy link
Author

ちなみにgzipコマンドの場合:

% cat alpine-rpi-3.13.4-aarch64.tar.gz| time gzip -d -c > /dev/null
gzip -d -c > /dev/null  0.35s user 0.01s system 98% cpu 0.369 total

さらに何割か早かったりする。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment