neuecc / Utf8Json

Definitely Fastest and Zero Allocation JSON Serializer for C#(NET, .NET Core, Unity, Xamarin).
MIT License
2.36k stars 267 forks source link

More aggressive ahead of time optimization for string-key type formatter. #200

Open pCYSl5EDgo opened 4 years ago

pCYSl5EDgo commented 4 years ago

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

Benchmark Project Gist.