「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
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 それはポインタ格納だな
693デフォルトの名無しさん
2023/04/28(金) 16:54:55.41ID:njQSrx5C いやポインタじゃなくインスタンス格納だよ
694デフォルトの名無しさん
2023/04/28(金) 17:25:35.41ID:0xBJDLDh ポインタのインスタンス、だろ。リリースビルドではポインタだけになってるかもしれないけど。
695デフォルトの名無しさん
2023/04/28(金) 18:50:51.20ID:rYsqY01x そのvectorに格納している要素が大きな実体なのかそこへのポインタ(アドレス)なのかを理解していないとまずいぜ
要素がポインタを含めて小さい実体ならばvectorの要素の入れ替え・挿入・削除は非常に速い
要素がポインタを含めて小さい実体ならばvectorの要素の入れ替え・挿入・削除は非常に速い
696デフォルトの名無しさん
2023/04/28(金) 19:02:15.28ID:rYsqY01x 一斉シフトが起きる形の挿入削除をしないならば実体をそのまま格納が有利
697デフォルトの名無しさん
2023/04/28(金) 19:07:38.08ID:aOCxNlg7 scanは先頭からvalue(int 4Byte)にアクセスしてダミーXOR演算する処理
dual link listのポインタ操作版(LinkList)はswapした後のscanが256Byteで激落ちだった xx
ForwardLinkListはforward linkかつallocate時のnextを別途キープし続けるデータ構造
sizeof(foo)= 256 n=1000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 52.986 3.461 14.739 3.458 74.644
std::list, swap(*it1,*it2) 22.574 6.470 16.252 6.375 51.672
LinkList, modify prev/next 21.940 6.509 4.229 39.717 72.395 xx
ForwardLinkList, modify next 22.824 6.532 4.395 5.861 39.611 *
sizeof(foo)= 128 n=2000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 60.411 6.789 14.340 7.144 88.683
std::list, swap(*it1,*it2) 28.981 13.839 16.871 14.124 73.815
LinkList, modify prev/next 27.969 13.845 10.074 16.062 67.951 *
ForwardLinkList, modify next 28.204 13.980 9.802 13.791 65.778 *
sizeof(foo)= 64 n=4000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 62.683 7.733 14.140 7.768 92.325
std::list, swap(*it1,*it2) 35.496 14.177 18.950 14.136 82.759 *
LinkList, modify prev/next 32.240 14.129 19.082 14.404 79.856 *
ForwardLinkList, modify next 33.547 14.197 19.169 13.922 80.835 *
sizeof(foo)= 32 n=8000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 61.452 8.084 14.104 8.230 91.870 *
std::list, swap(*it1,*it2) 51.176 17.195 22.936 17.336 108.643
LinkList, modify prev/next 47.231 17.226 23.422 17.519 105.398
ForwardLinkList, modify next 48.123 17.387 23.529 17.408 106.447
dual link listのポインタ操作版(LinkList)はswapした後のscanが256Byteで激落ちだった xx
ForwardLinkListはforward linkかつallocate時のnextを別途キープし続けるデータ構造
sizeof(foo)= 256 n=1000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 52.986 3.461 14.739 3.458 74.644
std::list, swap(*it1,*it2) 22.574 6.470 16.252 6.375 51.672
LinkList, modify prev/next 21.940 6.509 4.229 39.717 72.395 xx
ForwardLinkList, modify next 22.824 6.532 4.395 5.861 39.611 *
sizeof(foo)= 128 n=2000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 60.411 6.789 14.340 7.144 88.683
std::list, swap(*it1,*it2) 28.981 13.839 16.871 14.124 73.815
LinkList, modify prev/next 27.969 13.845 10.074 16.062 67.951 *
ForwardLinkList, modify next 28.204 13.980 9.802 13.791 65.778 *
sizeof(foo)= 64 n=4000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 62.683 7.733 14.140 7.768 92.325
std::list, swap(*it1,*it2) 35.496 14.177 18.950 14.136 82.759 *
LinkList, modify prev/next 32.240 14.129 19.082 14.404 79.856 *
ForwardLinkList, modify next 33.547 14.197 19.169 13.922 80.835 *
sizeof(foo)= 32 n=8000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 61.452 8.084 14.104 8.230 91.870 *
std::list, swap(*it1,*it2) 51.176 17.195 22.936 17.336 108.643
LinkList, modify prev/next 47.231 17.226 23.422 17.519 105.398
ForwardLinkList, modify next 48.123 17.387 23.529 17.408 106.447
698デフォルトの名無しさん
2023/04/28(金) 19:11:25.99ID:aOCxNlg7 C++側としては面白がって人の作ったベースを弄り始めたんだけれど、
sortしたり途中挿入削除しないリニアアクセスだけの問題ならどっちでも良いなw
ただし要素が小さくて途中挿入削除しないのならvector
sizeof(foo)= 16 n=16000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 61.891 9.511 13.994 9.677 95.074 **
std::list, swap(*it1,*it2) 90.948 22.966 34.215 23.463 171.592
LinkList, modify prev/next 76.692 22.989 32.457 23.262 155.400
ForwardLinkList, modify next 76.857 23.095 31.426 23.639 155.018
sizeof(foo)= 8 n=32000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 63.911 9.002 14.222 8.933 96.068 ***
std::list, swap(*it1,*it2) 171.875 52.681 71.011 43.465 339.032
LinkList, modify prev/next 142.104 39.655 52.617 40.589 274.964
ForwardLinkList, modify next 141.527 39.843 49.236 39.779 270.385
>>696に同意です
sortしたり途中挿入削除しないリニアアクセスだけの問題ならどっちでも良いなw
ただし要素が小さくて途中挿入削除しないのならvector
sizeof(foo)= 16 n=16000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 61.891 9.511 13.994 9.677 95.074 **
std::list, swap(*it1,*it2) 90.948 22.966 34.215 23.463 171.592
LinkList, modify prev/next 76.692 22.989 32.457 23.262 155.400
ForwardLinkList, modify next 76.857 23.095 31.426 23.639 155.018
sizeof(foo)= 8 n=32000000 back -> scan -> swap -> scan = total
std::vector,swap(*it1,*it2) 63.911 9.002 14.222 8.933 96.068 ***
std::list, swap(*it1,*it2) 171.875 52.681 71.011 43.465 339.032
LinkList, modify prev/next 142.104 39.655 52.617 40.589 274.964
ForwardLinkList, modify next 141.527 39.843 49.236 39.779 270.385
>>696に同意です
699デフォルトの名無しさん
2023/04/28(金) 19:16:02.37ID:njQSrx5C だからmoveコン実装しとけばコピーは発生せんよ
700デフォルトの名無しさん
2023/04/28(金) 20:00:39.11ID:EmUQPNaW701デフォルトの名無しさん
2023/04/28(金) 20:16:09.12ID:Du1IZbO4 moveがコピーをしないという意味のコピーと
今話題になっている入れ替えたりズラしたりする時にコストとなるコピーは別物だろ
moveでもコピーコストは発生する
それがポインタならばそのコピーコストが最小限になるというだけだ
今話題になっている入れ替えたりズラしたりする時にコストとなるコピーは別物だろ
moveでもコピーコストは発生する
それがポインタならばそのコピーコストが最小限になるというだけだ
702デフォルトの名無しさん
2023/04/28(金) 22:34:19.60ID:/wnDoHyX >>684
RustもC++と同じだよ
例えばvec.iter()はvecの各要素への参照(ポインタ)列を返すイテレータ
例えば要素のkey1をキーとしてソートするなら
vec.iter().sorted_by_key(|x| x.key1)
これもvecの各要素への参照(ポインタ)列をソート順に返すイテレータ
いずれも各要素自体のコピーは発生しない
RustもC++と同じだよ
例えばvec.iter()はvecの各要素への参照(ポインタ)列を返すイテレータ
例えば要素のkey1をキーとしてソートするなら
vec.iter().sorted_by_key(|x| x.key1)
これもvecの各要素への参照(ポインタ)列をソート順に返すイテレータ
いずれも各要素自体のコピーは発生しない
703デフォルトの名無しさん
2023/04/29(土) 00:43:31.78ID:KFapNhiM LinkedListのメリットはメモリを節約できる
の一点だけではないのか?
の一点だけではないのか?
704デフォルトの名無しさん
2023/04/29(土) 00:54:03.05ID:kVhUTSNT あと挿入時負荷が固定なとこ
705デフォルトの名無しさん
2023/04/29(土) 01:18:03.83ID:yAVCYP8x そうじゃなくて頭から最後まで要素を一回走査して挿入削除する場合は一回当たりのコスとはvectorより有利
何度も何度も繰り返し頭から走査する条件下では不利
ここでのベンチ結果は後ろのパターンばかりで不利になるのは当然
コード書いてる人が意図的に間違えてるのかセンスがないかのどちらか
アルゴリズムの意味が理解できてないと言う話
何度も何度も繰り返し頭から走査する条件下では不利
ここでのベンチ結果は後ろのパターンばかりで不利になるのは当然
コード書いてる人が意図的に間違えてるのかセンスがないかのどちらか
アルゴリズムの意味が理解できてないと言う話
706デフォルトの名無しさん
2023/04/29(土) 01:21:50.87ID:yAVCYP8x コードを書く人間として常識的に考えればわかる
挿入時に一部だけ鎖つなぎなおすのが低コストか
毎回全部後ろまでずらすのが低コストか
削除時に一部だけ鎖つなぎなおすのが低コストか
毎回全部後ろの要素を前へずらすのが低コストか
挿入時に一部だけ鎖つなぎなおすのが低コストか
毎回全部後ろまでずらすのが低コストか
削除時に一部だけ鎖つなぎなおすのが低コストか
毎回全部後ろの要素を前へずらすのが低コストか
707デフォルトの名無しさん
2023/04/29(土) 01:28:22.06ID:7kLNqYqu ほっといて勘違いしたままにしとけばいいのに
708デフォルトの名無しさん
2023/04/29(土) 01:52:27.12ID:QawJMl68 実際に色んな仕事をしたことある人たちがvector派という感じ
現実は挿入することが目的ではなくその後に使うところが本場でvectorが有利
稀に比較挿入が主たる場合もあるけど効率の悪いlinked listではなくbinary treeなどを使う
現実は挿入することが目的ではなくその後に使うところが本場でvectorが有利
稀に比較挿入が主たる場合もあるけど効率の悪いlinked listではなくbinary treeなどを使う
709デフォルトの名無しさん
2023/04/29(土) 02:46:40.88ID:KFapNhiM メモリに余裕があるなら
hash一択だな
hash一択だな
710デフォルトの名無しさん
2023/04/29(土) 06:10:16.91ID:g1O4sC7f >>705
> 頭から最後まで要素を一回走査して挿入削除する場合は一回当たりのコスとはvectorより有利
そのような走査して挿入する利用で最も多いのが何かの順序に並べるケース
その場合は結果的にソートをしていることになるがオーダーO(n^2)となり効率が悪い
効率が良い方法はvectorを利用してまずは順序関係なく要素を追加してしまい
その格納された各要素へのポインタを対象に一気にO(n·log(n))の速いソートするとよい
ソートを必要とする多くのデータ処理はそのようにvectorを利用する形になる
> 頭から最後まで要素を一回走査して挿入削除する場合は一回当たりのコスとはvectorより有利
そのような走査して挿入する利用で最も多いのが何かの順序に並べるケース
その場合は結果的にソートをしていることになるがオーダーO(n^2)となり効率が悪い
効率が良い方法はvectorを利用してまずは順序関係なく要素を追加してしまい
その格納された各要素へのポインタを対象に一気にO(n·log(n))の速いソートするとよい
ソートを必要とする多くのデータ処理はそのようにvectorを利用する形になる
711デフォルトの名無しさん
2023/04/29(土) 06:57:32.23ID:DIPSnmX9 なんでソート済みのなかに挿入するのにまたソートするの?
頭悪そう。
頭悪そう。
712デフォルトの名無しさん
2023/04/29(土) 06:58:38.69ID:x0nehzJt だってほら、ソート済みのオブジェクトをひっかきまわす別スレッドがあったり?w (ひっかきまわし
713デフォルトの名無しさん
2023/04/29(土) 07:43:01.19ID:7W8CIlYn Linked Listをソートに使うのはアホ
計算量オーダーを知らないアホ
既に順に並んでるところへ挿入していくから速そうだと勘違いするアホ発見器
計算量オーダーを知らないアホ
既に順に並んでるところへ挿入していくから速そうだと勘違いするアホ発見器
714デフォルトの名無しさん
2023/04/29(土) 08:07:10.82ID:qQ47Kbbt >>703
節約できてねーよw
節約できてねーよw
715デフォルトの名無しさん
2023/04/29(土) 08:11:13.42ID:zSimqKUs >>706
そこはみんなわかってるよ
挿入時や削除時に挿入位置と削除位置を見つけるために
LinkedListの走査が必要な使い方をしたら
性能的にはLinkedListを使う価値がなくなるという話をみんなしてるんだよ
そこはみんなわかってるよ
挿入時や削除時に挿入位置と削除位置を見つけるために
LinkedListの走査が必要な使い方をしたら
性能的にはLinkedListを使う価値がなくなるという話をみんなしてるんだよ
716デフォルトの名無しさん
2023/04/29(土) 10:06:18.64ID:UrxTzFiy VectorとlinkedListってどっちが良いの?スレでやってください
717デフォルトの名無しさん
2023/04/29(土) 10:27:01.32ID:PZBsfh3E Rustユーザは何も書かないのな
こういうのには感心がない人達なのかな?
こういうのには感心がない人達なのかな?
718デフォルトの名無しさん
2023/04/29(土) 10:31:22.19ID:7o70JIXk 自分の無知を知らずシッタカするド素人と
自分の無知を察して慎重にシッタカするド素人
自分の無知を察して口をつぐむ慎ましいド素人
三番目なのがRustユーザ
自分の無知を察して慎重にシッタカするド素人
自分の無知を察して口をつぐむ慎ましいド素人
三番目なのがRustユーザ
719デフォルトの名無しさん
2023/04/29(土) 11:02:19.50ID:YiZx6les QiitaなんかでRustポエムがいいね入れ食いなのから察するに
Rustユーザは>>563みたいな数独パズル状態でどん詰まり傾向かな?
Rustユーザは>>563みたいな数独パズル状態でどん詰まり傾向かな?
720デフォルトの名無しさん
2023/04/29(土) 11:12:39.77ID:ohv1w+T9 結局、ここに溜まるような奴はみんな、やれといわれたら(どっちもちゃんと)やる人間だろうしね
でも好きずきはある やっぱ俺はC++が好き
でも好きずきはある やっぱ俺はC++が好き
721デフォルトの名無しさん
2023/04/29(土) 11:22:17.96ID:dmw04PPX いやmoveを分かってないレベルのRustユーザがいる
おそらくQiitaでRustポエムをいいねしてる?
一方、C++ユーザは実動コードやらベンチ結果を晒して議論するのを面白がってる様子
どっちも無知でも、どっちが成長するのか目に見えてるなw
おそらくQiitaでRustポエムをいいねしてる?
一方、C++ユーザは実動コードやらベンチ結果を晒して議論するのを面白がってる様子
どっちも無知でも、どっちが成長するのか目に見えてるなw
722デフォルトの名無しさん
2023/04/29(土) 11:34:15.28ID:20ghSNY5 >>717
スレタイがアホ過ぎるので興味持って貰えんだろw
スレタイがアホ過ぎるので興味持って貰えんだろw
723デフォルトの名無しさん
2023/04/29(土) 11:36:22.20ID:7o70JIXk 言語としてはある種似てるとは思うわ
言語仕様としてではなくてね
HaskellとC++とRustはいっしょのカテゴリに入ってる
シッタカしたいタイプのド素人がドヤるための言語
JavaとかPHPをドカタ言語といって蔑むのといっしょ
女さんが自分を飾るブランドを選ぶのといっしょ
言語仕様としてではなくてね
HaskellとC++とRustはいっしょのカテゴリに入ってる
シッタカしたいタイプのド素人がドヤるための言語
JavaとかPHPをドカタ言語といって蔑むのといっしょ
女さんが自分を飾るブランドを選ぶのといっしょ
724デフォルトの名無しさん
2023/04/29(土) 11:42:46.52ID:yAVCYP8x725デフォルトの名無しさん
2023/04/29(土) 11:49:34.55ID:XsrXxFON726デフォルトの名無しさん
2023/04/29(土) 11:52:16.10ID:yAVCYP8x >>710
> そのような走査して挿入する利用で最も多いのが何かの順序に並べるケース
頭から走査する回数が増えるとlinkedlistが極端に不利になるって常識的に分かるよね
そういう条件でソートをlinkedlistでやるやつは馬鹿だろ
それなのに何で頭から操作繰り返すアルゴリズムを選ぶのか?
意味分かってないのか?
> そのような走査して挿入する利用で最も多いのが何かの順序に並べるケース
頭から走査する回数が増えるとlinkedlistが極端に不利になるって常識的に分かるよね
そういう条件でソートをlinkedlistでやるやつは馬鹿だろ
それなのに何で頭から操作繰り返すアルゴリズムを選ぶのか?
意味分かってないのか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 立民・岡田氏の質疑「不適切」 維新・藤田氏、台湾有事答弁巡り [蚤の市★]
- 4:44:44.444
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 誰かが自分個人のために作った小豆料理には強力な邪気払い効果があるという
- 【愛国者悲報】ナマコ、中国、香港、台湾しか食ってない...台湾はいいけど他ってどーなんの?漁師はどこに売ればいいんだこれ... [856698234]
- そもそも日本て中国に日沈む国だとか無礼な事言ってたよね
- アニメでよく日本人キャラなのに目の色だけ変えたりしてるのあるじゃん?
