From 591162da505b9ead8726c0fc08ac8ff2f060d6c7 Mon Sep 17 00:00:00 2001 From: Kolja Dummann Date: Fri, 3 Dec 2021 11:44:40 +0100 Subject: [PATCH] Generator performance (#2200) As part of profiling efforts in a customer projects we identified a couple of hotspots during generation. Most of them were typesystem related. To cache the expensive typesystem calls I introduced TypeCacheHelper which essentially applies memoization. It is used to wrap all call to the typesystem and will return a result from it's cache when it encounters the same node twice. The new typesystem cache is used in: handleArrayStructUnionInitExprAndAssignments TransparentStructHelper From my testing caching there doesn't break anything but please do some extensive testing in other codebases to see if this really holds. The second hotspot we identified was sorting the module content. Here as well we apply caching. Since the sortied relies on function signatures the function to a given signature is cached in the Dependencies class. The class itself is also no longer static so that we can determine the lifecycle of the cache. There are a couple of smaller optimisations in various places of the generator where multiple calls to .type are replaced with a local variable to store the result. All in all these changes cut our generation by 40-50%. --- .../models/com/mbeddr/build/build.mps | 5 + .../core/modules/gen/generator/main/util.mps | 1004 ++++++++++------- ...generator.com.mbeddr.core.modules.util.mps | 2 + .../generator/template/main@generator.mps | 252 +++-- .../languageModels/plugin.mps | 119 ++ .../com.mbeddr.core.modules/modules.mpl | 1 + .../generator/template/main@generator.mps | 45 +- .../generator/template/main@generator.mps | 26 +- 8 files changed, 924 insertions(+), 530 deletions(-) diff --git a/code/languages/com.mbeddr.build/solutions/com.mbeddr.build/models/com/mbeddr/build/build.mps b/code/languages/com.mbeddr.build/solutions/com.mbeddr.build/models/com/mbeddr/build/build.mps index e0e16de91a..20b260f439 100755 --- a/code/languages/com.mbeddr.build/solutions/com.mbeddr.build/models/com/mbeddr/build/build.mps +++ b/code/languages/com.mbeddr.build/solutions/com.mbeddr.build/models/com/mbeddr/build/build.mps @@ -3700,6 +3700,11 @@ + + + + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules.gen/generator/template/com/mbeddr/core/modules/gen/generator/main/util.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules.gen/generator/template/com/mbeddr/core/modules/gen/generator/main/util.mps index 2484416e16..18d5a33301 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules.gen/generator/template/com/mbeddr/core/modules/gen/generator/main/util.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules.gen/generator/template/com/mbeddr/core/modules/gen/generator/main/util.mps @@ -18,6 +18,7 @@ + @@ -46,6 +47,9 @@ + + + @@ -69,12 +73,10 @@ - - - + @@ -196,9 +198,6 @@ - - - @@ -287,6 +286,7 @@ + @@ -328,6 +328,19 @@ + + + + + + + + + + + + + @@ -361,37 +374,40 @@ - - - - - - - - + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - + + + + + @@ -442,24 +458,29 @@ - - - - - - + + + + + + + + + + + + + + + + - - - + + - - - - @@ -526,24 +547,29 @@ - - - - - - + + + + + + + + + + + + + + + + - - - + + - - - - @@ -554,24 +580,29 @@ - - - - - - + + + + + + + + + + + + + + + + - - - + + - - - - @@ -800,11 +831,16 @@ - - - + + + + + + + + + - @@ -818,17 +854,22 @@ - - - - - - + + + + + + + + + + + @@ -841,15 +882,20 @@ - - - - - - + + + + + + + + + + + @@ -1851,20 +1897,37 @@ + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + + @@ -2419,126 +2482,143 @@ - - - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + + + + - - - + + + - - + + - - - - + + + + - - + + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - - - - - + + + + + - + - - - + + + - + @@ -2547,54 +2627,54 @@ - - - - + + + + - + - + - + - - - - - + + + + + - + - + - - - - - + + + + + - + - - - - + + + + - + - + - - + + @@ -2603,39 +2683,39 @@ - - - + + + - + - + - - + + - - - - - + + + + + - + - - + + - - - + + + - + @@ -2643,156 +2723,156 @@ - - - + + + - - - + + + - - - - + + + + - + - + - + - + - + - - + + - - - + + + - + - - - + + + - + - - - - + + + + - - + + - - - - - + + + + + - + - + - + - + - - + + - + - - - - - + + + + + - + - - - - + + + + - - - - - - - - + + + + + + + + - + - - + + - - + + - - - - - + + + + + - + - - + + - - + + @@ -2801,19 +2881,19 @@ - - - - - + + + + + - + - - + + - - + + @@ -2821,35 +2901,35 @@ - - - + + + - - - + + + - - - + + + - - + + - - + + - - + + - - - + + + @@ -2857,180 +2937,288 @@ - - - - - - - - - - + + + - - + + + + + + + + + + + + - - - + + + + + + + + - - - - + + + + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - + - - - + + + - + - - - - + + + + + + + + + + + + + + + + + + + - - - - + + + + - + - - - + + + - - - + + + - - + - - - - - - - - + + - - + + - - - + + + + + + + + - - - - + + + + - + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - + - - - + + + - + - - - - + + + + + + + + + + + + + + + + + + + - - - - + + + + - + - - - + + + - - - + + + - - + + + + + + + + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/com.mbeddr.core.modules.generator.com.mbeddr.core.modules.util.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/com.mbeddr.core.modules.generator.com.mbeddr.core.modules.util.mps index b46891de3a..cb3c03d7be 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/com.mbeddr.core.modules.generator.com.mbeddr.core.modules.util.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/com.mbeddr.core.modules.generator.com.mbeddr.core.modules.util.mps @@ -13,6 +13,8 @@ + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/main@generator.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/main@generator.mps index a37f3ad995..8b5c106169 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/main@generator.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/generator/template/main@generator.mps @@ -31,6 +31,7 @@ + @@ -48,6 +49,9 @@ + + + @@ -55,6 +59,9 @@ + + + @@ -175,10 +182,15 @@ + + + + + @@ -220,7 +232,6 @@ - @@ -949,6 +960,20 @@ + + + + + + + + + + + + + + @@ -1665,22 +1690,27 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -2209,16 +2239,21 @@ - - - - - - - + + + + + + + + + + + + + - @@ -2227,22 +2262,27 @@ - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -2487,16 +2527,21 @@ - - - - - - - + + + + + + + + + + + + + - @@ -2708,31 +2753,41 @@ - - - - - - - + + + + + + + + + + + + + - - - - - - - - + + + + + + + + + + + + + - @@ -2741,43 +2796,61 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + @@ -2785,8 +2858,11 @@ - - + + + + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/languageModels/plugin.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/languageModels/plugin.mps index 0c9f28d3f0..473d279607 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/languageModels/plugin.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/languageModels/plugin.mps @@ -9,6 +9,9 @@ + + + @@ -35,6 +38,7 @@ + @@ -161,6 +165,11 @@ + + + + + @@ -255,6 +264,18 @@ + + + + + + + + + + + + @@ -1148,5 +1169,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/modules.mpl b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/modules.mpl index 4c705d6532..9eed8f5355 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/modules.mpl +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.modules/modules.mpl @@ -31,6 +31,7 @@ 6d11763d-483d-4b2b-8efc-09336c1b0001(com.mbeddr.core.modules) be090156-a678-454c-bd8f-89ebd4a0e6af(com.mbeddr.core.modules.gen#1758019824472882132) 2ed50273-af07-4e30-9004-b1f89545178a(com.mbeddr.core.stdlib) + 8865b7a8-5271-43d3-884c-6fd1d9cfdd34(MPS.OpenAPI) diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.unittest/generator/template/main@generator.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.unittest/generator/template/main@generator.mps index 70f0330cba..558068b938 100644 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.unittest/generator/template/main@generator.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.unittest/generator/template/main@generator.mps @@ -1857,18 +1857,27 @@ + + + + + + + + + + + + + + + - - - - - - - - + + @@ -1880,14 +1889,8 @@ - - - - - - - - + + @@ -1898,14 +1901,8 @@ - - - - - - - - + + diff --git a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.util/generator/template/main@generator.mps b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.util/generator/template/main@generator.mps index e3d30d43e4..cbcc0bda67 100755 --- a/code/languages/com.mbeddr.core/languages/com.mbeddr.core.util/generator/template/main@generator.mps +++ b/code/languages/com.mbeddr.core/languages/com.mbeddr.core.util/generator/template/main@generator.mps @@ -26485,6 +26485,18 @@ + + + + + + + + + + + + @@ -26501,11 +26513,8 @@ - - - - - + + @@ -26517,11 +26526,8 @@ - - - - - + +