Skip to content

Comments

Added a cache around the hotest pattern match in the solver#23

Merged
PaulKlint merged 1 commit intomainfrom
fix/improve-solver-performance
Oct 10, 2025
Merged

Added a cache around the hotest pattern match in the solver#23
PaulKlint merged 1 commit intomainfrom
fix/improve-solver-performance

Conversation

@DavyLandman
Copy link
Member

@DavyLandman DavyLandman commented Oct 6, 2025

We've all seen the lookupPathsWide being a high during a type-check. So this PR adds a cache to avoid the expensive iteration over the paths.

Care is taken to reset the cache anytime someone changes the paths "field".

Now it's complelty gone from the profiles. I've yet to run some benchmarks on the effect of this.

Profiling a typecheck of Typepal:

rascal>tm = rascalTModelForNames(["analysis::typepal::TypePal"], ccfg, dummy_compile1);
FRAMES PROFILE: 4248 data points, 203878 ticks, tick = 1 milliSecs
                               Scope   Ticks        %  Source
                     lookupPathsWide   57426    28.2%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(16415,1119,<397,4>,<422,5>)
                            bindWide   25698    12.6%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(15742,229,<381,4>,<386,5>)
                           newSolver   17934     8.8%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Solver.rsc|(45153,15601,<1223,4>,<1629,5>)
                     lookupScopeWide   10802     5.3%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(16024,271,<389,4>,<393,5>)
                  getTModelForModule   10619     5.2%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/CheckerCommon.rsc|(14385,2297,<356,0>,<400,1>)
                        doSaveModule    5194     2.5%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(18346,5092,<422,0>,<525,1>)
                             collect    5158     2.5%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(52010,3844,<1292,0>,<1369,4>)
   isContainedInFilteredModuleScopes    4955     2.4%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(19019,130,<434,4>,<436,5>)
                         convertLocs    4641     2.3%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(8633,2709,<199,0>,<252,1>)
          collector_isAlreadyDefined    2476     1.2%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(16378,969,<384,4>,<404,5>)
                      lookupNestWide    2396     1.2%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(18710,686,<453,4>,<468,5>)
                          addGrammar    2324     1.1%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/ADTandGrammar.rsc|(7973,6967,<168,0>,<324,1>)
                        reportCycles    2113     1.0%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(2361,1652,<65,0>,<96,1>)

and now is:

rascal>tm = rascalTModelForNames(["analysis::typepal::TypePal"], ccfg, dummy_compile1);
FRAMES PROFILE: 4411 data points, 160670 ticks, tick = 1 milliSecs
                               Scope   Ticks        %  Source
                            bindWide   27244    17.0%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(15742,229,<381,4>,<386,5>)
                          solver_run   22227    13.8%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Solver.rsc|(45153,15601,<1223,4>,<1629,5>)
                     lookupScopeWide   11451     7.1%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(16024,271,<389,4>,<393,5>)
                  getTModelForModule    6815     4.2%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/CheckerCommon.rsc|(14385,2297,<356,0>,<400,1>)
                        doSaveModule    5863     3.6%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(18346,5092,<422,0>,<525,1>)
   isContainedInFilteredModuleScopes    5420     3.4%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(19019,130,<434,4>,<436,5>)
                     lookupPathsWide    4598     2.9%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(16415,1119,<397,4>,<422,5>)
                             collect    4150     2.6%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(52010,3844,<1292,0>,<1369,4>)
                         convertLocs    3866     2.4%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(8633,2709,<199,0>,<252,1>)
                     updatePathCache    3742     2.3%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(21961,224,<528,4>,<534,5>)
                          addGrammar    3715     2.3%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/ADTandGrammar.rsc|(7973,6967,<168,0>,<324,1>)
                        reportCycles    2570     1.6%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/Import.rsc|(2361,1652,<65,0>,<96,1>)
                             collect    2346     1.5%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Collector.rsc|(16378,969,<384,4>,<404,5>)
                      lookupNestWide    2042     1.3%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(18710,686,<453,4>,<468,5>)
                               error    1993     1.2%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/FailMessage.rsc|(1792,163,<29,0>,<30,58>)
                             addADTs    1698     1.1%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/ADTandGrammar.rsc|(2477,757,<67,0>,<82,1>)
            rascalIsAcceptableSimple    1664     1.0%  |file:///C:/Users/Davy/swat.engineering/rascal/rascal/src/org/rascalmpl/compiler/lang/rascalcore/check/RascalConfig.rsc|(5223,1757,<133,0>,<165,1>)
                          lookupWide    1632     1.0%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/ConfigurableScopeGraph.rsc|(19402,2553,<470,4>,<526,5>)
                         fireTrigger    1617     1.0%  |file:///c:/Users/Davy/swat.engineering/rascal/typepal/src/analysis/typepal/Solver.rsc|(8241,898,<255,4>,<279,5>)

from 204s to 161s.

@DavyLandman
Copy link
Member Author

Benchmark, rascal compiling the stdlib (disabled parallel execution)

[INFO] 
[INFO] --- rascal:0.30.0-RC29:tutor (default-resources) @ rascal ---
[INFO] Skipping org.rascalmpl.maven.TutorRascalMojo completely
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  08:18 min
[INFO] Finished at: 2025-10-06T17:29:45+02:00
[INFO] ------------------------------------------------------------------------
mvn compile -Drascal.tutor.skip  0.18s user 0.12s system 0% cpu 8:20.14 total

after/with this PR:

[INFO] 
[INFO] --- rascal:0.30.0-RC29:tutor (default-resources) @ rascal ---
[INFO] Skipping org.rascalmpl.maven.TutorRascalMojo completely
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  06:35 min
[INFO] Finished at: 2025-10-06T17:14:30+02:00
[INFO] ------------------------------------------------------------------------
mvn compile -Drascal.tutor.skip  0.15s user 0.10s system 0% cpu 6:36.58 total

@DavyLandman DavyLandman marked this pull request as ready for review October 10, 2025 14:04
@PaulKlint PaulKlint merged commit 44ac90d into main Oct 10, 2025
1 check passed
@PaulKlint PaulKlint deleted the fix/improve-solver-performance branch October 10, 2025 14:05
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

Successfully merging this pull request may close these issues.

2 participants