「C++の色々配慮してめんどくさい感じは好きだけど、実務になったらメモリ安全性とか考えて今後Rustに変わっていくんかな」
「うだうだ言ってないで仕事で必要なのをやればいいんだよ、趣味なら好きなのやればいい」
っていうスレ。
前スレ: 結局C++とRustってどっちが良いの?
https://mevius.5ch.net/test/read.cgi/tech/1677286186/
探検
結局C++とRustってどっちが良いの? 2traits
■ このスレッドは過去ログ倉庫に格納されています
2023/04/02(日) 00:42:57.53ID:W9/nq+tL
593デフォルトの名無しさん
2023/04/26(水) 08:21:46.43ID:e279LTxP なんでも測ってみないとダメってばーちゃんが言ってた
勉強になるからいいけどw
勉強になるからいいけどw
594デフォルトの名無しさん
2023/04/26(水) 09:51:14.24ID:zYbSfnJu コンパイラ通せば終わり(キリッ)っていうバカを助長させてるだけだな。
595デフォルトの名無しさん
2023/04/26(水) 11:35:48.60ID:N7+hGpB4 自己紹介乙
596デフォルトの名無しさん
2023/04/26(水) 12:00:07.23ID:1VlSMqUT597デフォルトの名無しさん
2023/04/26(水) 12:25:39.79ID:SBWyUq0g >>594
バッドノウハウが溜まればどのみちコーティング規約とlintが必要になる。
バッドノウハウが溜まればどのみちコーティング規約とlintが必要になる。
598デフォルトの名無しさん
2023/04/26(水) 12:41:46.92ID:mk8XnWac599デフォルトの名無しさん
2023/04/26(水) 13:29:30.45ID:8XaB5QqW LinkedListはリストの先頭とか要素自身のインデクスを知らなくても前後に要素を差し込んだり自身を削除したりできるから
サイズが不定だったり大きかったりする要素を数珠つなぎにする場合に使える
Linuxカーネルのページ管理でそういうことしてたと思う(今現在は知らないけど)
小さい要素を大量に保持するなら挿入、削除があってもキャッシュしやすいvectorが強そう
サイズが不定だったり大きかったりする要素を数珠つなぎにする場合に使える
Linuxカーネルのページ管理でそういうことしてたと思う(今現在は知らないけど)
小さい要素を大量に保持するなら挿入、削除があってもキャッシュしやすいvectorが強そう
600デフォルトの名無しさん
2023/04/26(水) 16:36:01.06ID:W7riOQ8m >>591
嘘か書かないで。
嘘か書かないで。
601デフォルトの名無しさん
2023/04/26(水) 16:37:03.22ID:W7riOQ8m 591の人はイマジネーションが不足している。
602デフォルトの名無しさん
2023/04/26(水) 16:37:48.41ID:W7riOQ8m 591の人を始め、ここの人には、図を書いて考えてみることをお勧めします。
603デフォルトの名無しさん
2023/04/26(水) 16:47:25.16ID:e279LTxP 小学校の算数かよ
ごめん俺、小学校の算数躓いた勢だったわww
ちょっと算数系の学習障害 はいってるんかもしれん
ごめん俺、小学校の算数躓いた勢だったわww
ちょっと算数系の学習障害 はいってるんかもしれん
604デフォルトの名無しさん
2023/04/26(水) 16:48:15.43ID:9EDgaMeS 月面着陸船が落っこちたそうだが
Rustで書いてれば成功したはず
それにしてもローバーは活躍出来ず流産乙
Rustで書いてれば成功したはず
それにしてもローバーは活躍出来ず流産乙
605デフォルトの名無しさん
2023/04/26(水) 17:01:55.60ID:2Da7m8zO >Rustで書いてれば成功したはず
↑この発想がそのまま↓なんだと言う自覚ゼロ
>コンパイラ通せば終わり(キリッ)っていうバカ
↑この発想がそのまま↓なんだと言う自覚ゼロ
>コンパイラ通せば終わり(キリッ)っていうバカ
606デフォルトの名無しさん
2023/04/26(水) 17:17:57.85ID:D8UGhnWi >>600
嘘書かないで
嘘書かないで
607デフォルトの名無しさん
2023/04/26(水) 18:28:24.85ID:FJ6FgKNy608デフォルトの名無しさん
2023/04/26(水) 18:39:00.36ID:/TEdGcy5 >>607
最後、頭の良さが無い人に教えることは不可能。キリが無いから。
最後、頭の良さが無い人に教えることは不可能。キリが無いから。
609デフォルトの名無しさん
2023/04/26(水) 18:42:01.34ID:/TEdGcy5 言葉ではなく、脳内に画像的なイメージを描かないと駄目ですよ。
全然それが出来てない。
全然それが出来てない。
610デフォルトの名無しさん
2023/04/26(水) 19:01:03.33ID:4J8YauGV この人はvector内にガチのclassやstruct入れてるんだな
611デフォルトの名無しさん
2023/04/26(水) 19:04:57.37ID:N0yJtyL8 >>596
便利だと思うのは自由だけど
頭から順番にイテレートしてから挿入・削除するような使い方だと
Cache Localityの違いによってVectorより性能が劣る
性能が重要ならLinkedListは挿入・削除時にイテレートが必要ないようにして使う
HashMapとLinkedListを組み合わせたLRUキャッシュとかね
便利だと思うのは自由だけど
頭から順番にイテレートしてから挿入・削除するような使い方だと
Cache Localityの違いによってVectorより性能が劣る
性能が重要ならLinkedListは挿入・削除時にイテレートが必要ないようにして使う
HashMapとLinkedListを組み合わせたLRUキャッシュとかね
612デフォルトの名無しさん
2023/04/26(水) 19:11:34.98ID:4J8YauGV613デフォルトの名無しさん
2023/04/26(水) 19:12:21.18ID:4J8YauGV vectorが は間違えて入ってる
614デフォルトの名無しさん
2023/04/26(水) 19:38:13.57ID:qH1OmRtr >>612
メモリキャッシュ自体はヒープもスタックも関係ないが
もちろんスタック上は常にキャッシュに載るから
上限値が決まっているならば全てスタック上に載せたほうが有利
ヒープは確保と解放のコストもかかるから大きく不利
そのためベクター型でもスタックを利用するものを使うとさらに速くなる
例えばRustはスタックをなるべく多用するために3種類のベクター型が使い分けられている
(1) ArrayVec は上限値を定めてスタックのみを使うベクター型
(2) SmallVec は上限値を定めてその範囲内ならスタックのみを使って超えたらヒープを使うベクター型
(3) Vec はヒープを使うベクター型
それぞれコストとわずかに特性が異なる
メモリキャッシュ自体はヒープもスタックも関係ないが
もちろんスタック上は常にキャッシュに載るから
上限値が決まっているならば全てスタック上に載せたほうが有利
ヒープは確保と解放のコストもかかるから大きく不利
そのためベクター型でもスタックを利用するものを使うとさらに速くなる
例えばRustはスタックをなるべく多用するために3種類のベクター型が使い分けられている
(1) ArrayVec は上限値を定めてスタックのみを使うベクター型
(2) SmallVec は上限値を定めてその範囲内ならスタックのみを使って超えたらヒープを使うベクター型
(3) Vec はヒープを使うベクター型
それぞれコストとわずかに特性が異なる
615デフォルトの名無しさん
2023/04/26(水) 20:22:03.82ID:Pd8SmuYa https://ideone.com/hqXsfu
シャッフルされた数列を昇順にinsertした
{
std::vector<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
{
std::list<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
シャッフルされた数列を昇順にinsertした
{
std::vector<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
{
std::list<int> xs;
auto b = std::chrono::system_clock::now();
std::for_each(v.begin(), v.end(), [&xs](int x) {
auto pos = std::find_if(xs.begin(), xs.end(), [x](int y) { return x < y;});
xs.insert(pos, x);
});
auto e = std::chrono::system_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(e - b).count() << std::endl;
}
616デフォルトの名無しさん
2023/04/26(水) 20:41:37.78ID:4J8YauGV617デフォルトの名無しさん
2023/04/26(水) 20:45:35.28ID:4J8YauGV 要素としてintが並んでるだけの実際にはないようなパターンの話をされても困るだろ
何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
618デフォルトの名無しさん
2023/04/26(水) 20:47:03.66ID:4J8YauGV 前にrustスレをずっと荒らしてたおじいさんなのかな?
619デフォルトの名無しさん
2023/04/26(水) 20:51:22.56ID:gAezaDDb >>616
大きなデータだとそういう二段階データ構造にする場合もあるというだけだろう
例えばソートは実体を移動させるよりもインデックスだけ移動させる新たなベクターを設ける
しかしその元の実体もベクターに格納したほうが有利なことが多い
ヒープに乱雑に格納するケースはかなり限られてくる
大きなデータだとそういう二段階データ構造にする場合もあるというだけだろう
例えばソートは実体を移動させるよりもインデックスだけ移動させる新たなベクターを設ける
しかしその元の実体もベクターに格納したほうが有利なことが多い
ヒープに乱雑に格納するケースはかなり限られてくる
620デフォルトの名無しさん
2023/04/26(水) 20:56:32.56ID:G4JVGBup621デフォルトの名無しさん
2023/04/26(水) 20:57:54.91ID:4J8YauGV 限られてはいないだろ
インサート、デリートを乱雑に繰り返して格納するケースだらけだろ
普通に要素数が分からないし、生成時期も分からないものを突っ込むことが多いんだから
インサート、デリートを乱雑に繰り返して格納するケースだらけだろ
普通に要素数が分からないし、生成時期も分からないものを突っ込むことが多いんだから
622デフォルトの名無しさん
2023/04/26(水) 20:59:39.02ID:xAlX+8Be623デフォルトの名無しさん
2023/04/26(水) 21:01:40.35ID:4J8YauGV アプリ作ったことないの?
624デフォルトの名無しさん
2023/04/26(水) 21:01:40.98ID:NzJ1LltZ625デフォルトの名無しさん
2023/04/26(水) 21:02:25.41ID:4J8YauGV >>624
intのvector比べて何になるんだよ
intのvector比べて何になるんだよ
626デフォルトの名無しさん
2023/04/26(水) 21:03:19.22ID:yGAW9BPT intじゃなくて256byteぐらいのデータでやってみると逆転したり
627デフォルトの名無しさん
2023/04/26(水) 21:06:10.27ID:4J8YauGV マンデルブロ画像の描画が速いと言ってるのと変わらない無意味な比較
628デフォルトの名無しさん
2023/04/26(水) 21:08:39.08ID:NzJ1LltZ とても大きなデータならば
もう一つインデックス用vectorを用意すればよい
vectorのインサートは速いままだ
もう一つインデックス用vectorを用意すればよい
vectorのインサートは速いままだ
629デフォルトの名無しさん
2023/04/26(水) 21:32:20.97ID:t/VPhEoq630デフォルトの名無しさん
2023/04/26(水) 21:39:12.36ID:2SSTMM1B データ構造の操作に限ればキャッシュにのるかのらんかで全然違うよな
まあ、リストでもスタック内で作ればいつものるけどね
まあ、リストでもスタック内で作ればいつものるけどね
631デフォルトの名無しさん
2023/04/26(水) 21:40:47.62ID:Pd8SmuYa チョコチョコやっててもキリがないけどとりあえず少しだけ…
これ以上グズグズやってもうざいやろからこれで最後ね
>>626
> intじゃなくて256byteぐらいのデータでやってみると逆転したり
https://ideone.com/8p2nq0
struct foo {
int value, a[(256 / 4) - 1];
foo(int value) : value(value) {}
};
352 ←ベクタ
296 ←リスト
ちな128bytesだとまだベクタが速かった
>>617
> 何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
https://ideone.com/8bwMkQ
上記の生ポインタ版。
53 ←ベクタ
245 ←リスト
これ以上グズグズやってもうざいやろからこれで最後ね
>>626
> intじゃなくて256byteぐらいのデータでやってみると逆転したり
https://ideone.com/8p2nq0
struct foo {
int value, a[(256 / 4) - 1];
foo(int value) : value(value) {}
};
352 ←ベクタ
296 ←リスト
ちな128bytesだとまだベクタが速かった
>>617
> 何らかのオブジェクトが大量にヒープのあちこちに詰まっててvaetorはそのポインタが入ってる
https://ideone.com/8bwMkQ
上記の生ポインタ版。
53 ←ベクタ
245 ←リスト
632デフォルトの名無しさん
2023/04/26(水) 21:42:50.60ID:4J8YauGV このスレを リンクリストで抽出してレスしてる人を見ると1人を除いて多分ほぼ同じ人だと思うわ
633デフォルトの名無しさん
2023/04/26(水) 21:43:32.25ID:V27dNYw1 部分列が外から捕捉される場合があって、その場合はメインのリストから取り除かれて以降も長生きして欲しくて、それでRcRefCell使ってるという事情があるんだがなあ
そもそも目的は高速な反復処理じゃなくて状態の管理だし
>>581とかも勝手に途中のノードまでborrow_mut()して平気な顔してるし
まあそういう可能性を考えられない人は単純な構図にして勝ちを取るのに必死なんですね
ご自分の制作物にその知恵が生きるといいですね
そもそも目的は高速な反復処理じゃなくて状態の管理だし
>>581とかも勝手に途中のノードまでborrow_mut()して平気な顔してるし
まあそういう可能性を考えられない人は単純な構図にして勝ちを取るのに必死なんですね
ご自分の制作物にその知恵が生きるといいですね
634デフォルトの名無しさん
2023/04/26(水) 21:49:09.99ID:QxKA8NrO635デフォルトの名無しさん
2023/04/26(水) 21:58:07.18ID:xAlX+8Be moveコンストラクタが働けばサイズ関係ないのでは?
636デフォルトの名無しさん
2023/04/26(水) 22:02:01.47ID:4J8YauGV637デフォルトの名無しさん
2023/04/26(水) 22:13:00.95ID:yGAW9BPT 前提条件や用途を限定せずに性能議論しても無駄ではある
超長い配列に挿入したり探索したりが同時に発生する場合や
挿入順序維持して末尾に追加したいだけの場合はlinkedlist
超長い配列に挿入したり探索したりが同時に発生する場合や
挿入順序維持して末尾に追加したいだけの場合はlinkedlist
638デフォルトの名無しさん
2023/04/26(水) 22:16:05.39ID:4J8YauGV これで収束かな
おじいさん沈黙したから
おじいさん沈黙したから
639デフォルトの名無しさん
2023/04/26(水) 22:18:45.74ID:2SSTMM1B >>634
ベクタだとまとまってるからヒープでもキャッシュにのりやすくね?
ベクタだとまとまってるからヒープでもキャッシュにのりやすくね?
640デフォルトの名無しさん
2023/04/26(水) 22:36:48.98ID:Pd8SmuYa >>637
> 挿入順序維持して末尾に追加したいだけの場合はlinkedlist
https://ideone.com/6plvA3
172 ←ベクタ(push_back(foo(i)))
107 ←リスト(push_back(foo(i)))
74 ←ベクタ(reserve(n), push_back(foo(i)))
64 ←ベクタ(reserve(n), emplace_back(i))
105 ←リスト(emplace_back(i))
こんな実測チマチマしてっても意味ないのは同意なのでもう寝ます
性能は状況状況に応じて各自が把握してたら十分と思います
> 挿入順序維持して末尾に追加したいだけの場合はlinkedlist
https://ideone.com/6plvA3
172 ←ベクタ(push_back(foo(i)))
107 ←リスト(push_back(foo(i)))
74 ←ベクタ(reserve(n), push_back(foo(i)))
64 ←ベクタ(reserve(n), emplace_back(i))
105 ←リスト(emplace_back(i))
こんな実測チマチマしてっても意味ないのは同意なのでもう寝ます
性能は状況状況に応じて各自が把握してたら十分と思います
641デフォルトの名無しさん
2023/04/26(水) 22:41:35.56ID:4J8YauGV642デフォルトの名無しさん
2023/04/26(水) 22:46:15.95ID:X2gXmZqE のんびりまったりやれよ
Rust勢はめんどくさい、とか言われたいかw
C++は、テスト通りゃいいんだよまであるぜ
いろいろと自由だからね はよunsafe来いw
Rust勢はめんどくさい、とか言われたいかw
C++は、テスト通りゃいいんだよまであるぜ
いろいろと自由だからね はよunsafe来いw
643デフォルトの名無しさん
2023/04/26(水) 22:55:15.76ID:42HUUVU4644デフォルトの名無しさん
2023/04/26(水) 23:11:23.22ID:CmiQ78rr 順序維持の追加だけだと>>640のようにベクタもリストもイーブン
しかし追加するだけで終わるわけはなくそれを使うことになる
そうなると結局ベクタが有利
特定の使い方で両端から取り出して使うだけならリストが有利でないか?との疑問はあるだろう
しかしその場合もリストではなく両端キュー(double-ended queue)つまりC++ではstd::dequeueを使う
その内部実装は配列やベクタを利用となっている
しかし追加するだけで終わるわけはなくそれを使うことになる
そうなると結局ベクタが有利
特定の使い方で両端から取り出して使うだけならリストが有利でないか?との疑問はあるだろう
しかしその場合もリストではなく両端キュー(double-ended queue)つまりC++ではstd::dequeueを使う
その内部実装は配列やベクタを利用となっている
645デフォルトの名無しさん
2023/04/26(水) 23:17:21.42ID:4J8YauGV >>643
誰と勘違いしてるのか知らないけど俺は一度も嘘とか言ってないよ
コード見ればわかるけどlist使ってるほうは条件にあった場所で挿入しなくて
また無駄に頭から挿入位置までiterしてるように見えるでしょ?
おじいさんはコードも読めない
誰と勘違いしてるのか知らないけど俺は一度も嘘とか言ってないよ
コード見ればわかるけどlist使ってるほうは条件にあった場所で挿入しなくて
また無駄に頭から挿入位置までiterしてるように見えるでしょ?
おじいさんはコードも読めない
646デフォルトの名無しさん
2023/04/26(水) 23:39:33.42ID:D3UubLOX >>633
borrowもborrow_mutもコストは同じだが二度のコストは避けたほうがいいんじゃないか
RefCellはスレッド内部専用だから並行して他のコードがborrowを試みるとこもないしあってはいけない
だからそこはborrow_mutのみで済ませてよい
borrowもborrow_mutもコストは同じだが二度のコストは避けたほうがいいんじゃないか
RefCellはスレッド内部専用だから並行して他のコードがborrowを試みるとこもないしあってはいけない
だからそこはborrow_mutのみで済ませてよい
647デフォルトの名無しさん
2023/04/26(水) 23:59:51.46ID:V27dNYw1 >>646
呼び出し元がずっとRef掴んでたら死ぬが
呼び出し元がずっとRef掴んでたら死ぬが
648デフォルトの名無しさん
2023/04/27(木) 00:07:20.74ID:0cRM4ow+ >>647
つかまない実現コードがあれば教えて
つかまない実現コードがあれば教えて
649デフォルトの名無しさん
2023/04/27(木) 00:16:45.43ID:Z1hUQzPQ 他人のことは初心者呼ばわりしておいて自分の見落としも初心者レベルじゃん
誰とは言わんがさすが
誰とは言わんがさすが
650デフォルトの名無しさん
2023/04/27(木) 00:29:02.36ID:wpK/WV9k651デフォルトの名無しさん
2023/04/27(木) 05:33:00.85ID:bgaQiY7u652デフォルトの名無しさん
2023/04/27(木) 06:57:25.28ID:SOFObBsc >>645
vectorもlistもその部分は同じコードだぜ
vectorもlistもその部分は同じコードだぜ
653デフォルトの名無しさん
2023/04/27(木) 08:53:10.05ID:T3ZJ5rQy >>640
(cacheにヒットするかとは別に)cold memoryと言う状態があってbenchmarkの場合は気を付けてください
一応今回のコードでは影響はないと思われます
https://ideone.com/lP1xkO
vector::push_back: 192
256
list::push_back: 113
vector::push_back: 194
reserve, vector::push_back: 81
reserve, vector::emplace_back: 63
list::emplace_back: 111
(cacheにヒットするかとは別に)cold memoryと言う状態があってbenchmarkの場合は気を付けてください
一応今回のコードでは影響はないと思われます
https://ideone.com/lP1xkO
vector::push_back: 192
256
list::push_back: 113
vector::push_back: 194
reserve, vector::push_back: 81
reserve, vector::emplace_back: 63
list::emplace_back: 111
654デフォルトの名無しさん
2023/04/27(木) 10:17:01.26ID:Xs1mJ/iz >>653
手元でやったらvectorの完勝だった(clang-O3)
それとRamMapのあと何回か試すとcold memory?の影響も出たする
list::emplace_back: 101
vector::push_back: 74
256
list::push_back: 102
vector::push_back: 57
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::emplace_back: 97
手元でやったらvectorの完勝だった(clang-O3)
それとRamMapのあと何回か試すとcold memory?の影響も出たする
list::emplace_back: 101
vector::push_back: 74
256
list::push_back: 102
vector::push_back: 57
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::emplace_back: 97
655デフォルトの名無しさん
2023/04/27(木) 11:18:48.87ID:EX56AJz0 int value, a[(256 / 4) - 1];
この配列aはcopyもmoveもないので計測には意味がないのでは?
この配列aはcopyもmoveもないので計測には意味がないのでは?
656デフォルトの名無しさん
2023/04/27(木) 11:58:43.55ID:JAvmRZYl ランダムアクセスの性能が重要な状況で
頭からリニアにアクセスする時点で終わってる
頭からリニアにアクセスする時点で終わってる
657デフォルトの名無しさん
2023/04/27(木) 11:59:27.22ID:JkW3E/QM 敢えてdefaultを明示しても特段の変化ないけど、違う話?
foo& operator= ( const foo & ) = default;
foo ( foo&& other) noexcept{
*this = other;
}
foo& operator= ( const foo & ) = default;
foo ( foo&& other) noexcept{
*this = other;
}
658デフォルトの名無しさん
2023/04/27(木) 12:18:28.50ID:EX56AJz0 vectorはcapacityが不十分なときにfooのcopy(move)を呼ぶ
fooのデフォルトのcopyもmoveも
aの要素をcopyもmoveもしないので
fooのメンバーにaがある意味がない
fooのデフォルトのcopyもmoveも
aの要素をcopyもmoveもしないので
fooのメンバーにaがある意味がない
659デフォルトの名無しさん
2023/04/27(木) 12:33:19.96ID:JkW3E/QM >>658
C++に不慣れなRust使いさんですか?
fooもgooもmemcpyされてる
https://godbolt.org/z/xMxesqcss
>aの要素をcopyもmoveもしないので
これのソースは?
C++に不慣れなRust使いさんですか?
fooもgooもmemcpyされてる
https://godbolt.org/z/xMxesqcss
>aの要素をcopyもmoveもしないので
これのソースは?
660デフォルトの名無しさん
2023/04/27(木) 13:29:59.90ID:EX56AJz0661デフォルトの名無しさん
2023/04/27(木) 13:51:50.04ID:5Zgd55kl662デフォルトの名無しさん
2023/04/27(木) 14:41:22.34ID:e+kUEWUi ポインタをちゃんと理解出来て無い人が、誤った使い方でLinkedListの性能
が悪いと思い込んでいるに一票。
が悪いと思い込んでいるに一票。
663デフォルトの名無しさん
2023/04/27(木) 15:20:28.37ID:W3Pq65Tl664デフォルトの名無しさん
2023/04/27(木) 16:24:47.29ID:usIJ504X >個別要素に総なめアクセスするだけの問題
なら、Arena方式がOKの場合としてstd::pmr::monotonic_buffer_resourceを使ってみた
vector::push_back: 53
256
vector::push_back: 52
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::push_back: 96
list::emplace_back: 94
list<foo,Arena>::push_back: 22
list<foo,Arena>::emplace_back: 22
なら、Arena方式がOKの場合としてstd::pmr::monotonic_buffer_resourceを使ってみた
vector::push_back: 53
256
vector::push_back: 52
reserve, vector::push_back: 15
reserve, vector::emplace_back: 15
list::push_back: 96
list::emplace_back: 94
list<foo,Arena>::push_back: 22
list<foo,Arena>::emplace_back: 22
665デフォルトの名無しさん
2023/04/27(木) 18:52:14.07ID:1NmRe5Ss >vector+reserveサイズで悩む
見積を間違うとかえって遅くなるんだ(なんで?)
list+Arenaは使いどころがあるかもね
vector::push_back: 58
reserve, vector::push_back: 17 *
reserve, vector::emplace_back: 15 *
80% reserve, vector::push_back: 43 x
80% reserve, vector::emplace_back: 44 x
50% reserve, vector::push_back: 32
50% reserve, vector::emplace_back: 34
20% reserve, vector::push_back: 66 xx
20% reserve, vector::emplace_back: 66 xx
vector<foo,Arena>::push_back: 58
vector<foo,Arena>::emplace_back: 60
list::push_back: 94
list::emplace_back: 95
list<foo,Arena>::push_back: 22 *
list<foo,Arena>::emplace_back: 22 *
見積を間違うとかえって遅くなるんだ(なんで?)
list+Arenaは使いどころがあるかもね
vector::push_back: 58
reserve, vector::push_back: 17 *
reserve, vector::emplace_back: 15 *
80% reserve, vector::push_back: 43 x
80% reserve, vector::emplace_back: 44 x
50% reserve, vector::push_back: 32
50% reserve, vector::emplace_back: 34
20% reserve, vector::push_back: 66 xx
20% reserve, vector::emplace_back: 66 xx
vector<foo,Arena>::push_back: 58
vector<foo,Arena>::emplace_back: 60
list::push_back: 94
list::emplace_back: 95
list<foo,Arena>::push_back: 22 *
list<foo,Arena>::emplace_back: 22 *
666デフォルトの名無しさん
2023/04/27(木) 19:26:23.25ID:6exOPbwx667デフォルトの名無しさん
2023/04/27(木) 19:41:41.02ID:2LPN0u11668デフォルトの名無しさん
2023/04/27(木) 22:08:12.11ID:2KodI8PZ データ構造の性能比べはスレ違いだからそろそろやめねえか
669デフォルトの名無しさん
2023/04/27(木) 22:18:15.37ID:OEMrsx3I データ追加の計測をしてるようだけど
実際にはその後にそれらデータを使うため
listは各ポインタをたどるところで不利になってしまう
vectorはreserve無しだと再配置コストがかかるけど
最大個数Mのときに再配置コスト累計はM~2Mで固定
使えば使うほど誤差になっていくので
パフォーマンスを気になるような使い方なら無視してよいかと
実際にはその後にそれらデータを使うため
listは各ポインタをたどるところで不利になってしまう
vectorはreserve無しだと再配置コストがかかるけど
最大個数Mのときに再配置コスト累計はM~2Mで固定
使えば使うほど誤差になっていくので
パフォーマンスを気になるような使い方なら無視してよいかと
670デフォルトの名無しさん
2023/04/28(金) 00:29:13.98ID:Oq9JkTqn ここの人達が馬鹿なのは、LinkedListだけ本来の使い方が出来てないこと。
ポインタの使い方が根本的に理解できてないことが分かる。
ポインタの使い方が根本的に理解できてないことが分かる。
671デフォルトの名無しさん
2023/04/28(金) 00:39:40.76ID:Oq9JkTqn vectorは、要素のラベルとしてindexを使うが、indexは初心者でも理解し易い。
ところが、LinkedListは、要素のラベルとしてポインタを使う。
ポインタを理解できない人は、いつまでもindexを使おうとする。
それでLinkedListの本来の性能が出ないので、LinkedListはvectorより遅い
と思い込むが、実際はその人の使い方が未熟だからに過ぎない。
多くはキャッシュのせいではなく、その人がまともに使いこなせて無い事が原因。
ところが、LinkedListは、要素のラベルとしてポインタを使う。
ポインタを理解できない人は、いつまでもindexを使おうとする。
それでLinkedListの本来の性能が出ないので、LinkedListはvectorより遅い
と思い込むが、実際はその人の使い方が未熟だからに過ぎない。
多くはキャッシュのせいではなく、その人がまともに使いこなせて無い事が原因。
672デフォルトの名無しさん
2023/04/28(金) 00:45:03.56ID:Oq9JkTqn どうして馬鹿な人に限って「キャッシュのせいで」というかといえば、
キャッシュは、ケースバイケースなので、優秀な人でも断定的に語ることが
できないから、馬鹿な人でも優秀な人と似たような状況になって、能力の差異を
ごまかすことが出来そうに思えてしまうから。
キャッシュは、事を行なう順序によって、本当に千差万別の状況が生まれるし、
CPUの世代によっても変わってきてしまうから、語るのが難しいものであるが、
それ故に、理解力が無いから語れない人も、「ごまかすチャンス」を与える
ことが可能となる誤魔化しのユートピアとなる。
キャッシュは、ケースバイケースなので、優秀な人でも断定的に語ることが
できないから、馬鹿な人でも優秀な人と似たような状況になって、能力の差異を
ごまかすことが出来そうに思えてしまうから。
キャッシュは、事を行なう順序によって、本当に千差万別の状況が生まれるし、
CPUの世代によっても変わってきてしまうから、語るのが難しいものであるが、
それ故に、理解力が無いから語れない人も、「ごまかすチャンス」を与える
ことが可能となる誤魔化しのユートピアとなる。
673デフォルトの名無しさん
2023/04/28(金) 01:11:32.25ID:s0aPrD/7 コードを出せないキチガイが連投
674デフォルトの名無しさん
2023/04/28(金) 01:28:17.16ID:njQSrx5C675デフォルトの名無しさん
2023/04/28(金) 01:28:26.76ID:Oq9JkTqn >>673
なんでそんな面倒なことを俺がやらなきゃならないんだよ。
なんでそんな面倒なことを俺がやらなきゃならないんだよ。
676デフォルトの名無しさん
2023/04/28(金) 01:34:03.77ID:sELX9IR8 率直に申し上げると
CとRustの相性は割と良いが
C++とRustの相性は良いとは
(特にテンプレ)言い切れない
即ちCからのリプレースに於いて
Rustが最適解に成り得るのに対し
C++はそのままC++で使い続けるが良かろう
CとRustの相性は割と良いが
C++とRustの相性は良いとは
(特にテンプレ)言い切れない
即ちCからのリプレースに於いて
Rustが最適解に成り得るのに対し
C++はそのままC++で使い続けるが良かろう
677デフォルトの名無しさん
2023/04/28(金) 01:59:46.36ID:EbgOkl/j678デフォルトの名無しさん
2023/04/28(金) 02:05:44.40ID:Oq9JkTqn >>677
キャッシュは、そういう問題じゃなく、前に何をやったかによって、
キャッシュに乗るかどうかが変わってくると言うことが起きることを
「ケースバイケース」と言っている。
だから、LinkedListにおいて、要素を交換するとしても、ソートの様に
ランダムに近い2つが交換した後のソート後の集合を先頭から最後まで巡る場合には
キャッシュミスが多くなるが、必ず隣り合う前後を交換することを2個おきにやった
場合の集合を最初から最後まで巡る場合は、キャッシュミスはほとんど起きない
という事情がある。
だから、LinkedListで要素を交換すると必ず遅い、というような法則は存在
しない。
キャッシュは、そういう問題じゃなく、前に何をやったかによって、
キャッシュに乗るかどうかが変わってくると言うことが起きることを
「ケースバイケース」と言っている。
だから、LinkedListにおいて、要素を交換するとしても、ソートの様に
ランダムに近い2つが交換した後のソート後の集合を先頭から最後まで巡る場合には
キャッシュミスが多くなるが、必ず隣り合う前後を交換することを2個おきにやった
場合の集合を最初から最後まで巡る場合は、キャッシュミスはほとんど起きない
という事情がある。
だから、LinkedListで要素を交換すると必ず遅い、というような法則は存在
しない。
679デフォルトの名無しさん
2023/04/28(金) 05:07:15.20ID:KTdsk5aJ 間違った使い方をしていると主張するならば
他の人たちのように実際にコードを示して
そして比較計測することで実証しよう
他の人たちのように実際にコードを示して
そして比較計測することで実証しよう
680デフォルトの名無しさん
2023/04/28(金) 07:29:21.75ID:tvIf37hb >>678
>キャッシュは、そういう問題じゃなく、前に何をやったかによって、
>キャッシュに乗るかどうかが変わってくると言うことが起きることを
>「ケースバイケース」と言っている。
君がそう思って書いてるのはわかってるよ
それが的外れだから勉強したほうがいいよと言ってるんだよ
> 必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合
この処理がvectorより速くなるとでも?
遅い速いは相対的なものなんだから何と比べてるかくらいはわかるでしょ?
>キャッシュは、そういう問題じゃなく、前に何をやったかによって、
>キャッシュに乗るかどうかが変わってくると言うことが起きることを
>「ケースバイケース」と言っている。
君がそう思って書いてるのはわかってるよ
それが的外れだから勉強したほうがいいよと言ってるんだよ
> 必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合
この処理がvectorより速くなるとでも?
遅い速いは相対的なものなんだから何と比べてるかくらいはわかるでしょ?
681デフォルトの名無しさん
2023/04/28(金) 08:50:10.99ID:gH8UoCJq Rustはグラフ的な構造が作れないから
単純な構造しか扱わないシステムプログラミングにはC++より
優れてると思う
単純な構造しか扱わないシステムプログラミングにはC++より
優れてると思う
682デフォルトの名無しさん
2023/04/28(金) 09:06:54.24ID:M/CtP2dX キチガイ
的外れ
初心者
このあたりも頻出ワード
的外れ
初心者
このあたりも頻出ワード
683デフォルトの名無しさん
2023/04/28(金) 09:39:41.22ID:ypH1tIw5684デフォルトの名無しさん
2023/04/28(金) 10:57:08.12ID:pksuSfee Rustは、要素のラベルとしてindexを使うが、indexは初心者でも理解し易い。
ところが、C++は、要素のラベルとしてpointerを使う。
pointerを理解できない人は、いつまでもindexを使おうとする。
それでC++の本来の性能が出ないので、C++はRustよりunsafe
と思い込むが、実際はその人の使い方が未熟だからに過ぎない。
多くはC++のせいではなく、その人がまともに使いこなせて無い事が原因。
ところが、C++は、要素のラベルとしてpointerを使う。
pointerを理解できない人は、いつまでもindexを使おうとする。
それでC++の本来の性能が出ないので、C++はRustよりunsafe
と思い込むが、実際はその人の使い方が未熟だからに過ぎない。
多くはC++のせいではなく、その人がまともに使いこなせて無い事が原因。
685デフォルトの名無しさん
2023/04/28(金) 12:02:14.73ID:0xBJDLDh こういう人は、「汗をかく人」 違った意味で論外><
686デフォルトの名無しさん
2023/04/28(金) 12:39:05.67ID:35xT11dO >>671
vectorの使い方すら知らないのかよ
プログラムを書いたことがないんだな
次の要素や前の要素を指すにはindexを増減させるのではなく
イテレータを使いポインタでアクセスだ
次の要素を指すには++で要素の大きさ分が加算されるだけなので速い
vectorの使い方すら知らないのかよ
プログラムを書いたことがないんだな
次の要素や前の要素を指すにはindexを増減させるのではなく
イテレータを使いポインタでアクセスだ
次の要素を指すには++で要素の大きさ分が加算されるだけなので速い
687デフォルトの名無しさん
2023/04/28(金) 12:52:16.57ID:35xT11dO688デフォルトの名無しさん
2023/04/28(金) 12:54:59.10ID:l8aVe0s/ >680
>> 必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合
>この処理がvectorより速くなるとでも?
>遅い速いは相対的なものなんだから何と比べてるかくらいはわかるでしょ?
>686
>イテレータを使いポインタでアクセスだ
コードを晒すのはやめるけど、カスタムリストのポインタ操作で実装したらリストの方が速かった
sizeof(foo)= 256 back swap
std::vector, swap(xs[i],xs[i+1]) 55 15
std::vector, swap(*it1,*it2) 54 15
std::list, swap(*it1,*it2) 22 15
LinkList, modify prev/next 22 4
>> 必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合
>この処理がvectorより速くなるとでも?
>遅い速いは相対的なものなんだから何と比べてるかくらいはわかるでしょ?
>686
>イテレータを使いポインタでアクセスだ
コードを晒すのはやめるけど、カスタムリストのポインタ操作で実装したらリストの方が速かった
sizeof(foo)= 256 back swap
std::vector, swap(xs[i],xs[i+1]) 55 15
std::vector, swap(*it1,*it2) 54 15
std::list, swap(*it1,*it2) 22 15
LinkList, modify prev/next 22 4
689デフォルトの名無しさん
2023/04/28(金) 13:04:21.51ID:l8aVe0s/ backは末尾追加(push_backでもemplace_backでも同じ)
swapは>>678が言っている「必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合」
試してみたら言っている通りだったけど、256バイトなのが効いている結果だと思う
それとstd::listはポインタ操作をやらせてくれなのかな?
swapは>>678が言っている「必ず隣り合う前後を交換することを2個おきにやった場合の集合を最初から最後まで巡る場合」
試してみたら言っている通りだったけど、256バイトなのが効いている結果だと思う
それとstd::listはポインタ操作をやらせてくれなのかな?
690デフォルトの名無しさん
2023/04/28(金) 13:12:38.01ID:lHXn1lC8 デカいものはそのようなそれ自体を動かすことはしない
例えばソートする場合でもポインタもしくはインデックスだけをソートする
例えばソートする場合でもポインタもしくはインデックスだけをソートする
691デフォルトの名無しさん
2023/04/28(金) 14:35:42.23ID:njQSrx5C 今はmoveコン実装しとけばデカくても関係ない
692デフォルトの名無しさん
2023/04/28(金) 16:30:32.81ID:c+RN9i0s それはポインタ格納だな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★10 [ぐれ★]
- トランプ氏「台湾侵攻すれば北京爆撃」“過激予告発言”報道がXで再燃「高市氏の1億倍やばい」 [七波羅探題★]
- 【維新国会議員が800万円超の公金を使用】藤田文武共同代表が印刷代569万円を維新市議の「身内企業に支出」していた! [ぐれ★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 ★2 [おっさん友の会★]
- 【ペルソナ・ノン・グラータ】中国総領事の早期国外退去を首相に要請へ 自民・保守系グループ「日本の尊厳と国益を護(まも)る会」 [ぐれ★]
- 【Jリーグ】モンテディオ山形 新スタジアム会員、募集停止 資金計画を再調整、年明け再開予定 [鉄チーズ烏★]
- 高市さん「自賠責を勝手に他の財源に充てるな、返せ」財務省さん、しぶしぶ5700億円を返還 [881878332]
- 中国報道、高市首相を「毒苗」と中傷😡 [399259198]
- 【高市悲報】🇨🇳中国「日本への報復措置? 他にいくらでも方法はある。 まだまだやめないよ」 😨😱 [485983549]
- 【高市】まず父さんの首切り発言が元なのにそれはスルーなのレスバのテクって感じだよな、ジャップって卑怯な癖してこの技術はない [213647114]
- 【悲報】日本、パンダ0にwwwwwwwwwwww高市さんありがとう🐼 [271912485]
- 安倍晋三「円が300円になったらトヨタ車が3分の1で売れる。日本への旅費も3分の1になる。そうすればあっという間に経済は回復していく」 [177178129]
