ヘッダファイルの include コストを調べてみた

include するヘッダファイルが多くなればなるほど,コンパイルに掛かる時間が増加する.では,それぞれのヘッダファイルを include するコストはどれくらいなのか?

ということで,調べてみた.

調べ方

ヘッダを include するだけのプログラム
e.g.

#include<list>
int main(){return 0;}

を書いて,-E を付けて g++ でコンパイルし(プリプロセッサの処理のみ行う),出力される文字数を比較した.要するに,include されるファイルをすべて展開した結果の文字数(==コンパイルに掛けられる文字数)での比較だ.もちろん template の処理とか,内容によってコンパイル時間が違ってくるので,「コンパイルに掛けられる文字数」と「コンパイル時間」は必ずしも比例しない.が,ひとつの目安にはなると思う.

実際は,

#!/bin/bash
files="
bitset
deque
list
map
queue
..(略)..
boost/wave.hpp
boost/weak_ptr.hpp
"
function gencode()
{
  if [ "`echo "$1" | sed 's/^octave\/.*//g'`" == "" ];then
    echo "#include<octave/config.h>"
  fi
  echo "#include<$1>"
  echo "int main(){return 0;}"
}
for f in $files;do
  cost=`gencode $f | \g++ -xc++ -E - | wc -m`
  echo "$f $cost"
  # cost_stars=`echo "import math;print '*'*int(math.ceil($cost./50000.))" | python`
  # echo "|$f|$cost|$cost_stars|"
done

というスクリプトを書いて調べた.

結果

主要な(私がよく使う)ヘッダの include コストをグラフにまとめてみた(クリックで拡大):

iostream を読み込むより iosfwd を読んだ方がかなり文字数が少ないとか,全般的に C++ のヘッダファイルは標準Cライブラリから引き継いだヘッダファイルより文字数がだいぶ多いとかが分かる.

詳細な結果は,以下の通り.

標準ライブラリ
ファイル名 文字数 文字数(o=50000)
bitset 285020 oooooo
deque 126897 ooo
list 92074 oo
map 137146 ooo
queue 208067 ooooo
set 134207 ooo
stack 129828 ooo
vector 128847 ooo
algorithm 222221 ooooo
functional 15853 o
iterator 448958 ooooooooo
locale 462012 oooooooooo
memory 83566 oo
stdexcept 264065 oooooo
utility 4974 o
string 262550 oooooo
fstream 486032 oooooooooo
ios 394626 oooooooo
iostream 445545 ooooooooo
iosfwd 23785 o
iomanip 297508 oooooo
istream 445038 ooooooooo
ostream 411128 ooooooooo
sstream 459943 oooooooooo
streambuf 304660 ooooooo
complex 534653 ooooooooooo
numeric 9376 o
valarray 467435 oooooooooo
exception 2493 o
limits 32344 o
new 4316 o
typeinfo 4081 o
cassert 1438 o
cctype 7974 o
cerrno 1633 o
cfloat 326 o
climits 2127 o
cmath 52112 oo
csetjmp 3053 o
csignal 17815 o
cstdlib 28903 o
cstddef 1893 o
cstdarg 1928 o
ctime 9530 o
cstdio 20264 o
cstring 12053 o
cwchar 16784 o
cwctype 11152 o
liboctave(一部)
ファイル名 文字数 文字数(o=50000)
octave/dColVector.h 587696 oooooooooooo
octave/dRowVector.h 587435 oooooooooooo
octave/dMatrix.h 649722 ooooooooooooo
octave/EIG.h 678633 oooooooooooooo
octave/dbleCHOL.h 650670 oooooooooooooo
octave/dbleSVD.h 666693 oooooooooooooo
octave/dbleDET.h 447238 ooooooooo
octave/CColVector.h 589225 oooooooooooo
octave/CRowVector.h 588738 oooooooooooo
octave/CMatrix.h 653086 oooooooooooooo
octave/CmplxCHOL.h 654171 oooooooooooooo
octave/CmplxSVD.h 686663 oooooooooooooo
octave/CmplxDET.h 537166 ooooooooooo
octave/mx-m-dm.h 665861 oooooooooooooo
BOOST C++ library
ファイル名 文字数 文字数(o=50000)
boost/aligned_storage.hpp 216983 ooooo
boost/any.hpp 262270 oooooo
boost/array.hpp 616277 ooooooooooooo
boost/assert.hpp 1400 o
boost/assign.hpp 990449 oooooooooooooooooooo
boost/bind.hpp 247054 ooooo
boost/blank.hpp 219303 ooooo
boost/blank_fwd.hpp 229 o
boost/call_traits.hpp 147749 ooo
boost/cast.hpp 249450 ooooo
boost/checked_delete.hpp 971 o
boost/compressed_pair.hpp 375081 oooooooo
boost/concept_archetype.hpp 517437 ooooooooooo
boost/concept_check.hpp 547822 ooooooooooo
boost/config.hpp 52662 oo
boost/crc.hpp 130040 ooo
boost/cregex.hpp 368355 oooooooo
boost/cstdint.hpp 54811 oo
boost/cstdlib.hpp 29243 o
boost/current_function.hpp 345 o
boost/date_time.hpp 2199896 oooooooooooooooooooooooooooooooooooooooooooo
boost/dynamic_bitset.hpp 821303 ooooooooooooooooo
boost/dynamic_bitset_fwd.hpp 83874 oo
boost/dynamic_property_map.hpp 1027874 ooooooooooooooooooooo
boost/enable_shared_from_this.hpp 314853 ooooooo
boost/filesystem.hpp 1147402 ooooooooooooooooooooooo
boost/foreach.hpp 575019 oooooooooooo
boost/format.hpp 1026428 ooooooooooooooooooooo
boost/function.hpp 862394 oooooooooooooooooo
boost/function_equal.hpp 462 o
boost/function_output_iterator.hpp 450212 oooooooooo
boost/functional.hpp 176363 oooo
boost/generator_iterator.hpp 727469 ooooooooooooooo
boost/get_pointer.hpp 83844 oo
boost/implicit_cast.hpp 68562 oo
boost/indirect_reference.hpp 500726 ooooooooooo
boost/integer.hpp 106158 ooo
boost/integer_fwd.hpp 87635 oo
boost/integer_traits.hpp 100479 ooo
boost/intrusive_ptr.hpp 93322 oo
boost/io_fwd.hpp 25565 o
boost/iterator.hpp 473528 oooooooooo
boost/iterator_adaptors.hpp 729268 ooooooooooooooo
boost/last_value.hpp 2355 o
boost/lexical_cast.hpp 604732 ooooooooooooo
boost/limits.hpp 83803 oo
boost/math_fwd.hpp 931 o
boost/mem_fn.hpp 158862 oooo
boost/multi_array.hpp 1178137 oooooooooooooooooooooooo
boost/multi_index_container.hpp 1173070 oooooooooooooooooooooooo
boost/multi_index_container_fwd.hpp 405669 ooooooooo
boost/next_prior.hpp 449497 ooooooooo
boost/non_type.hpp 267 o
boost/noncopyable.hpp 500 o
boost/nondet_random.hpp 696318 oooooooooooooo
boost/none.hpp 552 o
boost/operators.hpp 515289 ooooooooooo
boost/optional.hpp 445616 ooooooooo
boost/parameter.hpp 303425 ooooooo
boost/pfto.hpp 53206 oo
boost/pointee.hpp 500181 ooooooooooo
boost/pointer_cast.hpp 642 o
boost/pointer_to_other.hpp 825 o
boost/preprocessor.hpp 24821 o
boost/program_options.hpp 1361128 oooooooooooooooooooooooooooo
boost/progress.hpp 521496 ooooooooooo
boost/property_map.hpp 592277 oooooooooooo
boost/property_map_iterator.hpp 802505 ooooooooooooooooo
boost/random.hpp 846537 ooooooooooooooooo
boost/range.hpp 927825 ooooooooooooooooooo
boost/rational.hpp 627393 ooooooooooooo
boost/ref.hpp 57200 oo
boost/regex.hpp 1337472 ooooooooooooooooooooooooooo
boost/regex_fwd.hpp 75489 oo
boost/scoped_array.hpp 56348 oo
boost/scoped_ptr.hpp 87144 oo
boost/shared_array.hpp 283484 oooooo
boost/shared_container_iterator.hpp 890873 oooooooooooooooooo
boost/shared_ptr.hpp 311138 ooooooo
boost/signal.hpp 1597017 oooooooooooooooooooooooooooooooo
boost/signals.hpp 1597145 oooooooooooooooooooooooooooooooo
boost/smart_cast.hpp 195886 oooo
boost/smart_ptr.hpp 325826 ooooooo
boost/spirit.hpp 1750040 oooooooooooooooooooooooooooooooooooo
boost/state_saver.hpp 208366 ooooo
boost/static_assert.hpp 53156 oo
boost/static_warning.hpp 53223 oo
boost/strong_typedef.hpp 515439 ooooooooooo
boost/thread.hpp 1101740 ooooooooooooooooooooooo
boost/throw_exception.hpp 52926 oo
boost/timer.hpp 89299 oo
boost/token_functions.hpp 501531 ooooooooooo
boost/token_iterator.hpp 933585 ooooooooooooooooooo
boost/tokenizer.hpp 935446 ooooooooooooooooooo
boost/type.hpp 245 o
boost/type_traits.hpp 273649 oooooo
boost/utility.hpp 485192 oooooooooo
boost/variant.hpp 927184 ooooooooooooooooooo
boost/vector_property_map.hpp 805665 ooooooooooooooooo
boost/version.hpp 147 o
boost/visit_each.hpp 53083 oo
boost/wave.hpp 2926089 ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
boost/weak_ptr.hpp 313404 ooooooo