2004-07-17から1日間の記事一覧

結論

vectorをPODのバッファとして使うのは(よほどシビアな要求が無ければ)十分に可能だろうと思います.ただし,vectorの正しい使い方を熟知していないと余計なオーバーヘッドを生じさせると思います(こっちの結論はやっているうちにどうでも良くなってきた)…

考察その4:gcc3.2.2におけるresizeのオーバーヘッド

gcc3.2.2ではresizeにuninitialized_fill_nが使われていますが,これはcharの場合最終的にmemsetで実装されます.char以外のPODの場合,for文+代入が使われるのでさらにオーバーヘッドがかかると予想されます.

考察その3:ポインタを使ったstd::copyとイテレータを使ったstd::copyの違い

VC++7.1では,PODのポインタに対するcopyはmemmoveで実装されています.(なので,resize + memcpyとほとんど同じになる.)一方,std::vector::iteratorに対するcopyは(memmoveで実装しても安全であろうと思われるのにも関わらず)for文+代入で実装されて…

考察その2:VC++7.1のresize + memcpyにおけるオーバーヘッド

resize時に要素が初期化されるため,その分遅くなっています.昨日はvalue_typeがcharの場合memsetで実装されると書きましたが,実際にはfor文 + placement newでした.

考察その1:VC++7.1におけるpush_backが異常に遅い理由

理由は恐らく実装がアホだからです.VC++7.1のpush_backは何故かuninitialized_fill_nで実装されています.これがpush_backの効率を大きく落としていると思われます.その傍証としてconstructで実装されているgccのpush_backには異常といえるオーバーヘッド…

gcc3.2.2の結果

vector::reserve + vector::push_back 1.7程度 vector::resize + vector::memcpy 1.7程度 vectorのイテレータ範囲コンストラクタ ベースラインに対するオーバーヘッドはほとんど見えません.(1.1以下?) vector::resize + vector::iteratorによるstd::copy…

VC++7.1の結果

vector::reserve + vector::push_back 6.0〜7.0程度 vector::resize + vector::memcpy 1.5〜1.8程度 vectorのイテレータ範囲コンストラクタ サイズが1MB以下ならベースラインに対するオーバーヘッドはほとんど見えません.サイズが大きくなると漸近的に1.1〜…

vectorがPODのバッファとして使えるかどうか?

vectorがPODのバッファとして使えるかどうか実験してみました.ただし,自分は精度の良い測定ができるフレームワークを持っていないので,大まかな結果だけ載せておきます. (´-`).。oO(地道にstd::clock()使って統計的に値を推定したなんて恥ずかしくて…