1
0
mirror of https://github.com/json-iterator/go.git synced 2024-11-24 08:22:14 +02:00
A high-performance 100% compatible drop-in replacement of "encoding/json" http://jsoniter.com/migrate-from-go-std.html
Go to file
2016-12-04 22:50:53 +08:00
jsoniter_adapter.go adapter 2016-12-04 22:50:53 +08:00
jsoniter_array_test.go support array 2016-12-01 13:53:40 +08:00
jsoniter_bool_test.go support null/true/false 2016-12-02 11:22:20 +08:00
jsoniter_float_test.go support float 2016-12-01 23:25:29 +08:00
jsoniter_int_test.go merge lexer with iterator 2016-12-01 10:35:38 +08:00
jsoniter_io_test.go merge lexer with iterator 2016-12-01 10:35:38 +08:00
jsoniter_large_file_test.go support null/true/false 2016-12-02 11:22:20 +08:00
jsoniter_nested_test.go support null/true/false 2016-12-02 11:22:20 +08:00
jsoniter_null_test.go support null/true/false 2016-12-02 11:22:20 +08:00
jsoniter_object_test.go reflect string 2016-12-04 11:06:38 +08:00
jsoniter_reflect_test.go support string conversion 2016-12-04 22:45:20 +08:00
jsoniter_reflect.go support string conversion 2016-12-04 22:45:20 +08:00
jsoniter_skip_test.go reflect string 2016-12-04 11:06:38 +08:00
jsoniter_string_test.go merge lexer with iterator 2016-12-01 10:35:38 +08:00
jsoniter.go int/float/bool 2016-12-04 22:15:12 +08:00
LICENSE Initial commit 2016-11-30 08:30:24 +08:00
README.md support float 2016-12-01 23:25:29 +08:00

go

faster than DOM, more usable than SAX/StAX

string

func Benchmark_jsoniter_string(b *testing.B) {
	for n := 0; n < b.N; n++ {
		lexer := NewLexerWithArray([]byte(`"\ud83d\udc4a"`))
		lexer.LexString()
	}
}

10000000 140 ns/op

func Benchmark_json_string(b *testing.B) {
	for n := 0; n < b.N; n++ {
		result := ""
		json.Unmarshal([]byte(`"\ud83d\udc4a"`), &result)
	}
}

2000000 710 ns/op (5x slower)

int

func Benchmark_jsoniter_int(b *testing.B) {
	for n := 0; n < b.N; n++ {
		lexer := NewLexerWithArray([]byte(`-100`))
		lexer.LexInt64()
	}
}

30000000 60.1 ns/op

func Benchmark_json_int(b *testing.B) {
	for n := 0; n < b.N; n++ {
		result := int64(0)
		json.Unmarshal([]byte(`-100`), &result)
	}
}

3000000 505 ns/op (8x slower)

array

func Benchmark_jsoniter_array(b *testing.B) {
	for n := 0; n < b.N; n++ {
		iter := ParseString(`[1,2,3]`)
		for iter.ReadArray() {
			iter.ReadUint64()
		}
	}
}

10000000 189 ns/op

func Benchmark_json_array(b *testing.B) {
	for n := 0; n < b.N; n++ {
		result := []interface{}{}
		json.Unmarshal([]byte(`[1,2,3]`), &result)
	}
}

1000000 1327 ns/op

object

func Benchmark_jsoniter_object(b *testing.B) {
	for n := 0; n < b.N; n++ {
		iter := ParseString(`{"field1": "1", "field2": 2}`)
		obj := TestObj{}
		for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
			switch field {
			case "field1":
				obj.Field1 = iter.ReadString()
			case "field2":
				obj.Field2 = iter.ReadUint64()
			default:
				iter.ReportError("bind object", "unexpected field")
			}
		}
	}
}

5000000 401 ns/op

func Benchmark_json_object(b *testing.B) {
	for n := 0; n < b.N; n++ {
		result := TestObj{}
		json.Unmarshal([]byte(`{"field1": "1", "field2": 2}`), &result)
	}
}

1000000 1318 ns/op