From f08b042e8cb12091aadc23d005ebc85420a378dd Mon Sep 17 00:00:00 2001 From: "duanyi.aster" Date: Thu, 31 Mar 2022 20:40:11 +0800 Subject: [PATCH 1/2] fix: issue_213 --- issue_test/issue213_test.go | 60 +++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 issue_test/issue213_test.go diff --git a/issue_test/issue213_test.go b/issue_test/issue213_test.go new file mode 100644 index 000000000..678b31c64 --- /dev/null +++ b/issue_test/issue213_test.go @@ -0,0 +1,60 @@ +/* + * Copyright 2021 ByteDance Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package issue_test + +import ( + "fmt" + "sync" + "testing" + + // "github.com/bytedance/sonic" + "github.com/bytedance/sonic" +) + +type ByteStruct struct { + Bytes []byte +} + +type ObjStruct struct { + Obj ByteStruct +} + +func TestIssue213(t *testing.T) { + // bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\"}}") // this is OK + bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\", \"你好U世界\":0}}") + fmt.Println(string(bytes)) + wg := sync.WaitGroup{} + for i:=0;i<1000;i++{ + wg.Add(1) + go func(){ + defer wg.Done() + var o *ObjStruct + fmt.Println("sonic :", sonic.Unmarshal(bytes, &o), o.Obj) + }() + } + wg.Wait() +} + +func BenchmarkUnknowFields(b *testing.B) { + // bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\"}}") // this is OK + js := "{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\", \"你好U世界\":0}}" + b.ResetTimer() + for i:=0; i Date: Thu, 21 Apr 2022 14:24:56 +0800 Subject: [PATCH 2/2] fix (decoder): use AVX mode only on base64x --- decoder/assembler_amd64_go116.go | 9 ++---- decoder/assembler_amd64_go117.go | 9 ++---- issue_test/issue213_test.go | 55 ++++++++++++++++---------------- 3 files changed, 31 insertions(+), 42 deletions(-) diff --git a/decoder/assembler_amd64_go116.go b/decoder/assembler_amd64_go116.go index afd087d6d..28524a6e8 100644 --- a/decoder/assembler_amd64_go116.go +++ b/decoder/assembler_amd64_go116.go @@ -27,7 +27,6 @@ import ( `unsafe` `github.com/bytedance/sonic/internal/caching` - `github.com/bytedance/sonic/internal/cpu` `github.com/bytedance/sonic/internal/jit` `github.com/bytedance/sonic/internal/native` `github.com/bytedance/sonic/internal/native/types` @@ -1117,12 +1116,8 @@ func (self *_Assembler) _asm_OP_bin(_ *_Instr) { self.Emit("MOVQ" , _SI, jit.Ptr(_VP, 16)) // MOVQ SI, 16(VP) self.malloc(_SI, _SI) // MALLOC SI, SI - /* check for AVX2 support */ - if !cpu.HasAVX2 { - self.Emit("XORL", _CX, _CX) // XORL CX, CX - } else { - self.Emit("MOVL", jit.Imm(_MODE_AVX2), _CX) // MOVL $_MODE_AVX2, CX - } + // TODO: due to base64x's bug, only use AVX mode now + self.Emit("XORL", _CX, _CX) // XORL CX, CX /* call the decoder */ self.Emit("XORL" , _DX, _DX) // XORL DX, DX diff --git a/decoder/assembler_amd64_go117.go b/decoder/assembler_amd64_go117.go index 5263b9e29..41846ec03 100644 --- a/decoder/assembler_amd64_go117.go +++ b/decoder/assembler_amd64_go117.go @@ -27,7 +27,6 @@ import ( `unsafe` `github.com/bytedance/sonic/internal/caching` - `github.com/bytedance/sonic/internal/cpu` `github.com/bytedance/sonic/internal/jit` `github.com/bytedance/sonic/internal/native` `github.com/bytedance/sonic/internal/native/types` @@ -1114,12 +1113,8 @@ func (self *_Assembler) _asm_OP_bin(_ *_Instr) { self.Emit("MOVQ" , _SI, jit.Ptr(_VP, 16)) // MOVQ SI, 16(VP) self.malloc_AX(_SI, _SI) // MALLOC SI, SI - /* check for AVX2 support */ - if !cpu.HasAVX2 { - self.Emit("XORL", _CX, _CX) // XORL CX, CX - } else { - self.Emit("MOVL", jit.Imm(_MODE_AVX2), _CX) // MOVL $_MODE_AVX2, CX - } + // TODO: due to base64x's bug, only use AVX mode now + self.Emit("XORL", _CX, _CX) // XORL CX, CX /* call the decoder */ self.Emit("XORL" , _DX, _DX) // XORL DX, DX diff --git a/issue_test/issue213_test.go b/issue_test/issue213_test.go index 678b31c64..2a2d792e5 100644 --- a/issue_test/issue213_test.go +++ b/issue_test/issue213_test.go @@ -17,44 +17,43 @@ package issue_test import ( - "fmt" - "sync" - "testing" + `sync` + `testing` - // "github.com/bytedance/sonic" - "github.com/bytedance/sonic" + `github.com/bytedance/sonic` ) type ByteStruct struct { - Bytes []byte + Bytes []byte } type ObjStruct struct { - Obj ByteStruct + Obj ByteStruct } func TestIssue213(t *testing.T) { - // bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\"}}") // this is OK - bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\", \"你好U世界\":0}}") - fmt.Println(string(bytes)) - wg := sync.WaitGroup{} - for i:=0;i<1000;i++{ - wg.Add(1) - go func(){ - defer wg.Done() - var o *ObjStruct - fmt.Println("sonic :", sonic.Unmarshal(bytes, &o), o.Obj) - }() - } - wg.Wait() + // bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\"}}") // this is OK + bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\", \"x\":0}}") + wg := sync.WaitGroup{} + for i:=0;i<1000;i++{ + wg.Add(1) + go func(){ + defer wg.Done() + var o *ObjStruct + if err := sonic.Unmarshal(bytes, &o); err != nil { + t.Fatal(err) + } + }() + } + wg.Wait() } -func BenchmarkUnknowFields(b *testing.B) { - // bytes := []byte("{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\"}}") // this is OK - js := "{\"Obj\":{\"Bytes\":\"eyJUZXN0Q29kZSI6MjIyMiwiVGVzdFN0cmluZyI6InRlc3Rfc3RyaW5n\", \"你好U世界\":0}}" - b.ResetTimer() - for i:=0; i