Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Should we consider FastExpressionCompiler? #5070

Closed
danielmarbach opened this issue Nov 10, 2017 · 13 comments
Closed

Should we consider FastExpressionCompiler? #5070

danielmarbach opened this issue Nov 10, 2017 · 13 comments

Comments

@danielmarbach
Copy link
Contributor

danielmarbach commented Nov 10, 2017

We got pinged by Maksim Volkau (@dadhi) over twitter after publishing the optimization blog post and he asked whether we considered FastExpressionCompiler. I built the expression compiler into the perf suite.

PipelineOptimizations.zip

Test Harness used

TLDR

  • Pipeline Warmup is 5-7 times faster with FastExpressionCompiler, but be aware we only take this hit on the first incoming message and the first outgoing message after that the pipeline is cached per endpoint
  • Pipeline Execution is 2-3 time faster with FastExpressionCompiler and allocs are mostly cut in half. There are some statistical edge cases when the code generated from FastExpressionCompiler allocs slightly more but that case would still be neglectable in comparison to the speed improvement we get.
  • Pipeline Exception, no impact therefore on par with ExpressionTrees
  • The only code change required would be to replace Compile() with CompileFast()

FastExpressionCompiler

It can be included as internal source file and doesn't need to be referenced as a nuget package.

Execution

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server Calls PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Gen 0 Allocated
V6_PipelineBeforeOptimizations Default True 20000 10 49.3809 ms 0.1993 ms 0.3453 ms 1.00 0.00 - 20.8 MB
V6_PipelineAfterOptimizations Default True 20000 10 5.0802 ms 0.0046 ms 0.0080 ms 0.10 0.00 - 106 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 10 1.5783 ms 0.0252 ms 0.0436 ms 0.03 0.00 - 64 B
V6_PipelineBeforeOptimizations ShortRun False 20000 10 43.4276 ms 0.1499 ms 0.2597 ms 1.00 0.00 1854.1667 20.8 MB
V6_PipelineAfterOptimizations ShortRun False 20000 10 5.1304 ms 0.0534 ms 0.0925 ms 0.12 0.00 - 128 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 10 1.7798 ms 0.0064 ms 0.0112 ms 0.04 0.00 - 64 B
V6_PipelineBeforeOptimizations Default True 20000 20 91.2203 ms 0.1649 ms 0.2856 ms 1.00 0.00 - 40.8 MB
V6_PipelineAfterOptimizations Default True 20000 20 11.2693 ms 0.0232 ms 0.0401 ms 0.12 0.00 - 169 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 20 4.4009 ms 0.0554 ms 0.0959 ms 0.05 0.00 - 63 B
V6_PipelineBeforeOptimizations ShortRun False 20000 20 85.3703 ms 1.5260 ms 2.6431 ms 1.00 0.00 5583.3333 40.8 MB
V6_PipelineAfterOptimizations ShortRun False 20000 20 11.3242 ms 0.0789 ms 0.1367 ms 0.13 0.00 - 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 20 4.3569 ms 0.0352 ms 0.0609 ms 0.05 0.00 - 128 B
V6_PipelineBeforeOptimizations Default True 20000 40 184.9601 ms 1.0042 ms 1.7393 ms 1.00 0.00 - 80.8 MB
V6_PipelineAfterOptimizations Default True 20000 40 24.3727 ms 0.5672 ms 0.9824 ms 0.13 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 40 10.4221 ms 0.2510 ms 0.4348 ms 0.06 0.00 - 126 B
V6_PipelineBeforeOptimizations ShortRun False 20000 40 168.7704 ms 0.6221 ms 1.0776 ms 1.00 0.00 13125.0000 80.8 MB
V6_PipelineAfterOptimizations ShortRun False 20000 40 22.9855 ms 0.1121 ms 0.1942 ms 0.14 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 40 10.0696 ms 0.1268 ms 0.2197 ms 0.06 0.00 - 256 B
V6_PipelineBeforeOptimizations Default True 40000 10 95.1512 ms 1.0038 ms 1.7387 ms 1.00 0.00 - 41.6 MB
V6_PipelineAfterOptimizations Default True 40000 10 9.8262 ms 0.0359 ms 0.0622 ms 0.10 0.00 - 169 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 10 3.1731 ms 0.0224 ms 0.0387 ms 0.03 0.00 - 64 B
V6_PipelineBeforeOptimizations ShortRun False 40000 10 88.5107 ms 1.2057 ms 2.0883 ms 1.00 0.00 5625.0000 41.6 MB
V6_PipelineAfterOptimizations ShortRun False 40000 10 10.6158 ms 0.1637 ms 0.2835 ms 0.12 0.00 - 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 10 3.2318 ms 0.0086 ms 0.0148 ms 0.04 0.00 - 128 B
V6_PipelineBeforeOptimizations Default True 40000 20 191.0007 ms 0.7147 ms 1.2380 ms 1.00 0.00 - 81.6 MB
V6_PipelineAfterOptimizations Default True 40000 20 23.9684 ms 0.6970 ms 1.2072 ms 0.13 0.01 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 20 9.1950 ms 0.0164 ms 0.0285 ms 0.05 0.00 - 212 B
V6_PipelineBeforeOptimizations ShortRun False 40000 20 175.9441 ms 0.9493 ms 1.6443 ms 1.00 0.00 13479.1667 81.6 MB
V6_PipelineAfterOptimizations ShortRun False 40000 20 22.7797 ms 0.3377 ms 0.5850 ms 0.13 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 20 8.8345 ms 0.2914 ms 0.5047 ms 0.05 0.00 - 256 B
V6_PipelineBeforeOptimizations Default True 40000 40 364.4532 ms 1.7702 ms 3.0660 ms 1.00 0.00 479.1667 161.6 MB
V6_PipelineAfterOptimizations Default True 40000 40 48.8405 ms 0.4487 ms 0.7772 ms 0.13 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 40 20.6690 ms 0.2409 ms 0.4172 ms 0.06 0.00 - 253 B
V6_PipelineBeforeOptimizations ShortRun False 40000 40 337.9013 ms 1.0889 ms 1.8861 ms 1.00 0.00 28729.1667 161.6 MB
V6_PipelineAfterOptimizations ShortRun False 40000 40 46.9093 ms 0.3307 ms 0.5728 ms 0.14 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 40 19.7279 ms 0.2114 ms 0.3661 ms 0.06 0.00 - 512 B
V6_PipelineBeforeOptimizations Default True 80000 10 191.5581 ms 2.2045 ms 3.8184 ms 1.00 0.00 - 83.2 MB
V6_PipelineAfterOptimizations Default True 80000 10 20.4156 ms 0.3855 ms 0.6677 ms 0.11 0.00 - 339 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 10 6.3456 ms 0.1008 ms 0.1746 ms 0.03 0.00 - 63 B
V6_PipelineBeforeOptimizations ShortRun False 80000 10 181.7614 ms 4.5953 ms 7.9593 ms 1.00 0.00 13562.5000 83.2 MB
V6_PipelineAfterOptimizations ShortRun False 80000 10 19.9475 ms 0.0338 ms 0.0585 ms 0.11 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 10 7.1301 ms 0.0349 ms 0.0605 ms 0.04 0.00 - 128 B
V6_PipelineBeforeOptimizations Default True 80000 20 371.5543 ms 1.2457 ms 2.1575 ms 1.00 0.00 708.3333 163.2 MB
V6_PipelineAfterOptimizations Default True 80000 20 43.7405 ms 0.0206 ms 0.0357 ms 0.12 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 20 18.2453 ms 0.0764 ms 0.1323 ms 0.05 0.00 - 253 B
V6_PipelineBeforeOptimizations ShortRun False 80000 20 340.6978 ms 2.0865 ms 3.6138 ms 1.00 0.00 28875.0000 163.2 MB
V6_PipelineAfterOptimizations ShortRun False 80000 20 44.2892 ms 0.3350 ms 0.5802 ms 0.13 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 20 17.6533 ms 0.1516 ms 0.2626 ms 0.05 0.00 - 512 B
V6_PipelineBeforeOptimizations Default True 80000 40 731.1730 ms 2.1501 ms 3.7241 ms 1.00 0.00 3375.0000 323.2 MB
V6_PipelineAfterOptimizations Default True 80000 40 95.7065 ms 0.2623 ms 0.4543 ms 0.13 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 40 40.1079 ms 0.1803 ms 0.3123 ms 0.05 0.00 - 339 B
V6_PipelineBeforeOptimizations ShortRun False 80000 40 668.3005 ms 1.3874 ms 2.4030 ms 1.00 0.00 59291.6667 323.2 MB
V6_PipelineAfterOptimizations ShortRun False 80000 40 93.0148 ms 0.5080 ms 0.8798 ms 0.14 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 40 40.2374 ms 0.1132 ms 0.1960 ms 0.06 0.00 - 512 B
V6_PipelineBeforeOptimizations Default True 160000 10 399.1602 ms 4.7089 ms 8.1561 ms 1.00 0.00 541.6667 166.4 MB
V6_PipelineAfterOptimizations Default True 160000 10 41.1244 ms 0.4377 ms 0.7581 ms 0.10 0.00 - 425 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 10 12.9218 ms 0.1181 ms 0.2046 ms 0.03 0.00 - 253 B
V6_PipelineBeforeOptimizations ShortRun False 160000 10 363.3347 ms 2.6012 ms 4.5055 ms 1.00 0.00 29604.1667 166.4 MB
V6_PipelineAfterOptimizations ShortRun False 160000 10 41.5657 ms 0.3642 ms 0.6309 ms 0.11 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 10 13.5175 ms 0.1716 ms 0.2971 ms 0.04 0.00 - 512 B
V6_PipelineBeforeOptimizations Default True 160000 20 754.5341 ms 2.2946 ms 3.9743 ms 1.00 0.00 3125.0000 326.4 MB
V6_PipelineAfterOptimizations Default True 160000 20 90.1520 ms 0.2996 ms 0.5188 ms 0.12 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 20 35.2007 ms 0.1976 ms 0.3423 ms 0.05 0.00 - 339 B
V6_PipelineBeforeOptimizations ShortRun False 160000 20 703.6527 ms 1.5641 ms 2.7091 ms 1.00 0.00 60083.3333 326.4 MB
V6_PipelineAfterOptimizations ShortRun False 160000 20 88.4889 ms 0.7112 ms 1.2318 ms 0.13 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 20 35.7490 ms 0.5911 ms 1.0238 ms 0.05 0.00 - 512 B
V6_PipelineBeforeOptimizations Default True 160000 40 1,446.0794 ms 0.5603 ms 0.9705 ms 1.00 0.00 8791.6667 646.41 MB
V6_PipelineAfterOptimizations Default True 160000 40 185.8124 ms 0.5100 ms 0.8834 ms 0.13 0.00 - 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 40 79.7784 ms 0.9194 ms 1.5924 ms 0.06 0.00 - 339 B
V6_PipelineBeforeOptimizations ShortRun False 160000 40 1,330.2898 ms 3.1324 ms 5.4254 ms 1.00 0.00 121083.3333 646.4 MB
V6_PipelineAfterOptimizations ShortRun False 160000 40 190.4554 ms 1.9649 ms 3.4033 ms 0.14 0.00 - 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 40 78.7509 ms 0.8809 ms 1.5258 ms 0.06 0.00 - 512 B

Warmup

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Allocated
V6_PipelineBeforeOptimizations Default True 10 43.7777 us 0.1771 us 0.3068 us 1.00 0.00 9.08 kB
V6_PipelineAfterOptimizations Default True 10 2,156.5350 us 21.8766 us 37.8914 us 49.26 0.76 65.73 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 10 428.5019 us 6.1191 us 10.5987 us 9.79 0.21 36.1 kB
V6_PipelineBeforeOptimizations ShortRun False 10 42.8995 us 0.7883 us 1.3654 us 1.00 0.00 9.08 kB
V6_PipelineAfterOptimizations ShortRun False 10 2,344.0314 us 115.8258 us 200.6161 us 54.68 4.08 65.79 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 10 447.0310 us 11.7012 us 20.2671 us 10.43 0.47 36.13 kB
V6_PipelineBeforeOptimizations Default True 20 81.9396 us 0.5512 us 0.9547 us 1.00 0.00 15.21 kB
V6_PipelineAfterOptimizations Default True 20 4,197.4866 us 21.9920 us 38.0913 us 51.23 0.62 125.21 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20 825.7814 us 31.2430 us 54.1145 us 10.08 0.55 67.23 kB
V6_PipelineBeforeOptimizations ShortRun False 20 79.1782 us 0.4425 us 0.7664 us 1.00 0.00 15.21 kB
V6_PipelineAfterOptimizations ShortRun False 20 4,129.5257 us 17.3138 us 29.9884 us 52.16 0.52 125.44 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20 886.5782 us 17.1015 us 29.6207 us 11.20 0.32 67.3 kB
V6_PipelineBeforeOptimizations Default True 40 161.4108 us 2.5122 us 4.3512 us 1.00 0.00 27.94 kB
V6_PipelineAfterOptimizations Default True 40 8,516.1444 us 298.3019 us 516.6741 us 52.79 2.87 244.74 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40 1,595.9191 us 71.1661 us 123.2632 us 9.89 0.66 129.99 kB
V6_PipelineBeforeOptimizations ShortRun False 40 156.5479 us 4.4060 us 7.6314 us 1.00 0.00 27.94 kB
V6_PipelineAfterOptimizations ShortRun False 40 8,765.5077 us 99.5851 us 172.4865 us 56.08 2.35 245.25 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40 1,646.0279 us 38.8743 us 67.3322 us 10.53 0.54 130.18 kB

Exception

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Allocated
V6_PipelineBeforeOptimizations Default True 10 71.3346 us 0.4070 us 0.7050 us 1.00 0.00 4.49 kB
V6_PipelineAfterOptimizations Default True 10 39.9160 us 0.4292 us 0.7434 us 0.56 0.01 1.99 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 10 40.0450 us 0.9671 us 1.6751 us 0.56 0.02 1.99 kB
V6_PipelineBeforeOptimizations ShortRun False 10 68.4828 us 0.6266 us 1.0852 us 1.00 0.00 4.49 kB
V6_PipelineAfterOptimizations ShortRun False 10 38.1926 us 0.5944 us 1.0295 us 0.56 0.01 1.99 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 10 38.6179 us 0.6529 us 1.1309 us 0.56 0.02 1.99 kB
V6_PipelineBeforeOptimizations Default True 20 114.5747 us 1.4548 us 2.5197 us 1.00 0.00 8.58 kB
V6_PipelineAfterOptimizations Default True 20 59.0636 us 0.8887 us 1.5392 us 0.52 0.01 2.13 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 20 59.0828 us 0.6022 us 1.0430 us 0.52 0.01 2.13 kB
V6_PipelineBeforeOptimizations ShortRun False 20 127.7010 us 4.8781 us 8.4491 us 1.00 0.00 8.58 kB
V6_PipelineAfterOptimizations ShortRun False 20 61.1301 us 1.4137 us 2.4486 us 0.48 0.03 2.12 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 20 60.9971 us 1.5137 us 2.6217 us 0.48 0.03 2.12 kB
V6_PipelineBeforeOptimizations Default True 40 215.4866 us 4.7726 us 8.2664 us 1.00 0.00 16.74 kB
V6_PipelineAfterOptimizations Default True 40 114.9275 us 4.4323 us 7.6769 us 0.53 0.03 3.93 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 40 106.5412 us 1.6581 us 2.8719 us 0.49 0.02 3.94 kB
V6_PipelineBeforeOptimizations ShortRun False 40 216.7843 us 4.5743 us 7.9230 us 1.00 0.00 16.74 kB
V6_PipelineAfterOptimizations ShortRun False 40 107.8426 us 1.3996 us 2.4241 us 0.50 0.02 3.93 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 40 106.3617 us 3.3189 us 5.7485 us 0.49 0.03 3.93 kB
@danielmarbach
Copy link
Contributor Author

danielmarbach commented Nov 10, 2017

For comparison reasons I also included the before optimization state again which was already shown in #4125. I hope this doesn't confuse people.

@danielmarbach
Copy link
Contributor Author

Here the direct comparison results for better visibility with the current state as baseline

PipelineOptimizationsFastCompiler.zip

Execution

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  DefaultJob : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

Method Calls PipelineDepth Mean StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations 20000 10 5.2150 ms 0.1241 ms 1.00 0.00 128 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 20000 10 1.7288 ms 0.0308 ms 0.33 0.01 64 B
V6_PipelineAfterOptimizations 20000 20 11.7946 ms 0.2766 ms 1.00 0.00 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 20000 20 4.5641 ms 0.1252 ms 0.39 0.01 128 B
V6_PipelineAfterOptimizations 20000 40 24.4706 ms 0.6048 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 20000 40 10.4173 ms 0.2937 ms 0.43 0.02 256 B
V6_PipelineAfterOptimizations 40000 10 10.2853 ms 0.1565 ms 1.00 0.00 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 40000 10 3.2283 ms 0.0293 ms 0.31 0.01 128 B
V6_PipelineAfterOptimizations 40000 20 23.4603 ms 0.6450 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 40000 20 9.3580 ms 0.3664 ms 0.40 0.02 256 B
V6_PipelineAfterOptimizations 40000 40 47.4478 ms 1.0909 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 40000 40 20.3637 ms 0.9877 ms 0.43 0.02 512 B
V6_PipelineAfterOptimizations 80000 10 20.4940 ms 0.7531 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 80000 10 6.8621 ms 0.1890 ms 0.34 0.01 256 B
V6_PipelineAfterOptimizations 80000 20 45.3888 ms 1.2609 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 80000 20 17.6103 ms 0.5939 ms 0.39 0.02 512 B
V6_PipelineAfterOptimizations 80000 40 94.2564 ms 2.1487 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 80000 40 41.8855 ms 0.7797 ms 0.44 0.01 512 B
V6_PipelineAfterOptimizations 160000 10 40.2086 ms 1.0627 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 160000 10 13.7986 ms 0.6001 ms 0.34 0.02 512 B
V6_PipelineAfterOptimizations 160000 20 90.2058 ms 1.6111 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 160000 20 35.1386 ms 0.7908 ms 0.39 0.01 512 B
V6_PipelineAfterOptimizations 160000 40 184.1954 ms 2.2679 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler 160000 40 78.4559 ms 1.1510 ms 0.43 0.01 512 B

Warmup

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  DefaultJob : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

Method PipelineDepth Mean StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations 10 2,193.7061 us 44.1710 us 1.00 0.00 65.79 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler 10 439.8062 us 17.4004 us 0.20 0.01 36.13 kB
V6_PipelineAfterOptimizations 20 4,249.7224 us 155.0188 us 1.00 0.00 125.44 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler 20 801.0275 us 16.4134 us 0.19 0.01 67.3 kB
V6_PipelineAfterOptimizations 40 8,440.3792 us 298.5925 us 1.00 0.00 245.25 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler 40 1,568.5564 us 16.7539 us 0.19 0.01 130.18 kB

Exception

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  DefaultJob : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

Method PipelineDepth Mean StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations 10 38.2557 us 1.1189 us 1.00 0.00 1.99 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler 10 36.7988 us 0.5650 us 0.96 0.03 1.99 kB
V6_PipelineAfterOptimizations 20 57.4146 us 1.5943 us 1.00 0.00 2.12 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler 20 56.7363 us 1.9853 us 0.99 0.04 2.12 kB
V6_PipelineAfterOptimizations 40 106.1673 us 1.9317 us 1.00 0.00 3.93 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler 40 104.1140 us 2.3913 us 0.98 0.03 3.93 kB

dadhi added a commit to dadhi/FastExpressionCompiler that referenced this issue Nov 10, 2017
added: Untyped overload for TryCompile(ExpressionInfo..)
added: ExpressionInfo.Parameter
@dadhi
Copy link

dadhi commented Nov 10, 2017

Hi @danielmarbach,

Here is the gist with use of FastExpressionInfo.ExpressionInfo instead of Expression.

Code is slightly modified. It is compile-able but I did not check or measure it.

Please use the last FastExpressionCompiler.cs from the master.

@danielmarbach
Copy link
Contributor Author

@dadhi what would be the benefit of using it that way over compile fast?

@dadhi
Copy link

dadhi commented Nov 10, 2017

CompileFast allows you to fallback to normal Expression.Compile. But for ExpressionInfo there is no way to fallback (for now), that is why TryCompile.

The benefit of ExpressionInfo is smaller footprint for expression creation comparing to Expression (not the compilation - it will be the same). Expression creation is verifying the arguments to ensure the valid tree is composed, ExpressionInfo is not - it is just a lightweight wrapper to represent a tree.

Here is the benchmark to get you an idea on how performance may differ.

@danielmarbach
Copy link
Contributor Author

I will add this to my benchmark and then repost the results next week

@dadhi
Copy link

dadhi commented Nov 12, 2017

@danielmarbach

I have released FEC v1.5.

Even better I have added conversion from ExpressionInfo to normal Expression, which enables fallback compilation for ExpressionInfo. In addition, now ExpressionInfo has the same CompileFast methods.

Check the updated gist with added toggle between Expression and ExpressionInfo, the rest of the code is the same and does not need a modification.

@danielmarbach
Copy link
Contributor Author

Last run with only ExpressionInfo

PipelineOptimizationsExpressionInfo.zip

Execution

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server Calls PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations Default True 20000 10 4.8552 ms 0.0332 ms 0.0575 ms 1.00 0.00 63 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 10 1.7273 ms 0.0175 ms 0.0304 ms 0.36 0.01 64 B
V6_PipelineAfterOptimizations ShortRun False 20000 10 4.8563 ms 0.0514 ms 0.0891 ms 1.00 0.00 128 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 10 1.7900 ms 0.0640 ms 0.1109 ms 0.37 0.02 64 B
V6_PipelineAfterOptimizations Default True 20000 20 10.8068 ms 0.0225 ms 0.0390 ms 1.00 0.00 126 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 20 4.3878 ms 0.0507 ms 0.0879 ms 0.41 0.01 84 B
V6_PipelineAfterOptimizations ShortRun False 20000 20 11.2471 ms 0.3555 ms 0.6158 ms 1.00 0.00 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 20 4.2284 ms 0.0251 ms 0.0434 ms 0.38 0.02 128 B
V6_PipelineAfterOptimizations Default True 20000 40 22.2748 ms 0.0594 ms 0.1029 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20000 40 9.6414 ms 0.2128 ms 0.3685 ms 0.43 0.01 126 B
V6_PipelineAfterOptimizations ShortRun False 20000 40 22.8412 ms 0.3814 ms 0.6606 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20000 40 9.4205 ms 0.0340 ms 0.0589 ms 0.41 0.01 256 B
V6_PipelineAfterOptimizations Default True 40000 10 9.5848 ms 0.0360 ms 0.0624 ms 1.00 0.00 126 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 10 3.3581 ms 0.0867 ms 0.1502 ms 0.35 0.01 85 B
V6_PipelineAfterOptimizations ShortRun False 40000 10 9.8221 ms 0.0824 ms 0.1427 ms 1.00 0.00 256 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 10 3.4049 ms 0.0655 ms 0.1135 ms 0.35 0.01 128 B
V6_PipelineAfterOptimizations Default True 40000 20 21.7778 ms 0.0707 ms 0.1225 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 20 8.7004 ms 0.2426 ms 0.4202 ms 0.40 0.02 126 B
V6_PipelineAfterOptimizations ShortRun False 40000 20 22.3349 ms 0.1512 ms 0.2618 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 20 8.9653 ms 0.0113 ms 0.0195 ms 0.40 0.00 256 B
V6_PipelineAfterOptimizations Default True 40000 40 45.7002 ms 0.3452 ms 0.5979 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40000 40 19.6350 ms 0.3210 ms 0.5560 ms 0.43 0.01 253 B
V6_PipelineAfterOptimizations ShortRun False 40000 40 44.3873 ms 0.1260 ms 0.2182 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40000 40 19.0337 ms 0.0285 ms 0.0494 ms 0.43 0.00 512 B
V6_PipelineAfterOptimizations Default True 80000 10 19.2310 ms 0.1019 ms 0.1765 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 10 6.3732 ms 0.0578 ms 0.1001 ms 0.33 0.00 126 B
V6_PipelineAfterOptimizations ShortRun False 80000 10 19.2547 ms 0.1794 ms 0.3107 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 10 6.8221 ms 0.1991 ms 0.3448 ms 0.35 0.02 256 B
V6_PipelineAfterOptimizations Default True 80000 20 43.5979 ms 0.5830 ms 1.0099 ms 1.00 0.00 339 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 20 17.3638 ms 0.1302 ms 0.2254 ms 0.40 0.01 253 B
V6_PipelineAfterOptimizations ShortRun False 80000 20 44.7953 ms 0.8908 ms 1.5429 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 20 16.8171 ms 0.0684 ms 0.1184 ms 0.38 0.01 512 B
V6_PipelineAfterOptimizations Default True 80000 40 91.0430 ms 1.2783 ms 2.2141 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 80000 40 40.5674 ms 2.1707 ms 3.7597 ms 0.45 0.03 339 B
V6_PipelineAfterOptimizations ShortRun False 80000 40 89.9253 ms 0.3353 ms 0.5808 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 80000 40 41.9736 ms 0.6845 ms 1.1855 ms 0.47 0.01 512 B
V6_PipelineAfterOptimizations Default True 160000 10 41.9118 ms 0.2308 ms 0.3997 ms 1.00 0.00 339 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 10 13.5556 ms 0.3840 ms 0.6650 ms 0.32 0.01 253 B
V6_PipelineAfterOptimizations ShortRun False 160000 10 39.7997 ms 0.4967 ms 0.8603 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 10 14.1131 ms 0.7715 ms 1.3362 ms 0.35 0.03 512 B
V6_PipelineAfterOptimizations Default True 160000 20 90.0651 ms 0.9135 ms 1.5823 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 20 35.5093 ms 0.6569 ms 1.1377 ms 0.39 0.01 339 B
V6_PipelineAfterOptimizations ShortRun False 160000 20 93.9787 ms 0.7495 ms 1.2982 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 20 33.4020 ms 0.0618 ms 0.1070 ms 0.36 0.00 512 B
V6_PipelineAfterOptimizations Default True 160000 40 182.0209 ms 1.5734 ms 2.7251 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 160000 40 75.9271 ms 0.3493 ms 0.6050 ms 0.42 0.01 253 B
V6_PipelineAfterOptimizations ShortRun False 160000 40 178.7956 ms 0.5839 ms 1.0113 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 160000 40 77.6670 ms 0.3446 ms 0.5969 ms 0.43 0.00 512 B
V6_PipelineAfterOptimizations Default True 320000 10 77.8864 ms 1.2486 ms 2.1627 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 320000 10 25.7584 ms 0.0271 ms 0.0469 ms 0.33 0.01 253 B
V6_PipelineAfterOptimizations ShortRun False 320000 10 81.4777 ms 1.2150 ms 2.1044 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 320000 10 28.3116 ms 0.7921 ms 1.3719 ms 0.35 0.02 512 B
V6_PipelineAfterOptimizations Default True 320000 20 183.5565 ms 1.0007 ms 1.7332 ms 1.00 0.00 253 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 320000 20 69.5037 ms 1.4220 ms 2.4630 ms 0.38 0.01 339 B
V6_PipelineAfterOptimizations ShortRun False 320000 20 184.7377 ms 1.4537 ms 2.5179 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 320000 20 71.2215 ms 0.6580 ms 1.1396 ms 0.39 0.01 512 B
V6_PipelineAfterOptimizations Default True 320000 40 377.2156 ms 1.4916 ms 2.5836 ms 1.00 0.00 339 B
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 320000 40 159.1500 ms 0.9296 ms 1.6101 ms 0.42 0.00 253 B
V6_PipelineAfterOptimizations ShortRun False 320000 40 377.0081 ms 1.0122 ms 1.7531 ms 1.00 0.00 512 B
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 320000 40 166.1854 ms 2.3777 ms 4.1184 ms 0.44 0.01 512 B

Exception

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations Default True 10 37.9070 us 0.0898 us 0.1555 us 1.00 0.00 1.99 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 10 39.1706 us 0.7935 us 1.3744 us 1.03 0.03 1.99 kB
V6_PipelineAfterOptimizations ShortRun False 10 36.9256 us 0.1678 us 0.2906 us 1.00 0.00 1.99 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 10 38.7316 us 0.8779 us 1.5206 us 1.05 0.03 1.99 kB
V6_PipelineAfterOptimizations Default True 20 63.8297 us 2.1841 us 3.7830 us 1.00 0.00 2.13 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 20 62.0349 us 1.6095 us 2.7877 us 0.97 0.06 2.13 kB
V6_PipelineAfterOptimizations ShortRun False 20 60.8630 us 1.4686 us 2.5437 us 1.00 0.00 2.12 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 20 59.2595 us 0.1870 us 0.3238 us 0.97 0.03 2.12 kB
V6_PipelineAfterOptimizations Default True 40 107.7277 us 3.1107 us 5.3879 us 1.00 0.00 3.93 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler Default True 40 111.5818 us 1.6175 us 2.8017 us 1.04 0.05 3.94 kB
V6_PipelineAfterOptimizations ShortRun False 40 105.8188 us 2.0011 us 3.4661 us 1.00 0.00 3.93 kB
V6_PipelineAfterOptimizationsFastExpressonCompiler ShortRun False 40 104.9203 us 2.7801 us 4.8152 us 0.99 0.05 3.93 kB

Warmup

BenchmarkDotNet=v0.10.1, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Xeon(R) CPU E5-2673 v3 2.40GHz, ProcessorCount=8
Frequency=10000000 Hz, Resolution=100.0000 ns, Timer=UNKNOWN
  [Host]     : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  Job-YGLQQT : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0
  ShortRun   : Clr 4.0.30319.42000, 32bit LegacyJIT-v4.7.2115.0

LaunchCount=1  TargetCount=3  WarmupCount=3  
Method Job Server PipelineDepth Mean StdErr StdDev Scaled Scaled-StdDev Allocated
V6_PipelineAfterOptimizations Default True 10 2,071.7615 us 21.4834 us 37.2103 us 1.00 0.00 65.75 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 10 321.4169 us 8.4263 us 14.5947 us 0.16 0.01 30.88 kB
V6_PipelineAfterOptimizations ShortRun False 10 2,121.8680 us 17.9831 us 31.1476 us 1.00 0.00 65.79 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 10 327.3759 us 0.6460 us 1.1190 us 0.15 0.00 30.9 kB
V6_PipelineAfterOptimizations Default True 20 4,180.9245 us 138.5255 us 239.9333 us 1.00 0.00 125.18 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 20 590.5395 us 0.7095 us 1.2289 us 0.14 0.01 57.29 kB
V6_PipelineAfterOptimizations ShortRun False 20 4,136.5739 us 103.5353 us 179.3284 us 1.00 0.00 125.44 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 20 633.8564 us 5.7442 us 9.9493 us 0.15 0.01 57.31 kB
V6_PipelineAfterOptimizations Default True 40 9,015.7479 us 208.1210 us 360.4761 us 1.00 0.00 244.86 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler Default True 40 1,244.6366 us 16.6989 us 28.9234 us 0.14 0.01 110.63 kB
V6_PipelineAfterOptimizations ShortRun False 40 8,554.3950 us 65.4693 us 113.3962 us 1.00 0.00 245.25 kB
V6_PipelineAfterOptimizationsFastExpressionCompiler ShortRun False 40 1,303.6014 us 13.1704 us 22.8117 us 0.15 0.00 110.66 kB

@dadhi
Copy link

dadhi commented Nov 13, 2017

@danielmarbach I see a bit faster Warm-up, now ~7 times. Other things without change, which is expected :)

@timbussmann
Copy link
Contributor

I don't mind too much about the warmup time, but

Pipeline Execution is 2-3 time faster

does sound very interesting indeed.

It's good to see that we could pull this in without actually increasing our nuget dependency footprint. It's still a new dependency to manage and maintain though.

In general, I'm +1 on this though. Adding this to the weekly sync topics.

@timbussmann
Copy link
Contributor

Closing this issue as we all agreed that we'd like to use FastExpressionCompiler in the future. This is nothing we can pull in anymore on the v7 release, but we definitely see chances this gets into one of the next minor releases. There is an internal issue in our platform development repository representing this task. Thanks a lot for bringing this up @dadhi and @danielmarbach for spiking this already 👍 ❤️

@jogibear9988
Copy link

you can do it like it is suggested on linq2db: https://github.com/linq2db/linq2db/pull/1277/files#diff-b68c5ca659d7b8d1503651f8140bb774R11
so you can configure wich compiler to use, or fallback to the original one!

@danielmarbach
Copy link
Contributor Author

Hi jochen,

We implemented it in the next minor of the 7.x release train. It will go out soonish

Daniel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants