diff --git a/imdraw/imdraw_test.go b/imdraw/imdraw_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..5d390af23652aff7f4706671297ec90f9985992f
--- /dev/null
+++ b/imdraw/imdraw_test.go
@@ -0,0 +1,96 @@
+package imdraw_test
+
+import (
+	"fmt"
+	"math/rand"
+	"testing"
+
+	"github.com/faiface/pixel"
+	"github.com/faiface/pixel/imdraw"
+)
+
+func BenchmarkPush(b *testing.B) {
+	imd := imdraw.New(nil)
+	for i := 0; i < b.N; i++ {
+		imd.Push(pixel.V(123.1, 99.4))
+	}
+}
+
+func pointLists(counts ...int) [][]pixel.Vec {
+	lists := make([][]pixel.Vec, len(counts))
+	for i := range lists {
+		lists[i] = make([]pixel.Vec, counts[i])
+		for j := range lists[i] {
+			lists[i][j] = pixel.V(
+				rand.Float64()*5000-2500,
+				rand.Float64()*5000-2500,
+			)
+		}
+	}
+	return lists
+}
+
+func BenchmarkLine(b *testing.B) {
+	lists := pointLists(2, 5, 10, 100, 1000)
+	for _, pts := range lists {
+		b.Run(fmt.Sprintf("%d", len(pts)), func(b *testing.B) {
+			imd := imdraw.New(nil)
+			for i := 0; i < b.N; i++ {
+				imd.Push(pts...)
+				imd.Line(1)
+			}
+		})
+	}
+}
+
+func BenchmarkRectangle(b *testing.B) {
+	lists := pointLists(2, 10, 100, 1000)
+	for _, pts := range lists {
+		b.Run(fmt.Sprintf("%d", len(pts)), func(b *testing.B) {
+			imd := imdraw.New(nil)
+			for i := 0; i < b.N; i++ {
+				imd.Push(pts...)
+				imd.Rectangle(0)
+			}
+		})
+	}
+}
+
+func BenchmarkPolygon(b *testing.B) {
+	lists := pointLists(3, 10, 100, 1000)
+	for _, pts := range lists {
+		b.Run(fmt.Sprintf("%d", len(pts)), func(b *testing.B) {
+			imd := imdraw.New(nil)
+			for i := 0; i < b.N; i++ {
+				imd.Push(pts...)
+				imd.Polygon(0)
+			}
+		})
+	}
+}
+
+func BenchmarkEllipseFill(b *testing.B) {
+	lists := pointLists(1, 10, 100, 1000)
+	for _, pts := range lists {
+		b.Run(fmt.Sprintf("%d", len(pts)), func(b *testing.B) {
+			imd := imdraw.New(nil)
+			for i := 0; i < b.N; i++ {
+				imd.Push(pts...)
+				imd.Ellipse(pixel.V(50, 100), 0)
+			}
+		})
+	}
+}
+
+func BenchmarkEllipseOutline(b *testing.B) {
+	lists := pointLists(1, 10, 100, 1000)
+	for _, pts := range lists {
+		b.Run(fmt.Sprintf("%d", len(pts)), func(b *testing.B) {
+			imd := imdraw.New(nil)
+			for i := 0; i < b.N; i++ {
+				imd.Push(pts...)
+				imd.Ellipse(pixel.V(50, 100), 1)
+			}
+		})
+	}
+}