「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
570デフォルトの名無しさん
2023/04/25(火) 22:09:05.21ID:FSwGLA9a 563がRcとRefCell使ってるのはgitのバージョン管理ツリーみたいなデータ構造を作りたかったのかな
set_lastで要素を追加するlistの参照に敢えてmutを付けないあたりに強いこだわりを感じる力作
set_lastで要素を追加するlistの参照に敢えてmutを付けないあたりに強いこだわりを感じる力作
571デフォルトの名無しさん
2023/04/25(火) 22:59:52.83ID:ith9obtO 力作でもなんでもなくRcとRefCellの基本にすぎないな
もちろんRcとRefCellを使わずにmutの普通のリンクリストも作れる
一長一短あるので用途に合わせて使い分け
もちろんRcとRefCellを使わずにmutの普通のリンクリストも作れる
一長一短あるので用途に合わせて使い分け
572デフォルトの名無しさん
2023/04/26(水) 00:23:36.32ID:8XaB5QqW 単純にノード単位で共有する感じか
なんか逆方向に枝分かれしながら伸ばしてツリー状のグラフを作るイメージをしてしまった
なんか逆方向に枝分かれしながら伸ばしてツリー状のグラフを作るイメージをしてしまった
573デフォルトの名無しさん
2023/04/26(水) 01:08:26.72ID:N0yJtyL8 >>567
めちゃくちゃいい加減なこと言ってんなw
めちゃくちゃいい加減なこと言ってんなw
574デフォルトの名無しさん
2023/04/26(水) 01:10:35.86ID:N0yJtyL8575デフォルトの名無しさん
2023/04/26(水) 01:21:03.37ID:1VlSMqUT LinkedListは要素の挿入や削除が頻繁に行われる用途で使うものだと思うけど
vectorはそんな用途には向いていない
vectorはそんな用途には向いていない
576デフォルトの名無しさん
2023/04/26(水) 01:30:48.26ID:N0yJtyL8 LinkedListでVectorより効率的に挿入や削除を行うためには
どこに挿入するかどの要素を削除するかをピンポイントで事前に把握できてる必要があるよ
どこに挿入するかどの要素を削除するかをピンポイントで事前に把握できてる必要があるよ
577デフォルトの名無しさん
2023/04/26(水) 01:45:09.49ID:xAlX+8Be RustにもSTLのstd::listみたいなのくらいあるやろ?
自作して何がうれしいのかな?
自作して何がうれしいのかな?
578デフォルトの名無しさん
2023/04/26(水) 01:48:47.01ID:1Uz+jjx7 >>575
意外に思うかもしれないけど
リンクリストは挿入削除の位置までリンクをたどるコストが実は非常に高い
たどった分の個数の読み出しが発生しているためベクター利用でシフト挿入削除の方が速いこともある
理由としては読み出し発生の個数は平均して両者でほぼ同じだがシーケンシャルなベクター利用が速くて勝ち
ベクター利用はそこにシフト書き込みが発生するけど御存知のようにCPUサイクルは読み込みサイクルと比べて書き込みサイクルが超高速
意外に思うかもしれないけど
リンクリストは挿入削除の位置までリンクをたどるコストが実は非常に高い
たどった分の個数の読み出しが発生しているためベクター利用でシフト挿入削除の方が速いこともある
理由としては読み出し発生の個数は平均して両者でほぼ同じだがシーケンシャルなベクター利用が速くて勝ち
ベクター利用はそこにシフト書き込みが発生するけど御存知のようにCPUサイクルは読み込みサイクルと比べて書き込みサイクルが超高速
579デフォルトの名無しさん
2023/04/26(水) 01:50:34.41ID:N0yJtyL8 LinkedListを自作するとRustのOwnershipルール/Rerefernceルールや
Rc<RefCell<T>>みたいな頻出パターンを苦労しながら学べる(らしい)
まあ学べてない人もいるけど
Rc<RefCell<T>>みたいな頻出パターンを苦労しながら学べる(らしい)
まあ学べてない人もいるけど
580デフォルトの名無しさん
2023/04/26(水) 01:53:24.45ID:xAlX+8Be >>579
コンパイラとの取っ組み合い用かw くだらねー
コンパイラとの取っ組み合い用かw くだらねー
581デフォルトの名無しさん
2023/04/26(水) 02:12:38.44ID:QEFRGsvT >>573
その>>567のアドバイス通り
ブロックを終わらせたらborrow()のロックが解放されて動くようになったよ
if let Some(ref next) = list.0.borrow().next {
set_last(next, value);
return;
}
list.0.borrow_mut().value = value;
結局アドバイス二つ目のborrow_mut()だけを最初から使う方法にしたよ
let mut node = list.0.borrow_mut();
if let Some(ref next) = node.next {
set_last(next, value);
} else {
node.value = value;
}
その>>567のアドバイス通り
ブロックを終わらせたらborrow()のロックが解放されて動くようになったよ
if let Some(ref next) = list.0.borrow().next {
set_last(next, value);
return;
}
list.0.borrow_mut().value = value;
結局アドバイス二つ目のborrow_mut()だけを最初から使う方法にしたよ
let mut node = list.0.borrow_mut();
if let Some(ref next) = node.next {
set_last(next, value);
} else {
node.value = value;
}
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だけ本来の使い方が出来てないこと。
ポインタの使い方が根本的に理解できてないことが分かる。
ポインタの使い方が根本的に理解できてないことが分かる。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【無言】中国怒らせた高市首相→1週間だんまり、国民に実害も説明なし 中国問題を避けてスルー… ★5 [BFU★]
- 「日本はパンダがいなくなる状況に直面するだろう」 中国メディア、専門家の見方伝える [♪♪♪★]
- 止まらぬ「日本売り」 高市財政への懸念で進む金利上昇と円安 ★2 [蚤の市★]
- ネット殺到「高市総理の責任」「完全に高市リスク」「負けるな」中国が水産物輸入停止→流石に総理批判の声も「どう責任取る?」 ★12 [樽悶★]
- 【北海道】帯広vs釧路 不良グループが30人規模の大乱闘 廃墟での肝試しで鉢合わせトラブルに…自称解体工の男ら逮捕 [ぐれ★]
- 【福岡】ミカンの木に逆さ吊りになっていた高齢の男性が死亡 [雑用縞工作★]
- 【高市速報】日本の政治家も国民も「実利を取る」って選択ができないバカしかいないのか? [369521721]
- 東大名誉教授「中国は誤った宣伝を繰り広げ、対立を煽り、経済の失敗による国内の不満を日本に向けている」 [903292576]
- ネトウヨ「日本人の命を守るために中国とケンカしろ!え、薬が作れない?じゃあ死ね!」 こいつらの言う安全保障とはいったい何なのか? [314039747]
- 【悲報】Suica、セキュリティを突破されたのが販売されはじめる [347751896]
- 【悲報】米問屋「助けて!米がとんでもない量余ってるのに全然売れないの!でも絶対値下げしたくない…どうしたらいいの…」 [802034645]
- 🏡
