From 84135f3304dfb130b5bf091c25523d3b0a6295e4 Mon Sep 17 00:00:00 2001 From: Milan Nikolic Date: Fri, 13 Jun 2025 17:58:10 +0200 Subject: [PATCH] Add benchmark --- camera/camera_test.go | 36 +++++++++++---------------------- image/base64.go | 1 - image/base64_amd64.go | 1 - image/image_test.go | 43 ++++++++++++++++++++++++++++++++++++++++ image/testdata/test.jpg | Bin 0 -> 36996 bytes 5 files changed, 55 insertions(+), 26 deletions(-) create mode 100644 image/image_test.go create mode 100644 image/testdata/test.jpg diff --git a/camera/camera_test.go b/camera/camera_test.go index 20e736f..ba2b04c 100644 --- a/camera/camera_test.go +++ b/camera/camera_test.go @@ -2,11 +2,11 @@ package camera import ( "fmt" - "image/jpeg" - "os" - "path/filepath" + "io" "testing" "time" + + "github.com/gen2brain/cam2ip/image" ) func TestCamera(t *testing.T) { @@ -15,16 +15,14 @@ func TestCamera(t *testing.T) { t.Fatal(err) } - defer camera.Close() + defer func(camera *Camera) { + err := camera.Close() + if err != nil { + t.Error(err) + } + }(camera) - tmpdir, err := os.MkdirTemp(os.TempDir(), "cam2ip*") - if err != nil { - t.Error(err) - } - - defer os.RemoveAll(tmpdir) - - var i int64 + var i int var n = 10 timeout := time.After(time.Duration(n) * time.Second) @@ -32,7 +30,7 @@ func TestCamera(t *testing.T) { for { select { case <-timeout: - //fmt.Printf("Fps: %d\n", i/n) + fmt.Printf("FPS: %.2f\n", float64(i)/float64(n)) return default: i += 1 @@ -42,17 +40,7 @@ func TestCamera(t *testing.T) { t.Error(err) } - file, err := os.Create(filepath.Join(tmpdir, fmt.Sprintf("%03d.jpg", i))) - if err != nil { - t.Error(err) - } - - err = jpeg.Encode(file, img, &jpeg.Options{Quality: 75}) - if err != nil { - t.Error(err) - } - - err = file.Close() + err = image.NewEncoder(io.Discard).Encode(img) if err != nil { t.Error(err) } diff --git a/image/base64.go b/image/base64.go index be691ac..7d9dbbd 100644 --- a/image/base64.go +++ b/image/base64.go @@ -1,5 +1,4 @@ //go:build !amd64 -// +build !amd64 package image diff --git a/image/base64_amd64.go b/image/base64_amd64.go index de73a70..a2a67b8 100644 --- a/image/base64_amd64.go +++ b/image/base64_amd64.go @@ -1,5 +1,4 @@ //go:build amd64 -// +build amd64 package image diff --git a/image/image_test.go b/image/image_test.go new file mode 100644 index 0000000..d576efa --- /dev/null +++ b/image/image_test.go @@ -0,0 +1,43 @@ +package image_test + +import ( + "bytes" + _ "embed" + "image/jpeg" + "io" + "testing" + + "github.com/gen2brain/cam2ip/image" +) + +//go:embed testdata/test.jpg +var testJpg []byte + +func BenchmarkDecode(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := image.NewDecoder(bytes.NewReader(testJpg)).Decode() + if err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkEncode(b *testing.B) { + img, err := jpeg.Decode(bytes.NewReader(testJpg)) + if err != nil { + b.Fatal(err) + } + + for i := 0; i < b.N; i++ { + err := image.NewEncoder(io.Discard).Encode(img) + if err != nil { + b.Fatal(err) + } + } +} + +func BenchmarkBase64(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = image.EncodeToString(testJpg) + } +} diff --git a/image/testdata/test.jpg b/image/testdata/test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67e431f6f21f0baf906f398a67430803f2997c7c GIT binary patch literal 36996 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 literal 0 HcmV?d00001