ところでこいつを見てくれ。

アバター
SUE
記事: 41
登録日時: 13年前

ところでこいつを見てくれ。

投稿記事 by SUE » 13年前

こいつをどう思う?
► スポイラーを表示
vectorとlistの速度を調べるだけのプログラム・・・なのだが、結果は明白、O(N)のvectorに対してO(1)のlistがずっと速くなるはずだ。が、

いざ実行するとvectorのが速かった。どっかミスってたら指摘して欲しいんですが、合ってたらもう こ れ は ひ ど い としか。

世の中って不条理ですね!

アバター
Cr
記事: 93
登録日時: 14年前

RE: ところでこいつを見てくれ。

投稿記事 by Cr » 13年前

vector.push_back();
って定数時間じゃなかったですっけ?
イテレーターによる表示の繰り返しは両方一緒だし
しいて言えばvectorはある程度変数を格納する場所が決まってるけど
listは毎回変数宣言から始まるから遅いのでは?と思ったり

アバター
SUE
記事: 41
登録日時: 13年前

Re: ところでこいつを見てくれ。

投稿記事 by SUE » 13年前

あ、すいません。全然具体的な結果を書いてなかったですね。

実のところ、両者push_backにはほとんど時間がかかっておらず、eraseで倍くらいの差がつきました。なにげにこれも不思議だったりするんですけどね。
だってlistは追加のたびに毎回newしている(らしい)んですよ。だったらもうちょい追加は重くてもいいはずなんですが、なんとも。

アバター
nullptr
記事: 239
登録日時: 13年前

Re: ところでこいつを見てくれ。

投稿記事 by nullptr » 13年前

eraseって消す順番が云々

xxx
記事: 26
登録日時: 14年前

Re: ところでこいつを見てくれ。

投稿記事 by xxx » 13年前

ベンチマークの仕方がおかしいような
先頭削除するだけなら明らかにstd::dequeつかったほうがいいと思います

>しいて言えばvectorはある程度変数を格納する場所が決まってるけど
>listは毎回変数宣言から始まるから遅いのでは?と思ったり
std::vectorは連続した領域である必要があるのでいちいち再確保してます
newが遅い遅い言われてますが気にする必要があるほどではないと思います


あれ、と思ったので書いてみましたがstd::listの方が速いような...
http://ideone.com/PtP02

アバター
GRAM
記事: 164
登録日時: 14年前

RE: ところでこいつを見てくれ。

投稿記事 by GRAM » 13年前

SUE さんが書きました:vectorとlistの速度を調べるだけのプログラム・・・なのだが、結果は明白、O(N)のvectorに対してO(1)のlistがずっと速くなるはずだ。
どうしてそんなことが言えるのでしょうか?
そもそもオーダーというのは、要素数Nに対しての作業時間の増加率にすぎません。
O(N)というのは作業時間が高々要素の数に比例するといっているだけで、別にO(1)より小さいといってるわけではありません。

y=xと y = 2000のグラフを比べたらわかるように、x<2000まではむしろy=xのほうが小さいわけです。
1024*100という数が微妙なのであって、もっと圧倒的な大きさの要素について行えば、listのほうが速くなることでしょう。

むしろこの実験で得られたことはSUEさんの環境では、その程度の要素数までならvectorを使うべきだという結論でしょう。
というより、せいぜい数百までの要素数なら大概何をするにもvectorが1番速いと思います。(どこに追加しようが、何を削除しようが。)
もちろんディープコピーするのに、とっても時間のかかるクラスなどを格納するならわかりませんが・・・。

ただ測り方に問題があるのかもしれませんので、その辺はコードがないとわかりません。
最後に編集したユーザー GRAM on 2012年2月26日(日) 12:58 [ 編集 1 回目 ]

アバター
SUE
記事: 41
登録日時: 13年前

RE: ところでこいつを見てくれ。

投稿記事 by SUE » 13年前

>>loweさん
いやまさか・・・そんなはずは・・・(ランダム削除プログラム書きたくない

>>roxion1377さん
すいません、先頭削除に特に意味はなくて、eraseを使ったときにどれくらい差がでるのかを確かめたかったので。

>>GRAMさん
後日改めて色んなNで計測したところ、GRAMさんの言う通り、N=10とか100ではvectorの方が速いのですが、N=10^7くらいだとlistの方が速くなりました。
なんかお騒がせした感じで申し訳ないです。
GRAM さんが書きました: 1024*100という数が微妙なのであって、もっと圧倒的な大きさの要素について行えば、listのほうが速くなることでしょう。
そうか、微妙なのか・・・なんかスケールが違うな・・・出直してきます。