From 5393fa858ab24529420e558c8b6600cde66697c2 Mon Sep 17 00:00:00 2001 From: mstmdev Date: Mon, 21 Mar 2022 02:43:14 +0800 Subject: [PATCH 1/4] Merge the write operation for json render and improve the code coverage --- render/json.go | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/render/json.go b/render/json.go index 3ebcee97..f1f8a6ae 100644 --- a/render/json.go +++ b/render/json.go @@ -52,6 +52,11 @@ var ( jsonASCIIContentType = []string{"application/json"} ) +var ( + leftSquareBracket = bytesconv.StringToBytes("[") + rightSquareBracket = bytesconv.StringToBytes("]") +) + // Render (JSON) writes data with custom ContentType. func (r JSON) Render(w http.ResponseWriter) (err error) { if err = WriteJSON(w, r.Data); err != nil { @@ -100,11 +105,8 @@ func (r SecureJSON) Render(w http.ResponseWriter) error { return err } // if the jsonBytes is array values - if bytes.HasPrefix(jsonBytes, bytesconv.StringToBytes("[")) && bytes.HasSuffix(jsonBytes, - bytesconv.StringToBytes("]")) { - if _, err = w.Write(bytesconv.StringToBytes(r.Prefix)); err != nil { - return err - } + if bytes.HasPrefix(jsonBytes, leftSquareBracket) && bytes.HasSuffix(jsonBytes, rightSquareBracket) { + jsonBytes = append(bytesconv.StringToBytes(r.Prefix), jsonBytes...) } _, err = w.Write(jsonBytes) return err @@ -128,24 +130,9 @@ func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { return err } - callback := template.JSEscapeString(r.Callback) - if _, err = w.Write(bytesconv.StringToBytes(callback)); err != nil { - return err - } - - if _, err = w.Write(bytesconv.StringToBytes("(")); err != nil { - return err - } - - if _, err = w.Write(ret); err != nil { - return err - } - - if _, err = w.Write(bytesconv.StringToBytes(");")); err != nil { - return err - } - - return nil + jsonpData := fmt.Sprintf("%s(%s);", template.JSEscapeString(r.Callback), bytesconv.BytesToString(ret)) + _, err = w.Write(bytesconv.StringToBytes(jsonpData)) + return err } // WriteContentType (JsonpJSON) writes Javascript ContentType. From cfb4a981ffe81e080c26c8ad0163e003036473e9 Mon Sep 17 00:00:00 2001 From: mstmdev Date: Thu, 24 Mar 2022 17:31:00 +0800 Subject: [PATCH 2/4] Reduce convert between int32 and string in the AsciiJSON.Render function --- render/json.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/render/json.go b/render/json.go index f1f8a6ae..ea052f62 100644 --- a/render/json.go +++ b/render/json.go @@ -150,11 +150,11 @@ func (r AsciiJSON) Render(w http.ResponseWriter) (err error) { var buffer bytes.Buffer for _, r := range bytesconv.BytesToString(ret) { - cvt := string(r) if r >= 128 { - cvt = fmt.Sprintf("\\u%04x", int64(r)) + buffer.WriteString(fmt.Sprintf("\\u%04x", r)) + } else { + buffer.WriteByte(byte(r)) } - buffer.WriteString(cvt) } _, err = w.Write(buffer.Bytes()) From cb2e89b1ca406676bdbd9335095df83a58ee22ca Mon Sep 17 00:00:00 2001 From: mstmdev Date: Fri, 25 Mar 2022 13:23:11 +0800 Subject: [PATCH 3/4] Add benchmark tests for the AsciiJSON and JsonpJSON --- render/render_test.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/render/render_test.go b/render/render_test.go index 8b28dc3f..71e2f330 100644 --- a/render/render_test.go +++ b/render/render_test.go @@ -510,3 +510,33 @@ func TestRenderReaderNoContentLength(t *testing.T) { assert.Equal(t, headers["Content-Disposition"], w.Header().Get("Content-Disposition")) assert.Equal(t, headers["x-request-id"], w.Header().Get("x-request-id")) } + +func BenchmarkAsciiJSONRender(b *testing.B) { + data := getRenderData() + benchmarkRender(b, AsciiJSON{Data: data}) +} + +func BenchmarkJsonpJSONRender(b *testing.B) { + data := getRenderData() + benchmarkRender(b, JsonpJSON{Data: data}) +} + +func benchmarkRender(b *testing.B, r Render) { + w := httptest.NewRecorder() + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + err := r.Render(w) + if err != nil { + b.Errorf("test json render error =>%v", err) + } + } +} + +func getRenderData() map[string]any { + data := map[string]any{ + "cn": "

你好 世界

", + "en": "

hello world

", + } + return data +} From 9be676c63863b22898fc5e8278d21a5467fe4375 Mon Sep 17 00:00:00 2001 From: mstmdev Date: Fri, 25 Mar 2022 22:03:07 +0800 Subject: [PATCH 4/4] Replace fmt.Sprintf with direct combining strings --- render/json.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/render/json.go b/render/json.go index 502afe76..c5b70d4a 100644 --- a/render/json.go +++ b/render/json.go @@ -129,9 +129,7 @@ func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { _, err = w.Write(ret) return err } - - jsonpData := fmt.Sprintf("%s(%s);", template.JSEscapeString(r.Callback), bytesconv.BytesToString(ret)) - _, err = w.Write(bytesconv.StringToBytes(jsonpData)) + _, err = w.Write(bytesconv.StringToBytes(template.JSEscapeString(r.Callback) + "(" + bytesconv.BytesToString(ret) + ");")) return err }