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 |
