Utf8Json
Utf8Json copied to clipboard
More aggressive ahead of time optimization for string-key type formatter.
Summary
Current UniversalCodeGenerator generated formatter code unnecessarily allocates byte[] array and others. This pull request reduces memory allocation, improves runtime initialization performance and embeds specialized automaton code for deserialization.
Benchmark
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18363
Intel Core i7-8750H CPU 2.20GHz (Coffee Lake), 1 CPU, 12 logical and 6 physical cores
.NET Core SDK=3.1.200
[Host] : .NET Core 3.1.2 (CoreCLR 4.700.20.6602, CoreFX 4.700.20.6702), X64 RyuJIT
Job-RCOQVZ : .NET Core 3.1.2 (CoreCLR 4.700.20.6602, CoreFX 4.700.20.6702), X64 RyuJIT
Runtime=.NET Core 3.1
| Method | ConstantString | Mean | Error | StdDev | Median |
|---|---|---|---|---|---|
| DeserializeTest_NewEmbeddedFormatter | 669.1 ns | 13.12 ns | 13.48 ns | 667.4 ns | |
| DeserializeTest2_OriginalGeneratedFormatter | 924.4 ns | 18.56 ns | 42.64 ns | 914.6 ns | |
| DeserializeTest3_DynamicILGenerator_Formatter | 675.5 ns | 13.49 ns | 24.66 ns | 672.1 ns | |
| DeserializeTest_NewEmbeddedFormatter | a | 751.3 ns | 21.10 ns | 60.21 ns | 731.5 ns |
| DeserializeTest2_OriginalGeneratedFormatter | a | 930.9 ns | 15.06 ns | 14.09 ns | 929.3 ns |
| DeserializeTest3_DynamicILGenerator_Formatter | a | 672.3 ns | 13.36 ns | 13.72 ns | 666.1 ns |
| DeserializeTest_NewEmbeddedFormatter | shorter | 736.6 ns | 16.93 ns | 15.83 ns | 731.6 ns |
| DeserializeTest2_OriginalGeneratedFormatter | shorter | 1,005.6 ns | 19.96 ns | 48.20 ns | 995.6 ns |
| DeserializeTest3_DynamicILGenerator_Formatter | shorter | 694.8 ns | 12.88 ns | 12.65 ns | 692.0 ns |
| DeserializeTest_NewEmbeddedFormatter | このベンチ(...) [62] | 1,208.8 ns | 22.94 ns | 24.54 ns | 1,206.4 ns |
| DeserializeTest2_OriginalGeneratedFormatter | このベンチ(...) [62] | 1,550.3 ns | 45.38 ns | 128.74 ns | 1,510.0 ns |
| DeserializeTest3_DynamicILGenerator_Formatter | このベンチ(...) [62] | 1,169.7 ns | 16.99 ns | 14.19 ns | 1,165.6 ns |