go-libwebp

Experimental translation from libwebp to Go source.
Log | Files | Refs | README | LICENSE

commit 3bdb8c52844faed6a2cef991282bb0a2dfaaca1b
parent 9c8b739f420eb05dfa848dabfe89309d5af9344b
Author: Jack Mordaunt <jackmordaunt.dev@gmail.com>
Date:   Thu,  7 Mar 2024 15:17:13 +0800

webp: benchmark decode

Benchmark stdlib webp vs transpiled vs dynamic.

Signed-off-by: Jack Mordaunt <jackmordaunt.dev@gmail.com>

Diffstat:
Mwebp/decode.go | 11+++++++++++
Mwebp/webp_test.go | 31+++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/webp/decode.go b/webp/decode.go @@ -22,6 +22,17 @@ func Decode(r io.Reader) (image.Image, error) { return transpiled.DecodeImpl(by) } +func decodeDynamic(by []byte) (image.Image, error) { + if err := dynamic.Init(); err != nil { + return nil, err + } + return dynamic.DecodeImpl(by) +} + +func decodeTranspiled(by []byte) (image.Image, error) { + return transpiled.DecodeImpl(by) +} + // DecodeConfig returns the color model and dimensions of a WEBP image without // decoding the entire image. func DecodeConfig(r io.Reader) (image.Config, error) { diff --git a/webp/webp_test.go b/webp/webp_test.go @@ -48,6 +48,37 @@ func TestLossless(t *testing.T) { }) } +func BenchmarkDecode(b *testing.B) { + b.Run("stdwebp", func(b *testing.B) { + for ii := 0; ii < b.N; ii++ { + r := bytes.NewReader(goldenOut) + m, err := stdwebp.Decode(r) + if err != nil { + b.Fatalf("error: %v", err) + } + _ = m + } + }) + b.Run("transpiled", func(b *testing.B) { + for ii := 0; ii < b.N; ii++ { + m, err := decodeTranspiled(goldenOut) + if err != nil { + b.Fatalf("error: %v", err) + } + _ = m + } + }) + b.Run("dynamic", func(b *testing.B) { + for ii := 0; ii < b.N; ii++ { + m, err := decodeDynamic(goldenOut) + if err != nil { + b.Fatalf("error: %v", err) + } + _ = m + } + }) +} + func assertOutput(t *testing.T, m image.Image, src io.Reader, decode func(io.Reader) (image.Image, error)) { t.Helper()