シルメラ プロジェクト | thilmera project ...       Site Viewer / Auto Update / Version
Windows汎用 多機能システムモニター - あなたの七つ道具
- Download (Japanese) -
Vector 窓の杜
フリーソフト100
- Download (English) -
Softpedia DIGITAL DIGEST
FileCroco MajorGeeks.Com
- Donation -
寄付 - paypal.me
thilmera7s ライセンス
*先日追加されたモニターオフキープ機能は、「モニターオフキープ」を実行しない限りPCに影響を与えることは一切関係ありません。

エンゲージメント
開発録
レビュー
PC周辺機器レビュー / HDD難民
軽さこそ命
ビット逆転の早いコードを目指す
並列処理は軽くなるわけではない
書き方を変えても速くならないコード例
std::vectorのpush_backはとても重い
悩みの種
Visual Studioでファンクションキーが動かなくなった
COMODOジャパンのデジタル署名の実状
strcmpに両方空文字列をいれると0以外を返す
Windows Defender誤検出の原因コード例
雷と停電
  アマゾン情報 - こちらのリンクを通して何らかをご購入頂くことで当サイトの運営、開発を応援頂けます
std::vectorのpush_backはとても重い (2018/03/21)



 std::vectorは可変の配列を自動で取得してくれる便利な仕組みではあるが、その末尾への追加にあたるpush_backはとても重い。

 どのくらい重いかというと、決め打ちの配列に格納する場合はCPU負荷が高くても全体で0.1%いくかな程度の処理に対し、配列をvectorで。追加をpush_backで行うと、reserveであらかじめ必要数を確保していても、CPU負荷は余裕で100%を越えて計測不可能となった。

 マルチスレッドで読み込みしてる間に別スレッドでpush_backしたらクラッシュする事から考えると、もしかしてvectorは余剰の要素数を確保していても一個要素を挿入するために毎回全面的になにかをやり直してるという事なのか…
 少なくともイテレーターやat参照先は全部総入れ替えになるんだろう。多分。だって参照エラーでクラッシュするもんね。
 排他処理で重いのかとも疑ったが、そちらはとくに原因ではなかった。

 さすがに負荷100%はどうしようもないので、速度と負荷を少しでも気にする場所にstd::vectorのpush_backやらinsertを入れるのは考えなおすことにした。
 親戚のstd::stringも便利だが、これからは処理が重かったら真っ先に疑いそうだ。

 それくらいのショック度。びっくりだよ。なんか使い方間違ったのかなぁ…


 resize() からの operator [] へ挿入という方法をとって、一切push_backを使わなくても負荷100%に振り切れるのはなくならなかった。
 多分配列の構造体の中にstd::stringを入れているのとかが原因なのかとおもったが、無くしても解決しなかった。


 結局のところどういうことなのかというと、vectorクラスの中に可変の(サイズが変わらなくてもメモリを取得するもの)要素があると、変更のたびに、親のvectorの全てのデータの再メモリ取得、コピーが行われる(?)みたいなので、変更を殆どしないものでないかぎりvectorではなく自前でメモリ確保したほうが100倍まし。ということになる。

 どうしてもvectorでなきゃいやという場合は、あらかじめreserve関数で必要数を確保する以外に軽減方法が見当たらず、軽さと早さがほしいなら自前で作れというのはC言語の掟かなにかなのだろうか。

 想像するにC#とかはこのあたりのラッパーかもしれないから、C#で速さを求める可変要素を作るのは無理ということだろうか。だとしたら暗い未来だなぁ。



Copyright © 弦生ささと(Gakuto Matsumura) All Rights Reserved.