「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
582デフォルトの名無しさん
2023/04/26(水) 02:20:44.73ID:V27dNYw1 参照は適当なところで死んでくれるのにRefはそうじゃないのがだるいって言ってんの
583デフォルトの名無しさん
2023/04/26(水) 02:37:31.30ID:wGFuhVl0 そんな事例あるか?
Hoge(ref x) = y と
Hoge(x) = &y は完全に同じだろ
複数マッチングなどrefしか使えないこともあるから参照はrefで受けるのが好ましい
Hoge(ref x) = y と
Hoge(x) = &y は完全に同じだろ
複数マッチングなどrefしか使えないこともあるから参照はrefで受けるのが好ましい
584デフォルトの名無しさん
2023/04/26(水) 02:54:29.50ID:V27dNYw1 refじゃなくてRefだよ
585デフォルトの名無しさん
2023/04/26(水) 03:11:17.63ID:EoYJiu34 RefCellが返すRefやRefMutはロックガードの一種
他のロックを使うときと同じ利用方法でOK
一時利用が終わるかブロックを抜ければ自動解放され快適
他のロックを使うときと同じ利用方法でOK
一時利用が終わるかブロックを抜ければ自動解放され快適
586デフォルトの名無しさん
2023/04/26(水) 03:13:46.65ID:N0yJtyL8587デフォルトの名無しさん
2023/04/26(水) 03:33:09.04ID:7yfVI/A5 >>566
それはあなたの使い方が間違っているから。
576, 578 の人も同様。
LinkedListでは、場所のラベルとして、index ではなく pointer を使わなければならない。
それを守ればとても高速。
それはあなたの使い方が間違っているから。
576, 578 の人も同様。
LinkedListでは、場所のラベルとして、index ではなく pointer を使わなければならない。
それを守ればとても高速。
588デフォルトの名無しさん
2023/04/26(水) 03:37:05.06ID:m5i6OxT0 >>586
RefCellはmultiple readers or single writerのロックをして参照や可変参照を借用できる型
RwLockと同じように読み出しは複数可だが書き込みは単独独占となる
同じようにロックガードが消えればロックは自動解放される
ただしRwLockとは異なりスレッド間では使えない
RefCellはmultiple readers or single writerのロックをして参照や可変参照を借用できる型
RwLockと同じように読み出しは複数可だが書き込みは単独独占となる
同じようにロックガードが消えればロックは自動解放される
ただしRwLockとは異なりスレッド間では使えない
589デフォルトの名無しさん
2023/04/26(水) 04:05:00.19ID:RAzLC92N590デフォルトの名無しさん
2023/04/26(水) 05:12:35.92ID:7yfVI/A5 >>589
全然違います。
特定の要素を覚えるのはアドレス(ポインタ)を番号として用います。
また、そこから隣に移動したい場合は、右隣は、pNextで、左隣は、pPrev
辿っていくことが出来ます。これらはそれぞれ1クロックしかかからないので、
idx++ と同じ速度なので、効率は最高に良いです。
ほとんどの場合、ポインタを覚えるのに別の集合は必要ありません。
もし、必要な場合は、配列の場合でも index を覚えるために別の集合が
必要になるような場合です。
しかし、それは稀です。なので、LinkedListの場合も稀です。
全然違います。
特定の要素を覚えるのはアドレス(ポインタ)を番号として用います。
また、そこから隣に移動したい場合は、右隣は、pNextで、左隣は、pPrev
辿っていくことが出来ます。これらはそれぞれ1クロックしかかからないので、
idx++ と同じ速度なので、効率は最高に良いです。
ほとんどの場合、ポインタを覚えるのに別の集合は必要ありません。
もし、必要な場合は、配列の場合でも index を覚えるために別の集合が
必要になるような場合です。
しかし、それは稀です。なので、LinkedListの場合も稀です。
591デフォルトの名無しさん
2023/04/26(水) 06:31:44.27ID:nP514kb2 >>590
他の方々はそのような特殊な使い方のみを前提としていない比較だと思いますが、その特殊な場合で比較してみましょう。
前後の要素へポインタを移すために、ptr++とptr--だけで済むのは配列やvectorです。
実際には最大アドレスまたは最小アドレスとの比較も必要ですが、この値もレジスタに持っておくので、比較と増減で2サイクルで済みます。
一方でlinked listの場合、前後の要素へポインタを移すためには、ptr = ptr->nextとptr = ptr->prevそして0との比較になります。
キャシュがヒットしなかったとして、メインメモリから読み出すとすると、100~数百サイクルかかります。
もちろんキャッシュに乗ればマシになりますが、linked listは予想ができません。
このようにポインタの移動だけでも、メモリアクセスが生じるlinked listは非常に不利です。
各要素の内容自体の読み込みは、どちらも同じなりそうですが、少しだけ違ってきます。
vectorならば次々とシーケンシャル読み出しとなり、確実にL1キャッシュに乗りますので、読み出しは4クロック程度で済みます。
linked listはnext/prevを読み出すときに多大なコストを払っているので、内容自体の読み込みはキャッシュに乗ってるでしょう。
しかし、キャッシュに乗ってもnext/prevのサイズ分だけ早くキャッシュから外れるため、やや不利となります。
したがって、前後の要素へのポインタの移動でも、要素の内容読み出しでも、vectorが速くなり、linked listは遅くなります。
他の方々はそのような特殊な使い方のみを前提としていない比較だと思いますが、その特殊な場合で比較してみましょう。
前後の要素へポインタを移すために、ptr++とptr--だけで済むのは配列やvectorです。
実際には最大アドレスまたは最小アドレスとの比較も必要ですが、この値もレジスタに持っておくので、比較と増減で2サイクルで済みます。
一方でlinked listの場合、前後の要素へポインタを移すためには、ptr = ptr->nextとptr = ptr->prevそして0との比較になります。
キャシュがヒットしなかったとして、メインメモリから読み出すとすると、100~数百サイクルかかります。
もちろんキャッシュに乗ればマシになりますが、linked listは予想ができません。
このようにポインタの移動だけでも、メモリアクセスが生じるlinked listは非常に不利です。
各要素の内容自体の読み込みは、どちらも同じなりそうですが、少しだけ違ってきます。
vectorならば次々とシーケンシャル読み出しとなり、確実にL1キャッシュに乗りますので、読み出しは4クロック程度で済みます。
linked listはnext/prevを読み出すときに多大なコストを払っているので、内容自体の読み込みはキャッシュに乗ってるでしょう。
しかし、キャッシュに乗ってもnext/prevのサイズ分だけ早くキャッシュから外れるため、やや不利となります。
したがって、前後の要素へのポインタの移動でも、要素の内容読み出しでも、vectorが速くなり、linked listは遅くなります。
592デフォルトの名無しさん
2023/04/26(水) 08:16:17.35ID:090dM5ZS またその話...
状況次第なので
二人ともLinkedHashMapの場合で持論を展開してください
状況次第なので
二人ともLinkedHashMapの場合で持論を展開してください
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++より
優れてると思う
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★9 [ぐれ★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【国際】ロシアはすでに戦争準備段階――ポーランド軍トップが警告 ★2 [ぐれ★]
- 「町中華」の“息切れ倒産”が増加 ブームにも支えられ職人技で踏ん張ってきたが… 大手チェーンは値上げでも絶好調 [ぐれ★]
- 毛寧(もう・ねい)報道官「中国に日本の水産品の市場は無い」 高市首相の国会答弁に「中国民衆の強い怒り」 ★2 [ぐれ★]
- 【高市核兵器】 小泉コメ防衛大臣「民主党政権 岡田外務大臣の “非核三原則” に関する国会答弁を引き継いでいる」 政策堅持を明言 [485983549]
- 海産物は雄の生殖器の方が美味しいの人体のバグだろ
- 【高市賃上げ】 自民党&維新の会「国会議員の給与を 月5万円アップさせる!」 今国会で歳費法改正。 月129万円→月134万円に [485983549]
- Apple Arcade凄い。ゲーム遊び放題。言うなればゲームの食べ放題。サブスク
- 犯罪者たち「刑事罰受けて罪は償った!被害者への賠償金?もう反省済みだから一円も払わねーよばーかwww」 [177178129]
- ㊗157円 [194819832]
