These search terms have been highlighted:[c++]
2009-10-14
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 |