Utf8Json icon indicating copy to clipboard operation
Utf8Json copied to clipboard

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

Open pCYSl5EDgo opened this issue 5 years ago • 0 comments

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.

pCYSl5EDgo avatar Apr 01 '20 16:04 pCYSl5EDgo