diff --git a/color_test.go b/color_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..c89679e817b9f2f7c37b41a98be15279215a6b54
--- /dev/null
+++ b/color_test.go
@@ -0,0 +1,25 @@
+package pixel_test
+
+import (
+	"fmt"
+	"image/color"
+	"testing"
+
+	"github.com/faiface/pixel"
+)
+
+func BenchmarkColorToRGBA(b *testing.B) {
+	types := []color.Color{
+		color.NRGBA{R: 124, G: 14, B: 230, A: 42}, // slowest
+		color.RGBA{R: 62, G: 32, B: 14, A: 63},    // faster
+		pixel.RGB(0.8, 0.2, 0.5).Scaled(0.712),    // fastest
+	}
+	for _, col := range types {
+		col := col
+		b.Run(fmt.Sprintf("From %T", col), func(b *testing.B) {
+			for i := 0; i < b.N; i++ {
+				_ = pixel.ToRGBA(col)
+			}
+		})
+	}
+}
diff --git a/drawer_test.go b/drawer_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..a1220b8b4f4779e289e5b6b8039843d650264957
--- /dev/null
+++ b/drawer_test.go
@@ -0,0 +1,15 @@
+package pixel_test
+
+import (
+	"testing"
+
+	"github.com/faiface/pixel"
+)
+
+func BenchmarkSpriteDrawBatch(b *testing.B) {
+	sprite := pixel.NewSprite(nil, pixel.R(0, 0, 64, 64))
+	batch := pixel.NewBatch(&pixel.TrianglesData{}, nil)
+	for i := 0; i < b.N; i++ {
+		sprite.Draw(batch, pixel.IM)
+	}
+}
diff --git a/matrix_test.go b/matrix_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..e8d0ec9171865106b7bdb3c97ca9ac8db0b6a220
--- /dev/null
+++ b/matrix_test.go
@@ -0,0 +1,63 @@
+package pixel_test
+
+import (
+	"math/rand"
+	"testing"
+
+	"github.com/faiface/pixel"
+)
+
+func BenchmarkMatrix(b *testing.B) {
+	b.Run("Moved", func(b *testing.B) {
+		m := pixel.IM
+		for i := 0; i < b.N; i++ {
+			m = m.Moved(pixel.V(4.217, -132.99))
+		}
+	})
+	b.Run("ScaledXY", func(b *testing.B) {
+		m := pixel.IM
+		for i := 0; i < b.N; i++ {
+			m = m.ScaledXY(pixel.V(-5.1, 9.3), pixel.V(2.1, 0.98))
+		}
+	})
+	b.Run("Rotated", func(b *testing.B) {
+		m := pixel.IM
+		for i := 0; i < b.N; i++ {
+			m = m.Rotated(pixel.V(-5.1, 9.3), 1.4)
+		}
+	})
+	b.Run("Chained", func(b *testing.B) {
+		var m1, m2 pixel.Matrix
+		for i := range m1 {
+			m1[i] = rand.Float64()
+			m2[i] = rand.Float64()
+		}
+		for i := 0; i < b.N; i++ {
+			m1 = m1.Chained(m2)
+		}
+	})
+	b.Run("Project", func(b *testing.B) {
+		var m pixel.Matrix
+		for i := range m {
+			m[i] = rand.Float64()
+		}
+		u := pixel.V(1, 1)
+		for i := 0; i < b.N; i++ {
+			u = m.Project(u)
+		}
+	})
+	b.Run("Unproject", func(b *testing.B) {
+	again:
+		var m pixel.Matrix
+		for i := range m {
+			m[i] = rand.Float64()
+		}
+		if (m[0]*m[3])-(m[1]*m[2]) == 0 { // zero determinant, not invertible
+			goto again
+		}
+		u := pixel.V(1, 1)
+		for i := 0; i < b.N; i++ {
+			u = m.Unproject(u)
+		}
+	})
+}