994: Add benchmark about C++ compilation time.

https://svn.lrde.epita.fr/svn/oln/trunk/milena Index: ChangeLog from Nicolas Ballas <ballas@lrde.epita.fr> Add benchmark about C++ compilation time. * sandbox: New. * sandbox/cxxcompilation: New. * sandbox/cxxcompilation/compilation_unit.rb: Tools used to create compilation unit file for benchmark. * sandbox/cxxcompilation/test.cc: Test file used in benchmark. * sandbox/cxxcompilation/methods: Describes some existing method which improve compilation time. * sandbox/cxxcompilation/vaucanson_bench: Benchmark on Vaucanson method. compilation_unit.rb | 56 ++++++++++++++++++++ methods | 104 ++++++++++++++++++++++++++++++++++++++ test.cc | 42 +++++++++++++++ vaucanson_bench | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 343 insertions(+) Index: sandbox/cxxcompilation/compilation_unit.rb --- sandbox/cxxcompilation/compilation_unit.rb (revision 0) +++ sandbox/cxxcompilation/compilation_unit.rb (revision 0) @@ -0,0 +1,56 @@ +#! /usr/bin/ruby + +#Create a compilation unit file from a .cc file + +#USAGE: ./compilation_unit.rb file.cc + + +class CompilationUnit + attr_reader :sourceFileName, :name, :namespaceName + + public + def initialize(sourceFileName) + + + @sourceFileName = sourceFileName + @name = sourceFileName.gsub(/.cc\z/, ".unit.cc") + @namespaceName = "__instanciator_code" + + if not File.exist?(@name) then + self.createCompilationUnitFile + end + end + + def update + createCompilationUnitFile + end + + #Create UnitCompilationfile from source + def createCompilationUnitFile + sourceFile = File.new("#{@sourceFileName}", "r") + destinationFile = File.new("#{@name}", "w") + + # Copy usefull include files into cache file. + sourceFile.each_line do |line| + destinationFile.puts(line) if line =~ /#include/ + end + + # trash namespace + destinationFile.puts("namespace #{@namespaceName} {") + + # puts code line into trash namespace + sourceFile.close + sourceFile = File.new("#{@sourceFileName}", "r") + sourceFile.each_line do |line| + destinationFile.puts(line) if not (line =~ /#include/) + end + + # end of namespace + destinationFile.puts("}") + + sourceFile.close + destinationFile.close + end +end + +unit = CompilationUnit.new(ARGV[0]) Index: sandbox/cxxcompilation/test.cc --- sandbox/cxxcompilation/test.cc (revision 0) +++ sandbox/cxxcompilation/test.cc (revision 0) @@ -0,0 +1,42 @@ +#include <oln/core/2d/image2d.hh> +#include <oln/core/3d/image3d.hh> +#include <oln/core/1d/image1d.hh> +#include <oln/level/fill.hh> + + +using namespace oln; + +int main(void) +{ + image1d<char> ima1d1(5); + image1d<int> ima1d2(5); + image1d<float> ima1d3(5); + image1d<double> ima1d4(5); + + level::fill(inplace(ima1d1), 5); + level::fill(inplace(ima1d2), 5); + level::fill(inplace(ima1d3), 5); + level::fill(inplace(ima1d4), 5); + + image2d<char> ima2d1(5, 5); + image2d<int> ima2d2(5, 5); + image2d<float> ima2d3(5, 5); + image2d<double> ima2d4(5, 5); + + level::fill(inplace(ima2d1), 5); + level::fill(inplace(ima2d2), 5); + level::fill(inplace(ima2d3), 5); + level::fill(inplace(ima2d4), 5); + + image3d<char> ima3d1(5, 5, 5); + image3d<int> ima3d2(5, 5, 5); + image3d<float> ima3d3(5, 5, 5); + image3d<double> ima3d4(5, 5, 5); + + level::fill(inplace(ima3d1), 5); + level::fill(inplace(ima3d2), 5); + level::fill(inplace(ima3d3), 5); + level::fill(inplace(ima3d4), 5); + + return 0; +} Index: sandbox/cxxcompilation/methods --- sandbox/cxxcompilation/methods (revision 0) +++ sandbox/cxxcompilation/methods (revision 0) @@ -0,0 +1,104 @@ + -*- Outline -*- + +* without optimization flags + +** Benchmark + +compilation: 2.131 +execution: 18.538 +total: 22.670 + + +* O1 + +** Benchmark +compilation: 3.616 +execution: 4.893 +total: 8.509 + +* O2 +** Benchmark +compilation: 4.610 +execution: 3.781 +total: 8.391 + +* 03 +compilation: 5.071 +execution: 1.567 +total: 6.638 + + + + +The next part introduces different method to speed up C++ compilation time. + +Test are made with union_find.cc file. + +* precompiled header (without optimization option) + +** Description + +Generate precompiled header (.gch) which can parsed in a faster way by g++. + + +How to automize header precompilation, just make a precompilation of usefull header ? + +** Benchmark + +compilation: 3.733 +execution: 18.119 +total: 21.852 + +* ccache (without optimization option) + +** Description + +"ccache is a compiler cache. It acts as a caching pre-processor to C/C++ compilers, using the -E compiler switch and a hash to detect when a compilation can be satisfied from cache. This often results in a 5 to 10 times speedup in common compilations." http://cache.samba.org + +** Benchmark + +* Vacauson Way (without optimization option) + +** Description + +cf: http://www.lrde.epita.fr/cgi-bin/twiki/view/Know/SpeedUpCxxCompilation + + +*** total recompilation protocol of source.cc: +--> (1) compile source.cc to "ref".o (cache used for function addresse reference) +--> (2) source.cc -> source.o with -DINTERFACE_ONLY (real program) +--> (3) links source.o to "ref".o + +*** Protocole: +--> do (1) +--> do (2) and (3) as long as there is no linkage error, else redo (1) + + +*** Problems: + +You must recompile the cache when you use an new algorithm/data type in your program. +--> solution: ask developper to write usefull algorithm/data types/includes at the start of the programm and uses template instantiation + + +Automatization?? +--> how deals with several files +--> how deals with missing .hh files +--> differenciate link error from other error + +***Others things: + +wrapper script or Makefile??? +--> script used by Makefile + +** Benchmark + +*** first compilation or total recompilation is longer than a normal compilation + +you need to compile program two times + + +*** next time when cache recompilation is not needed + +compilation: 0.200 +execution: 17.875 +toto: 18.075 Index: sandbox/cxxcompilation/vaucanson_bench --- sandbox/cxxcompilation/vaucanson_bench (revision 0) +++ sandbox/cxxcompilation/vaucanson_bench (revision 0) @@ -0,0 +1,141 @@ + -*- Outline -*- + +* Summary: + + This files present c++ compilation benchmark with Vaucanson method. + +* Vaucanson method: + +** Files used: +*** source.cc +client code + +*** source.unit.cc +This files contains instantiations of templated data and algorithms used by the client code. + +A Compilation unit copies #include directives used by source.cc +Furthermore, it copies client source code into a trash name's (in order to instantiated templates). + +But other method exists to create compilation unit(cf .hcc). + + +** Compilation process: + +*** total recompilation + +--> (1) compile source.unit.cc to an object file (source.unit.o) (cache used to find function address reference). + +--> (2) compile source.cc to source.o with -DINTERFACE_ONLY (or INCLUDE_ONLY, we want to compile just the interface the objects). + +--> (3) link source.o with source.unit.o + +*** Protocol: +--> do (1) +--> do (2) and (3) as long as there are no linkage errors, else redo (1) + + + + +* Benchmark: + +** With Olena: + +compile command: +g++ -W -Wall -Werror -ansi -pedantic -Ipath/metalic -Ipath/olena -Ipath/extended + +dimension of image used for test: 512 * 512. +Note: We can add optimization flag to speed up execution time. + + +******************************************************************************* +** File: oln/morpho/Rd/union_find.cc + +*** normal compilation: +compilation time: 4.110 +execution time: 42.893 +total time: 47.003 + +*** With Vaucanson method: + +**** total recompilation: + +compilation time: 6.749 +--> (1) : 4.062 +--> (2) : 2.524 +--> (3) : 0.163 + +execution time: 42.058 +total time: 48.807 + +~= 2 second slower than a normal compilation + +**** Usual recompilation + +compilation time: 2.702 +--> (2) : 2.542 +--> (3) : 0.160 + +execution time:42.060 +total time: 44.762 + +******************************************************************************* +** oln/morpho/Rd/queue_based.cc + +*** normal compilation: +compilation time: 4.296 +execution time: 35.836 +total time: 40.132 + +*** With Vaucanson method: + +**** total recompilation: + +compilation time: 7.187 +--> (1) : 4.378 +--> (2) : 2.636 +--> (3) : 0.173 + +execution time: 35.836 +total time: 43.023 + +**** Usual recompilation + +compilation time: 2.809 +--> (2) : 2.636 +--> (3) : 0.173 + +******************************************************************************* +** test.cc + +(declare and fill 12 differents image types) + +*** normal compilation: +compilation time: 25.585 +execution time: 0.006 +total time: 25.596 + +*** With Vaucanson method: + +**** total recompilation: + +compilation time: 45.087 +--> (1) : 25.378 +--> (2) : 19.318 +--> (3) : 0.391 + +execution time: 0.006 +total time: 45.093 + +**** Usual recompilation + +compilation time: 19.664 +--> (2) : 19.259 +--> (3) : 0.405 + +** with morpher + +FIXME + +*** With Milena + +FIXME
participants (1)
-
Nicolas Ballas