This change adds somewhat naive common subexpression elimination in a few places in the generated C++ code. This has little or no effect when C++ compiler optimizations are enabled, however, some users expect to be able to run some code (e.g., tests) with C++ optimizations disabled.
With this change, certain constructs are many orders of magnitude faster in unoptimized builds. The included test (complex_offset_test.cc) goes from >300s (timing out under Bazel) to <1s runtime.
Note that this does not perform any inlining, and the CSE is fairly naive (text-based), so unoptimized builds may still do a lot of repeated work. It also does not add CSE everywhere it could be added; only to places that are likely to have performance issues. Users who care even slightly about performance are still advised to compile with optimizations.
This change adds somewhat naive common subexpression elimination in a few places in the generated C++ code. This has little or no effect when C++ compiler optimizations are enabled, however, some users expect to be able to run some code (e.g., tests) with C++ optimizations disabled.
With this change, certain constructs are many orders of magnitude faster in unoptimized builds. The included test (complex_offset_test.cc) goes from >300s (timing out under Bazel) to <1s runtime.
Note that this does not perform any inlining, and the CSE is fairly naive (text-based), so unoptimized builds may still do a lot of repeated work. It also does not add CSE everywhere it could be added; only to places that are likely to have performance issues. Users who care even slightly about performance are still advised to compile with optimizations.