[過去ログ]
Rust part15 (1002レス)
Rust part15 http://mevius.5ch.net/test/read.cgi/tech/1652347700/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
295: デフォルトの名無しさん [sage] 2022/05/23(月) 19:27:40.26 ID:qJLEBqNZ >>189 おまえら全員そうだがフィボナッチ数列でusize固定はおかしいだろ コード自体は問題ないが <T: Zero + One + CheckedAdd> を付けろ あとは0と1をT::zero()とT::one()へ置き換えればi8型からBigUintまで何でも動作するようになる https://play.rust-lang.org/?edition=2021&gist=929f3df48db39182558dfad6fe8d1cda さらに今回はfrom_fn()利用をそのままsuccessors()利用へ変換できるので見やすくなる fn fibonacci_iter<T: Zero + One + CheckedAdd>() -> impl Iterator<Item = T> { let mut oq = Some(T::one()); iter::successors(Some(T::zero()), move |p| { let q = oq.take()?; oq = q.checked_add(p); Some(q) }) } ちなみにCloneを要求しないためBigIntなどでも無駄なコスト増とならない >>202 そのコードは暗黙のコピーが発生している from_fn()使用版のコードはcurrがキャプチャ変数なので「let n = curr?;」でコピー発生 successors()使用版のコードはクロージャ引数「|&curr: &usize|」の「&」でコピー発生 usizeならば問題はないがBigIntなどでそのコードは動かないので劣る http://mevius.5ch.net/test/read.cgi/tech/1652347700/295
302: デフォルトの名無しさん [sage] 2022/05/23(月) 20:43:27.72 ID:4RywOifH >>295 自分のレスに他人のふりしてレスするキチガイ汚コーダーこと複オジさんちぃーすっ http://mevius.5ch.net/test/read.cgi/tech/1652347700/302
309: デフォルトの名無しさん [sage] 2022/05/23(月) 22:04:52.01 ID:gtDJ5U8B ヒント: Ratio<T> where T: Integer + Clone + CheckedAdd + CheckedMulは>>295の条件を満たす http://mevius.5ch.net/test/read.cgi/tech/1652347700/309
470: デフォルトの名無しさん [sage] 2022/06/05(日) 17:53:32.33 ID:uQ7Of1B3 速度はベンチを取ってから ユースケースは具体的に示してから そういうことを主張してください そして本当に互いのやり方にメリデメがあると認めているのなら、>>295のような他人叩きはやめましょうね http://mevius.5ch.net/test/read.cgi/tech/1652347700/470
472: デフォルトの名無しさん [] 2022/06/05(日) 18:50:30.04 ID:1ZIcYX0i >>470 その>>295は他人叩きではないだろう そのアルゴリズムではBigIntで無駄なコピーが発生するというRustで気をつけるべき技術的な問題の指摘にみえる そして回避コードもきちんと示しているのでそういう書き込みは歓迎 http://mevius.5ch.net/test/read.cgi/tech/1652347700/472
475: デフォルトの名無しさん [sage] 2022/06/05(日) 22:14:01.51 ID:uQ7Of1B3 https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=41e1df59aeafe6f45fccaa192941d6d1 iter1とiter2は>>295からの引用 Ryzen 7 3700Xで計測 ジェネリクスへのこだわりを捨てればこのくらいは速くできるよ fib_iter1 time: [7.2754 ms 7.2824 ms 7.2907 ms] Found 2 outliers among 100 measurements (2.00%) 1 (1.00%) high mild 1 (1.00%) high severe fib_iter2 time: [7.8536 ms 7.8678 ms 7.8818 ms] fib_biguint time: [4.9757 ms 4.9784 ms 4.9812 ms] Found 5 outliers among 100 measurements (5.00%) 5 (5.00%) high mild Playgroundでもベンチマークできればいいのになあ http://mevius.5ch.net/test/read.cgi/tech/1652347700/475
483: デフォルトの名無しさん [sage] 2022/06/06(月) 00:32:35.96 ID:m7d3UK5s イテレータで計測してみたけど >>295のoption::takeだとcloneしても速度変わらないな https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=283e5cd13159cab00fcc68d56952df01 http://mevius.5ch.net/test/read.cgi/tech/1652347700/483
502: デフォルトの名無しさん [sage] 2022/06/06(月) 23:15:40.43 ID:HuPaBwwV >>481 1.5倍も差があるのは妙だな Rustでは最適化されるのでジェネリックで書こうがそんな差は出ないはず そのベンチマークの仕方がおかしい可能性があるので ジェネリックか否か、check_addか+か、Option利用か否か、など5つのコードで順に調べてみた ベンチマーク使用コード https://gist.github.com/rust-play/18d303c3ec79c19c4285ed190e5b2562 (1) ジェネリック + checked_add + Option + successors 版: 元の>>295と完全に同じコード (2) BigUint + checked_add + Option + successors 版: (1)のTをBigUintへ (3) BigUint + add + Option + successors 版: (2)のchecked_addを'+'へ (4) BigUint + add + Option削除 + successors 版: (3)の変数Optionを削除 (5) BigUint + add + Option削除 + from_fn 版: (4)のsuccessorsをfrom_fnへ 結果 test bench_1 ... bench: 619,527 ns/iter (+/- 18,257) test bench_2 ... bench: 620,293 ns/iter (+/- 23,787) test bench_3 ... bench: 624,149 ns/iter (+/- 24,388) test bench_4 ... bench: 626,810 ns/iter (+/- 20,343) test bench_5 ... bench: 619,675 ns/iter (+/- 30,977) 結論 いずれも誤差の範囲でほぼ同一結果 Rustではジェネリックで書いても最適化される BigUintでchecked_addやその結果のOptionを使っても最適化される したがってi8からBigUintまで任意に動作する>>295のジェネリックコードで問題なし、となる http://mevius.5ch.net/test/read.cgi/tech/1652347700/502
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.043s