--- /dev/null
+PASS
+BenchmarkChain    10000            101219 ns/op           23919 B/op        222 allocs/op
+BenchmarkTransform        50000             51625 ns/op           11858 B/op        135 allocs/op
+ok     github.com/spf13/hugo/transform 4.172s
 
 
 func TestChainOneTransformer(t *testing.T) {
        tr := NewChain(&AbsURL{BaseURL: "http://base"})
-       apply(t, tr, abs_url_tests)
+       apply(t.Errorf, tr, abs_url_tests)
 }
 
 const H5_JS_CONTENT_ABS_URL_WITH_NAV = "<!DOCTYPE html><html><head><script src=\"/foobar.js\"></script></head><body><nav><ul><li hugo-nav=\"section_0\"></li><li hugo-nav=\"section_1\"></li></ul></nav><article>content <a href=\"/foobar\">foobar</a>. Follow up</article></body></html>"
                &AbsURL{BaseURL: "http://two"},
                &NavActive{Section: "section_1"},
        )
-       apply(t, tr, two_chain_tests)
+       apply(t.Errorf, tr, two_chain_tests)
+}
+
+func BenchmarkChain(b *testing.B) {
+
+       tr := NewChain(
+               &AbsURL{BaseURL: "http://two"},
+               &NavActive{Section: "section_1"},
+       )
+       for i := 0; i < b.N; i++ {
+               apply(b.Errorf, tr, two_chain_tests)
+       }
 }
 
                t.Errorf("NavActive.Apply output expected and got:\n%q\n%q", expected, out.String())
        }
 }
+
+func BenchmarkTransform(b *testing.B) {
+       for i := 0; i < b.N; i++ {
+               tr := &NavActive{Section: "section_2"}
+               out := new(bytes.Buffer)
+               if err := tr.Apply(out, strings.NewReader(HTML_WITH_NAV)); err != nil {
+                       b.Errorf("Unexpected error in Apply() for NavActive: %s", err)
+               }
+       }
+}
 
                BaseURL: "http://base",
        }
 
-       apply(t, tr, abs_url_tests)
+       apply(t.Errorf, tr, abs_url_tests)
 }
 
 type test struct {
        {H5_JS_CONTENT_ABS_URL, H5_JS_CONTENT_ABS_URL},
 }
 
-func apply(t *testing.T, tr Transformer, tests []test) {
+type errorf func (string, ...interface{})
+
+func apply(ef errorf, tr Transformer, tests []test) {
        for _, test := range tests {
                out := new(bytes.Buffer)
                err := tr.Apply(out, strings.NewReader(test.content))
                if err != nil {
-                       t.Errorf("Unexpected error: %s", err)
+                       ef("Unexpected error: %s", err)
                }
                if test.expected != string(out.Bytes()) {
-                       t.Errorf("Expected:\n%s\nGot:\n%s", test.expected, string(out.Bytes()))
+                       ef("Expected:\n%s\nGot:\n%s", test.expected, string(out.Bytes()))
                }
        }
 }