| # Arm performance test |
| |
| Performance differences in build systems become more apparent on |
| slower platforms. To examine this difference we compared the |
| performance of Meson with GNU Autotools. We took the GLib software |
| project and rewrote its build setup with Meson. GLib was chosen |
| because it is a relatively large C code base which requires lots of |
| low level configuration. |
| |
| The Meson version of the build system is not fully equivalent to the |
| original Autotools one. It does not do all the same configuration |
| steps and does not build all the same targets. The biggest missing |
| piece being internationalisation support with Gettext. However it does |
| configure the system enough to build all C source and run all unit |
| tests. |
| |
| All measurements were done on a Nexus 4 smart phone running the latest |
| Ubuntu touch image (updated on September 9th 2013). |
| |
| Measurements |
| ------ |
| |
| The first thing we measured was the time it took to run the configure step. |
| |
| ![GLib config time](images/glib_conf.png) |
| |
| Meson takes roughly 20 seconds whereas Autotools takes 220. This is a |
| difference of one order of magnitude. Autotools' time contains both |
| autogen and configure. Again it should be remembered that Meson does |
| not do all the configure steps that Autotools does. It does do about |
| 90% of them and it takes just 10% of the time to do it. |
| |
| Then we measured the build times. Two parallel compilation processes |
| were used for both systems. |
| |
| ![GLib build time](images/glib_build.png) |
| |
| On desktop machines Ninja based build systems are 10-20% faster than |
| Make based ones. On this platform the difference grows to 50%. The |
| difference is probably caused by Make's inefficient disk access |
| patterns. Ninja is better at keeping both cores running all the time |
| which yields impressive performance improvements. |
| |
| ![GLib no-op time](images/glib_empty.png) |
| |
| Next we measured the "empty build" case. That is, how long does it |
| take for the build system to detect that no changes need to be |
| made. This is one of the most important metrics of build systems |
| because it places a hard limit on how fast you can iterate on your |
| code. Autotools takes 14 seconds to determine that no work needs to be |
| done. Meson (or, rather, Ninja) takes just one quarter of a second. |
| |
| ![GLib link time](images/glib_link.png) |
| |
| One step which takes quite a lot of time is linking. A common case is |
| that you are working on a library and there are tens of small test |
| executables that link to it. Even if the compilation step would be |
| fast, relinking all of the test executables takes time. It is common |
| for people to manually compile only one test application with a |
| command such as `make sometest` rather than rebuild everything. |
| |
| Meson has an optimization for this case. Whenever a library is |
| rebuilt, Meson inspects the ABI it exports. If it has not changed, |
| Meson will skip all relinking steps as unnecessary. The difference |
| this makes can be clearly seen in the chart above. In that test the |
| source was fully built, then the file `glib/gbytes.c` was touched to |
| force the rebuild of the base glib shared library. As can be seen, |
| Autotools then relinks all test executables that link with glib. Since |
| Meson can detect that the ABI is the same it can skip those steps. The |
| end result being that Meson is almost one hundred times faster on this |
| very common use case. |
| |
| Conclusions |
| ----- |
| |
| One of the main drawbacks of C and C++ compared to languages such as |
| Java are long compilation times. However at least some of the blame |
| can be found in the build tools used rather than the languages |
| themselves or their compilers. Choosing proper tools can bring C and |
| C++ compilation very close to instantaneous rebuilds. This has a |
| direct impact on programmer productivity. |