Top/article/Include-cost-of-header-files
English | Japanese
English | Japanese

Menu

  • Top
  • Akihiko Yamaguchi 山口 明彦
  • Project プロジェクト
  • Text テキスト
  • Recent articles 最近の記事
  • Articles 記事一覧 (a to z)
  • Search 検索

Tags タグ †

  • [c++][bash][python][latex][php]
  • [linux][windows][mac][android]
  • [math][algorithm][idea][trick]
  • [liboctave][opencv][git][ros]
  • [setting][bug][general]
↑

Recent articles 最近の記事 †

2019-07-02
  • article/Display-Unix-Time
  • article/Synchronize-Linux-Time-to-Remote
2018-09-27
  • article/python-multimode-singleton
2018-09-02
  • article/rosinstall-git-default-remote
2017-07-28
  • article/SubMenu
2017-03-05
  • article/Import-a-different-version-of-OpenCV-in-Python
2015-08-17
  • article/DRC-finals-2015
2015-01-05
  • article/Upgrade-Android-to-Lollipop
2015-01-01
  • article/Kernel-panic-of-Linux-when-using-Xtion
  • article/Do-not-skip-freeing-data-when-using-tri-mesh-in-ODE
Access: 1/2247 - Admin
These search terms have been highlighted:[c++]

Include cost of header files

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

[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 コストをグラフにまとめてみた(クリックで拡大):

20091014081336.png

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

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

↑

標準ライブラリ †

ファイル名文字数文字数(o=50000)
bitset285020oooooo
deque126897ooo
list92074oo
map137146ooo
queue208067ooooo
set134207ooo
stack129828ooo
vector128847ooo
algorithm222221ooooo
functional15853o
iterator448958ooooooooo
locale462012oooooooooo
memory83566oo
stdexcept264065oooooo
utility4974o
string262550oooooo
fstream486032oooooooooo
ios394626oooooooo
iostream445545ooooooooo
iosfwd23785o
iomanip297508oooooo
istream445038ooooooooo
ostream411128ooooooooo
sstream459943oooooooooo
streambuf304660ooooooo
complex534653ooooooooooo
numeric9376o
valarray467435oooooooooo
exception2493o
limits32344o
new4316o
typeinfo4081o
cassert1438o
cctype7974o
cerrno1633o
cfloat326o
climits2127o
cmath52112oo
csetjmp3053o
csignal17815o
cstdlib28903o
cstddef1893o
cstdarg1928o
ctime9530o
cstdio20264o
cstring12053o
cwchar16784o
cwctype11152o
↑

liboctave(一部) †

ファイル名文字数文字数(o=50000)
octave/dColVector.h587696oooooooooooo
octave/dRowVector.h587435oooooooooooo
octave/dMatrix.h649722ooooooooooooo
octave/EIG.h678633oooooooooooooo
octave/dbleCHOL.h650670oooooooooooooo
octave/dbleSVD.h666693oooooooooooooo
octave/dbleDET.h447238ooooooooo
octave/CColVector.h589225oooooooooooo
octave/CRowVector.h588738oooooooooooo
octave/CMatrix.h653086oooooooooooooo
octave/CmplxCHOL.h654171oooooooooooooo
octave/CmplxSVD.h686663oooooooooooooo
octave/CmplxDET.h537166ooooooooooo
octave/mx-m-dm.h665861oooooooooooooo
↑

BOOST C++ library †

ファイル名文字数文字数(o=50000)
boost/aligned_storage.hpp216983ooooo
boost/any.hpp262270oooooo
boost/array.hpp616277ooooooooooooo
boost/assert.hpp1400o
boost/assign.hpp990449oooooooooooooooooooo
boost/bind.hpp247054ooooo
boost/blank.hpp219303ooooo
boost/blank_fwd.hpp229o
boost/call_traits.hpp147749ooo
boost/cast.hpp249450ooooo
boost/checked_delete.hpp971o
boost/compressed_pair.hpp375081oooooooo
boost/concept_archetype.hpp517437ooooooooooo
boost/concept_check.hpp547822ooooooooooo
boost/config.hpp52662oo
boost/crc.hpp130040ooo
boost/cregex.hpp368355oooooooo
boost/cstdint.hpp54811oo
boost/cstdlib.hpp29243o
boost/current_function.hpp345o
boost/date_time.hpp2199896oooooooooooooooooooooooooooooooooooooooooooo
boost/dynamic_bitset.hpp821303ooooooooooooooooo
boost/dynamic_bitset_fwd.hpp83874oo
boost/dynamic_property_map.hpp1027874ooooooooooooooooooooo
boost/enable_shared_from_this.hpp314853ooooooo
boost/filesystem.hpp1147402ooooooooooooooooooooooo
boost/foreach.hpp575019oooooooooooo
boost/format.hpp1026428ooooooooooooooooooooo
boost/function.hpp862394oooooooooooooooooo
boost/function_equal.hpp462o
boost/function_output_iterator.hpp450212oooooooooo
boost/functional.hpp176363oooo
boost/generator_iterator.hpp727469ooooooooooooooo
boost/get_pointer.hpp83844oo
boost/implicit_cast.hpp68562oo
boost/indirect_reference.hpp500726ooooooooooo
boost/integer.hpp106158ooo
boost/integer_fwd.hpp87635oo
boost/integer_traits.hpp100479ooo
boost/intrusive_ptr.hpp93322oo
boost/io_fwd.hpp25565o
boost/iterator.hpp473528oooooooooo
boost/iterator_adaptors.hpp729268ooooooooooooooo
boost/last_value.hpp2355o
boost/lexical_cast.hpp604732ooooooooooooo
boost/limits.hpp83803oo
boost/math_fwd.hpp931o
boost/mem_fn.hpp158862oooo
boost/multi_array.hpp1178137oooooooooooooooooooooooo
boost/multi_index_container.hpp1173070oooooooooooooooooooooooo
boost/multi_index_container_fwd.hpp405669ooooooooo
boost/next_prior.hpp449497ooooooooo
boost/non_type.hpp267o
boost/noncopyable.hpp500o
boost/nondet_random.hpp696318oooooooooooooo
boost/none.hpp552o
boost/operators.hpp515289ooooooooooo
boost/optional.hpp445616ooooooooo
boost/parameter.hpp303425ooooooo
boost/pfto.hpp53206oo
boost/pointee.hpp500181ooooooooooo
boost/pointer_cast.hpp642o
boost/pointer_to_other.hpp825o
boost/preprocessor.hpp24821o
boost/program_options.hpp1361128oooooooooooooooooooooooooooo
boost/progress.hpp521496ooooooooooo
boost/property_map.hpp592277oooooooooooo
boost/property_map_iterator.hpp802505ooooooooooooooooo
boost/random.hpp846537ooooooooooooooooo
boost/range.hpp927825ooooooooooooooooooo
boost/rational.hpp627393ooooooooooooo
boost/ref.hpp57200oo
boost/regex.hpp1337472ooooooooooooooooooooooooooo
boost/regex_fwd.hpp75489oo
boost/scoped_array.hpp56348oo
boost/scoped_ptr.hpp87144oo
boost/shared_array.hpp283484oooooo
boost/shared_container_iterator.hpp890873oooooooooooooooooo
boost/shared_ptr.hpp311138ooooooo
boost/signal.hpp1597017oooooooooooooooooooooooooooooooo
boost/signals.hpp1597145oooooooooooooooooooooooooooooooo
boost/smart_cast.hpp195886oooo
boost/smart_ptr.hpp325826ooooooo
boost/spirit.hpp1750040oooooooooooooooooooooooooooooooooooo
boost/state_saver.hpp208366ooooo
boost/static_assert.hpp53156oo
boost/static_warning.hpp53223oo
boost/strong_typedef.hpp515439ooooooooooo
boost/thread.hpp1101740ooooooooooooooooooooooo
boost/throw_exception.hpp52926oo
boost/timer.hpp89299oo
boost/token_functions.hpp501531ooooooooooo
boost/token_iterator.hpp933585ooooooooooooooooooo
boost/tokenizer.hpp935446ooooooooooooooooooo
boost/type.hpp245o
boost/type_traits.hpp273649oooooo
boost/utility.hpp485192oooooooooo
boost/variant.hpp927184ooooooooooooooooooo
boost/vector_property_map.hpp805665ooooooooooooooooo
boost/version.hpp147o
boost/visit_each.hpp53083oo
boost/wave.hpp2926089ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
boost/weak_ptr.hpp313404ooooooo



Last-modified:2014-12-31 (Wed) 03:22:35 (3839d)
Link: article/Forward-declaration-of-STL-containers(3838d)
Site admin: Akihiko Yamaguchi.
Written by: Akihiko Yamaguchi.
System: PukiWiki 1.5.0. PHP 5.2.17. HTML conversion time: 0.238 sec.