Skip to content

Commit 4ad1c51

Browse files
committed
new/http: add request file upload benchmarks
This adds a couple of benchmarks to test file uploads using PUT requests. It's designed to complement changes https://golang.org/cl/163599 and https://golang.org/cl/163737, allowing an easy comparison of performance before and after these changes are applied. Updates #30377.
1 parent 01f34cb commit 4ad1c51

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

src/net/http/request_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ import (
88
"bufio"
99
"bytes"
1010
"context"
11+
"crypto/rand"
12+
"crypto/tls"
1113
"encoding/base64"
1214
"fmt"
1315
"io"
1416
"io/ioutil"
1517
"mime/multipart"
1618
. "net/http"
19+
"net/http/httptest"
1720
"net/url"
1821
"os"
1922
"reflect"
@@ -1046,3 +1049,94 @@ func BenchmarkReadRequestWrk(b *testing.B) {
10461049
Host: localhost:8080
10471050
`)
10481051
}
1052+
1053+
const benchmarkRequestWriteFileSize = 10240000
1054+
1055+
func benchmarkRequestFileAndServer(useTLS bool) (*os.File, func(), *httptest.Server, func(), error) {
1056+
tf, err := ioutil.TempFile("", "go-bench-http")
1057+
if err != nil {
1058+
return nil, nil, nil, nil, err
1059+
}
1060+
1061+
if _, err = io.Copy(tf, io.LimitReader(rand.Reader, benchmarkRequestWriteFileSize)); err != nil {
1062+
return nil, nil, nil, nil, err
1063+
}
1064+
1065+
tf.Close()
1066+
tf, err = os.Open(tf.Name())
1067+
if err != nil {
1068+
return nil, nil, nil, nil, err
1069+
}
1070+
1071+
var ts *httptest.Server
1072+
hf := HandlerFunc(func(w ResponseWriter, r *Request) {
1073+
n, err := io.Copy(ioutil.Discard, r.Body)
1074+
if err != nil {
1075+
panic(err)
1076+
}
1077+
1078+
if n != benchmarkRequestWriteFileSize {
1079+
panic(fmt.Errorf("expected %d bytes read, got %d", benchmarkRequestWriteFileSize, n))
1080+
}
1081+
1082+
r.Body.Close()
1083+
w.WriteHeader(200)
1084+
})
1085+
1086+
if useTLS {
1087+
ts = httptest.NewTLSServer(hf)
1088+
} else {
1089+
ts = httptest.NewServer(hf)
1090+
}
1091+
1092+
return tf, func() { tf.Close(); os.Remove(tf.Name()) }, ts, func() { ts.Close() }, nil
1093+
}
1094+
1095+
func runBenchmarkRequestWriteFile(b *testing.B, useTLS bool) {
1096+
tf, tfClose, ts, tsClose, err := benchmarkRequestFileAndServer(useTLS)
1097+
if err != nil {
1098+
b.Fatal(err)
1099+
}
1100+
1101+
defer tsClose()
1102+
defer tfClose()
1103+
1104+
tr := new(Transport)
1105+
if useTLS {
1106+
tr.TLSClientConfig = &tls.Config{
1107+
InsecureSkipVerify: true,
1108+
}
1109+
}
1110+
1111+
c := &Client{Transport: tr}
1112+
r := ioutil.NopCloser(tf)
1113+
1114+
b.ResetTimer()
1115+
for i := 0; i < b.N; i++ {
1116+
req, err := NewRequest("PUT", ts.URL, r)
1117+
if err != nil {
1118+
b.Fatal(err)
1119+
}
1120+
1121+
req.ContentLength = benchmarkRequestWriteFileSize
1122+
req.Header.Add("Content-Type", "application/octet-stream")
1123+
_, err = c.Do(req)
1124+
if err != nil {
1125+
b.Fatal(err)
1126+
}
1127+
1128+
b.SetBytes(benchmarkRequestWriteFileSize)
1129+
1130+
if _, err := tf.Seek(0, 0); err != nil {
1131+
b.Fatal(err)
1132+
}
1133+
}
1134+
}
1135+
1136+
func BenchmarkRequestWriteFileNoTLS(b *testing.B) {
1137+
runBenchmarkRequestWriteFile(b, false)
1138+
}
1139+
1140+
func BenchmarkRequestWriteFileWithTLS(b *testing.B) {
1141+
runBenchmarkRequestWriteFile(b, true)
1142+
}

0 commit comments

Comments
 (0)