commit | 19ff727ad5c5c9f3bfebe485f52bbc91db1bd3f4 | [log] [tgz] |
---|---|---|
author | Colin Cross <ccross@android.com> | Wed Jun 19 23:25:39 2019 -0700 |
committer | Colin Cross <ccross@android.com> | Thu Jun 20 11:05:58 2019 -0700 |
tree | 1a28bdddd23bb0a9537cd65eb35095191cf7561a | |
parent | 4f6631f74fc7e2feb7be0d7044c03656cbc7241c [diff] |
Optimize ninjaString.ValueWithEscaper ninjaString.ValueWithEscaper is a relatively hot function, rewrite it with strings.Builder to avoid repeated string concatenation, which requires an allocation each time. Before: BenchmarkNinjaString_Value/constant/1-72 100000000 11.9 ns/op BenchmarkNinjaString_Value/constant/10-72 100000000 18.9 ns/op BenchmarkNinjaString_Value/constant/100-72 50000000 22.1 ns/op BenchmarkNinjaString_Value/constant/1000-72 30000000 39.3 ns/op BenchmarkNinjaString_Value/variable/1-72 20000000 95.1 ns/op BenchmarkNinjaString_Value/variable/10-72 10000000 223 ns/op BenchmarkNinjaString_Value/variable/100-72 3000000 437 ns/op BenchmarkNinjaString_Value/variable/1000-72 2000000 948 ns/op BenchmarkNinjaString_Value/variables/1-72 10000000 161 ns/op BenchmarkNinjaString_Value/variables/2-72 5000000 368 ns/op BenchmarkNinjaString_Value/variables/3-72 3000000 560 ns/op BenchmarkNinjaString_Value/variables/4-72 2000000 795 ns/op BenchmarkNinjaString_Value/variables/5-72 1000000 1004 ns/op BenchmarkNinjaString_Value/variables/10-72 1000000 2275 ns/op BenchmarkNinjaString_Value/variables/100-72 50000 39667 ns/op BenchmarkNinjaString_Value/variables/1000-72 1000 2146592 ns/op After: BenchmarkNinjaString_Value/constant/1-72 200000000 11.3 ns/op BenchmarkNinjaString_Value/constant/10-72 100000000 17.2 ns/op BenchmarkNinjaString_Value/constant/100-72 50000000 21.7 ns/op BenchmarkNinjaString_Value/constant/1000-72 30000000 38.3 ns/op BenchmarkNinjaString_Value/variable/1-72 20000000 91.8 ns/op BenchmarkNinjaString_Value/variable/10-72 10000000 199 ns/op BenchmarkNinjaString_Value/variable/100-72 5000000 377 ns/op BenchmarkNinjaString_Value/variable/1000-72 2000000 855 ns/op BenchmarkNinjaString_Value/variables/1-72 10000000 141 ns/op BenchmarkNinjaString_Value/variables/2-72 5000000 312 ns/op BenchmarkNinjaString_Value/variables/3-72 5000000 362 ns/op BenchmarkNinjaString_Value/variables/4-72 3000000 417 ns/op BenchmarkNinjaString_Value/variables/5-72 2000000 621 ns/op BenchmarkNinjaString_Value/variables/10-72 2000000 837 ns/op BenchmarkNinjaString_Value/variables/100-72 200000 9141 ns/op BenchmarkNinjaString_Value/variables/1000-72 20000 95094 ns/op Test: ninja_strings_test.go Change-Id: I6c61e747d8e67f7f1e6cff0cc0c705745301a35f
Blueprint is a meta-build system that reads in Blueprints files that describe modules that need to be built, and produces a Ninja manifest describing the commands that need to be run and their dependencies. Where most build systems use built-in rules or a domain-specific language to describe the logic for converting module descriptions to build rules, Blueprint delegates this to per-project build logic written in Go. For large, heterogenous projects this allows the inherent complexity of the build logic to be maintained in a high-level language, while still allowing simple changes to individual modules by modifying easy to understand Blueprints files.