公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
Web上の実行環境
https://play.rust-lang.org
日本語の情報
https://rust-jp.rs/
※Rustを学びたい人はまず最初に公式のThe Bookを読むこと
https://doc.rust-lang.org/book/
※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust
※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/
※C++との比較は専用スレへ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
※次スレは原則>>980が立てること
前スレ
Rust part14
https://mevius.5ch.net/test/read.cgi/tech/1644596656/
Rust part15
■ このスレッドは過去ログ倉庫に格納されています
2022/05/12(木) 18:28:20.99ID:cuIcFT6k
471デフォルトの名無しさん
2022/06/05(日) 18:25:46.65ID:Zl7Pb69A まーたふぃぼなっち言ってるw
バカのひとつ覚えすなあw
バカのひとつ覚えすなあw
472デフォルトの名無しさん
2022/06/05(日) 18:50:30.04ID:1ZIcYX0i473デフォルトの名無しさん
2022/06/05(日) 21:53:01.43ID:ZauVJiyh >>470
何のメリットもなく汚くしてるだけだから受け入れられないという話だったんだが
何のメリットもなく汚くしてるだけだから受け入れられないという話だったんだが
474デフォルトの名無しさん
2022/06/05(日) 22:11:06.61ID:ZR9IOkh3 ジェネリックのフィボナッチや
ジェネリックのカウントアップみたいな
架空のユースケースの話題はもういいよ
ジェネリックのカウントアップみたいな
架空のユースケースの話題はもういいよ
475デフォルトの名無しさん
2022/06/05(日) 22:14:01.51ID: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でもベンチマークできればいいのになあ
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でもベンチマークできればいいのになあ
476デフォルトの名無しさん
2022/06/05(日) 22:14:34.17ID:IymwRCap 「RustとC++を学ぼうと思ってるプログラミング初心者です。」(架空)
477デフォルトの名無しさん
2022/06/05(日) 22:24:27.68ID:+fEwSMrP どの場でも同じだが
「技術的な話題と技術的な指摘」
「他者の話題と他者への攻撃」
この違いがわからず後者を行なうダメ人間のせいで場が荒れる
「技術的な話題と技術的な指摘」
「他者の話題と他者への攻撃」
この違いがわからず後者を行なうダメ人間のせいで場が荒れる
478デフォルトの名無しさん
2022/06/05(日) 22:25:12.37ID:xgxgbUCt479デフォルトの名無しさん
2022/06/05(日) 22:36:45.16ID:4HXc2Nfq >>475
playgroundみたいな環境でベンチマークやれたとしても結果が安定しないのでは
playgroundみたいな環境でベンチマークやれたとしても結果が安定しないのでは
480デフォルトの名無しさん
2022/06/05(日) 22:40:18.97ID:+fEwSMrP >>475
純粋にジェネリックか否かの比較をしたいならばadd_assignとaddの違いなども含めて条件を全て揃えたほうがよい
元がiter::successorsを使っているならば非ジェネリック版も同じくそれで揃えてみてはどうか
純粋にジェネリックか否かの比較をしたいならばadd_assignとaddの違いなども含めて条件を全て揃えたほうがよい
元がiter::successorsを使っているならば非ジェネリック版も同じくそれで揃えてみてはどうか
481デフォルトの名無しさん
2022/06/05(日) 23:17:38.06ID:uQ7Of1B3 >>478
>>480
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=4f477ec7bc08ea9f61f565c00beb0d19
ジェネリックなほうをできる限り揃えたけどこれでいいかい?
CheckedAddでadd_assignする方法だけ無さそうだったからアレになってるけど
fib_generic time: [7.4054 ms 7.4164 ms 7.4275 ms]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
fib_biguint time: [4.9527 ms 4.9591 ms 4.9655 ms]
>>480
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=4f477ec7bc08ea9f61f565c00beb0d19
ジェネリックなほうをできる限り揃えたけどこれでいいかい?
CheckedAddでadd_assignする方法だけ無さそうだったからアレになってるけど
fib_generic time: [7.4054 ms 7.4164 ms 7.4275 ms]
Found 1 outliers among 100 measurements (1.00%)
1 (1.00%) high mild
fib_biguint time: [4.9527 ms 4.9591 ms 4.9655 ms]
482デフォルトの名無しさん
2022/06/05(日) 23:34:45.61ID:MGWqyCtZ483デフォルトの名無しさん
2022/06/06(月) 00:32:35.96ID:m7d3UK5s イテレータで計測してみたけど
>>295のoption::takeだとcloneしても速度変わらないな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=283e5cd13159cab00fcc68d56952df01
>>295のoption::takeだとcloneしても速度変わらないな
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=283e5cd13159cab00fcc68d56952df01
484デフォルトの名無しさん
2022/06/06(月) 02:33:06.91ID:ETmHHhEk >>483
そういう比較はそれ以外の部分のコードを揃えないと何が要因なのか判断できないよ
そういう比較はそれ以外の部分のコードを揃えないと何が要因なのか判断できないよ
485デフォルトの名無しさん
2022/06/06(月) 03:21:12.98ID:CfMv9iPR Rustってフィボナッチ専用言語みたいだな
486デフォルトの名無しさん
2022/06/06(月) 12:48:39.09ID:fwdLGVHm487デフォルトの名無しさん
2022/06/06(月) 14:47:49.79ID:bWO8YoN9 premature optimizationとpremature abstructionの典型例
・具体的なユースケースを想定しない
・トレードオフを考えない
・誰も求めてない抽象化
・計測を伴わない思い込み最適化
コードの汚さと悉く間違った主張の根っこは同じ
・具体的なユースケースを想定しない
・トレードオフを考えない
・誰も求めてない抽象化
・計測を伴わない思い込み最適化
コードの汚さと悉く間違った主張の根っこは同じ
488デフォルトの名無しさん
2022/06/06(月) 15:32:14.02ID:eTH/ySe7 複オジのおかげでいろんな教訓が再認識できて良かったね
反面教師の鑑
めでたしめでたし
反面教師の鑑
めでたしめでたし
489デフォルトの名無しさん
2022/06/06(月) 15:53:42.58ID:c+f9iTO8490481
2022/06/06(月) 16:16:13.39ID:lWIakgkT >>486
正確に言えば
問題はCheckedAdd::checked_add()はselfもotherも参照で取るから、BigUintだと内部で1回clone()されてしまうということなのよね
一方でadd_assignは(桁があふれない限り)in-placeにやるから、その分のコストが発生しない
だから(compiler optimizationという意味での)最適化以前の問題だよ
https://mevius.5ch.net/test/read.cgi/tech/1509028624/153
↑のコードも参考にどうぞ
C++で二項演算子をオーバーロードするときのイディオムです
これを思い出しながら書きました
正確に言えば
問題はCheckedAdd::checked_add()はselfもotherも参照で取るから、BigUintだと内部で1回clone()されてしまうということなのよね
一方でadd_assignは(桁があふれない限り)in-placeにやるから、その分のコストが発生しない
だから(compiler optimizationという意味での)最適化以前の問題だよ
https://mevius.5ch.net/test/read.cgi/tech/1509028624/153
↑のコードも参考にどうぞ
C++で二項演算子をオーバーロードするときのイディオムです
これを思い出しながら書きました
491デフォルトの名無しさん
2022/06/06(月) 16:52:12.73ID:yU0i67fk >>490
ソース見るところ勘違いしてた
確かにaddでも&self使えばclone入るからchecked_add並みに遅くなった
checked_addにownedのselfを取るバージョンが追加されれば改善するだろうけど
trait定義からして対応するつもりのないユースケースかもね
ソース見るところ勘違いしてた
確かにaddでも&self使えばclone入るからchecked_add並みに遅くなった
checked_addにownedのselfを取るバージョンが追加されれば改善するだろうけど
trait定義からして対応するつもりのないユースケースかもね
492デフォルトの名無しさん
2022/06/06(月) 16:57:14.59ID:+9236oDl >>491
CheckedAddAssignを導入すれば全て解決しそうだな
CheckedAddAssignを導入すれば全て解決しそうだな
493デフォルトの名無しさん
2022/06/06(月) 17:23:25.42ID:V1HrdzSd 必要ならextension traitを書けばいい
そこまでしてジェネリックにする価値があるとは思えないけど
そこまでしてジェネリックにする価値があるとは思えないけど
494デフォルトの名無しさん
2022/06/06(月) 18:19:44.52ID:fWB2qr5d リーナスさんから受けたパニックのありがたい指摘って結局どうなったん?
495デフォルトの名無しさん
2022/06/06(月) 20:58:23.31ID:gJyU9Hxy 放置されてんじゃないの?
コンパイラがパニック起こさないように変えられたって聞かないし
コンパイラがパニック起こさないように変えられたって聞かないし
496デフォルトの名無しさん
2022/06/06(月) 21:04:20.00ID:fWB2qr5d パニックにならないオプションくらい作ってもいい気もするけどね
497デフォルトの名無しさん
2022/06/06(月) 21:29:53.43ID:qARo1+y7 パニック自体はもう1年前くらいに修正済み
今はv7 patchまで来ていて大きな懸念も出ていないから
そろそろマージされてもおかしくはない
今はv7 patchまで来ていて大きな懸念も出ていないから
そろそろマージされてもおかしくはない
498デフォルトの名無しさん
2022/06/06(月) 21:51:13.91ID:gJyU9Hxy リーナスレベルに行く前に誰も問題視してなくて指摘もされてないんだろうか
みんなガバガバなんだな
panic前提のコーディング
みんなガバガバなんだな
panic前提のコーディング
499デフォルトの名無しさん
2022/06/06(月) 22:44:51.98ID:Yvz8OCum try_reserveはstabilizeされてるよ
500デフォルトの名無しさん
2022/06/06(月) 23:01:32.72ID:aWO23bGN501デフォルトの名無しさん
2022/06/06(月) 23:06:15.51ID:2Zdu7NAR ジェネリックフィボナッチと同程度にどうでもいい
502デフォルトの名無しさん
2022/06/06(月) 23:15:40.43ID: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のジェネリックコードで問題なし、となる
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のジェネリックコードで問題なし、となる
503デフォルトの名無しさん
2022/06/06(月) 23:58:37.28ID:hMQAMrNY504デフォルトの名無しさん
2022/06/07(火) 00:13:51.07ID:GvuMwmTL505デフォルトの名無しさん
2022/06/07(火) 00:16:51.98ID:y2mAB4fu506デフォルトの名無しさん
2022/06/07(火) 00:17:18.96ID:YQOkxy3N https://gist.github.com/rust-play/8caca28378745b36aaba5358d2a54fe8
test bench_1 ... bench: 426,714 ns/iter (+/- 5,563)
test bench_fast ... bench: 201,510 ns/iter (+/- 2,926)
Criterion の使い方が分からなかったのかな
test bench_1 ... bench: 426,714 ns/iter (+/- 5,563)
test bench_fast ... bench: 201,510 ns/iter (+/- 2,926)
Criterion の使い方が分からなかったのかな
507デフォルトの名無しさん
2022/06/07(火) 00:19:44.22ID:y2mAB4fu508デフォルトの名無しさん
2022/06/07(火) 00:35:03.04ID:z0w37Unr509デフォルトの名無しさん
2022/06/07(火) 00:38:00.86ID:wvlfxzyf まーたすがすがしいまでの自演だなぁ
510デフォルトの名無しさん
2022/06/07(火) 00:39:26.17ID:r6MnfEMB511デフォルトの名無しさん
2022/06/07(火) 01:10:53.92ID:YQOkxy3N https://gist.github.com/rust-play/bde9b95f9bfe4de77fad841db30222c7
test bench_1 ... bench: 420,671 ns/iter (+/- 53,102)
test bench_fast ... bench: 219,091 ns/iter (+/- 1,147)
こんな汚ないことしてまでイテレータになんかしたくないんだけど
どうせ次の文句も大体予想付くし
test bench_1 ... bench: 420,671 ns/iter (+/- 53,102)
test bench_fast ... bench: 219,091 ns/iter (+/- 1,147)
こんな汚ないことしてまでイテレータになんかしたくないんだけど
どうせ次の文句も大体予想付くし
512デフォルトの名無しさん
2022/06/07(火) 01:35:52.48ID:gaZATsj9 この件はRustにとって重要なことだから口を挟むが、
Rustではジェネリックで書いてもmonomorphizationによって各型で書いた時と同じコードになる。
だから標準ライブラリの大半はジェネリックに書かれている。
そしてSomeなどのOptionは最適化できる時は綺麗に消えるため、
BigIntのchecked_addのように常にSomeを返す時も最適化でOptionは消えると考えられる。
いずれも抽象的に書けるのに動かすとC並に速いというRustの長所である。
つまり、>>502の結果が出たことはそれらが実証付けられたことになる。
しかし、以前からジェネリックは無駄とか遅いとかRustの長所に反する主張をする人がいるので気になっていた。
今回もRustのジェネリックは遅いと主張するために、
>>506のように、完全に異なるもの同士を比較したり、
>>511のように、Rcを返すという別仕様のものにしてまで、ジェネリックは遅いと主張し出した。
反Rustか反ジェネリックの立場なのかもしれないが、そういう捏造や詐欺のようなことはよくない。
Rustではジェネリックで書いてもmonomorphizationによって各型で書いた時と同じコードになる。
だから標準ライブラリの大半はジェネリックに書かれている。
そしてSomeなどのOptionは最適化できる時は綺麗に消えるため、
BigIntのchecked_addのように常にSomeを返す時も最適化でOptionは消えると考えられる。
いずれも抽象的に書けるのに動かすとC並に速いというRustの長所である。
つまり、>>502の結果が出たことはそれらが実証付けられたことになる。
しかし、以前からジェネリックは無駄とか遅いとかRustの長所に反する主張をする人がいるので気になっていた。
今回もRustのジェネリックは遅いと主張するために、
>>506のように、完全に異なるもの同士を比較したり、
>>511のように、Rcを返すという別仕様のものにしてまで、ジェネリックは遅いと主張し出した。
反Rustか反ジェネリックの立場なのかもしれないが、そういう捏造や詐欺のようなことはよくない。
513デフォルトの名無しさん
2022/06/07(火) 01:49:10.77ID:eprvoL3W >>512
同意
同意
514デフォルトの名無しさん
2022/06/07(火) 03:36:34.68ID:hBVbMSyF >>512
ジェネリクスが無駄だの遅いだのはコード生成の話ではなくてコードのメンテナンスコスト含めた全体の話では
例えば今回ジェネリックなコードで無駄なcloneを避けるためには CheckedAddAssign といった trait を用意し、各整数型に実装するという余計な手間が発生する
また、各整数に追加のtraitを実装したとしても固定長の整数型ではすぐに桁あふれしてしまうから、実質BigUintの実装しか意味がないものになる
だったら最初からジェネリックにせずBigUintで実装するか、BigUintやBigIntといった桁あふれしない型だけを対象にすればよい
ジェネリクスの良さを語りたいならもっと良い例があるんじゃないの
ジェネリクスが無駄だの遅いだのはコード生成の話ではなくてコードのメンテナンスコスト含めた全体の話では
例えば今回ジェネリックなコードで無駄なcloneを避けるためには CheckedAddAssign といった trait を用意し、各整数型に実装するという余計な手間が発生する
また、各整数に追加のtraitを実装したとしても固定長の整数型ではすぐに桁あふれしてしまうから、実質BigUintの実装しか意味がないものになる
だったら最初からジェネリックにせずBigUintで実装するか、BigUintやBigIntといった桁あふれしない型だけを対象にすればよい
ジェネリクスの良さを語りたいならもっと良い例があるんじゃないの
515デフォルトの名無しさん
2022/06/07(火) 07:03:55.78ID:/+rlx4fZ >>511
そのコードはイテレータ内部で無理にunwrapしているためこれだけでpanicしてしまう
let mut iter = fibonacci_biguint_iter();
let first = iter.next();
let second = iter.next();
実行結果
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:23:30
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
これでは反証コードになっていないので
ちゃんとimpl Iterator<Item = BigUint>を返すコードを書いたほうがいい
>>514
その無駄なcloneとは何?
ベンチ>>502のジェネリックコードを含めた5つのコードを見てみたが無駄なcloneは見当たらなかった
それらよりもベンチで速いコードが出てこない現状をみると無駄は無いのではないか
あと、BigUintを使うまでもない需要も多いのだからジェネリックに書かれたコード一つで十分と感じる
そのコードはイテレータ内部で無理にunwrapしているためこれだけでpanicしてしまう
let mut iter = fibonacci_biguint_iter();
let first = iter.next();
let second = iter.next();
実行結果
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', src/main.rs:23:30
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
これでは反証コードになっていないので
ちゃんとimpl Iterator<Item = BigUint>を返すコードを書いたほうがいい
>>514
その無駄なcloneとは何?
ベンチ>>502のジェネリックコードを含めた5つのコードを見てみたが無駄なcloneは見当たらなかった
それらよりもベンチで速いコードが出てこない現状をみると無駄は無いのではないか
あと、BigUintを使うまでもない需要も多いのだからジェネリックに書かれたコード一つで十分と感じる
516デフォルトの名無しさん
2022/06/07(火) 08:13:15.84ID:AZaNrbV3517デフォルトの名無しさん
2022/06/07(火) 08:54:11.67ID:99FzOzNU Rustで抽象オブジェクト作るのってどうやんの?
518デフォルトの名無しさん
2022/06/07(火) 08:59:47.84ID:do0qCmU/ >>517
Box<dyn ...>のこと?
Box<dyn ...>のこと?
519デフォルトの名無しさん
2022/06/07(火) 11:56:38.96ID:99FzOzNU >>518
C系だと構造体にtypeフィールド作って定数入れてその定数の値に応じて呼び出す関数変えるみたいなことやるんだけど
インタプリタの動的オブジェクトみたいなもの
Rustでもtypeフィールで条件分岐するのが普通?
C系だと構造体にtypeフィールド作って定数入れてその定数の値に応じて呼び出す関数変えるみたいなことやるんだけど
インタプリタの動的オブジェクトみたいなもの
Rustでもtypeフィールで条件分岐するのが普通?
520デフォルトの名無しさん
2022/06/07(火) 12:28:57.89ID:do0qCmU/521デフォルトの名無しさん
2022/06/07(火) 12:30:31.93ID:mvWCmBcR ファントムなんとかを使うんじゃないのか?
522デフォルトの名無しさん
2022/06/07(火) 12:50:46.76ID:1EDCqMQN 抽象オブジェクトと検索して出てくる例みたいなのをRustでやるならこうだな
enum Object {
Integer(i32),
Float(f32),
文字列(String),
Null,
}
use Object::{Integer, Float, 文字列, Null};
impl Object {
fn hello(&self) {
match self {
Integer(i) => println!("Hello, Intger {i} です"),
Float(f) => println!("Hello, Float {f} です"),
文字列(s) => println!("こんにちは、文字列 {s} です"),
Null => println!("Nullです"),
}
}
}
fn main() {
let object_list = [Integer(12345), Float(67.89), 文字列("ABC".into()), Null];
for object in &object_list {
object.hello();
}
}
enum Object {
Integer(i32),
Float(f32),
文字列(String),
Null,
}
use Object::{Integer, Float, 文字列, Null};
impl Object {
fn hello(&self) {
match self {
Integer(i) => println!("Hello, Intger {i} です"),
Float(f) => println!("Hello, Float {f} です"),
文字列(s) => println!("こんにちは、文字列 {s} です"),
Null => println!("Nullです"),
}
}
}
fn main() {
let object_list = [Integer(12345), Float(67.89), 文字列("ABC".into()), Null];
for object in &object_list {
object.hello();
}
}
523デフォルトの名無しさん
2022/06/07(火) 13:15:30.50ID:1v+TnHgu gccではなくg++とかだとフィボナッチ数列とかは演算しないように最適化される場合がある。
Rustのようにイグノーベルの遊びのコンピューターサイエンスのようなコードをこねくり回して気持ち悪く長くて自己満足オナニーコードになるぐらいだったら
部分的にmasmで書いたほうがマシ(速度的にも、メンテナンス性も)
またRustはLLVMに執着しすぎてgccのような最適化はまだされてない、フィボナッチ数列とかのしょーもない一般的なアルゴリズムは
CPUキャッシュに乗るのにマシンコードのセクションの結果が64kbに成らなかったり
Rustのようにイグノーベルの遊びのコンピューターサイエンスのようなコードをこねくり回して気持ち悪く長くて自己満足オナニーコードになるぐらいだったら
部分的にmasmで書いたほうがマシ(速度的にも、メンテナンス性も)
またRustはLLVMに執着しすぎてgccのような最適化はまだされてない、フィボナッチ数列とかのしょーもない一般的なアルゴリズムは
CPUキャッシュに乗るのにマシンコードのセクションの結果が64kbに成らなかったり
524デフォルトの名無しさん
2022/06/07(火) 13:48:18.23ID:99FzOzNU >>620-522
ありがとう
ありがとう
525デフォルトの名無しさん
2022/06/07(火) 14:15:55.18ID:uuz77ncq >>523
演算しないように最適化されるとか意味不明
演算はどこかで必ず発生する
コンパイル時点で演算してしまう定数化のことならばRustでも当然できる
const fn fibonacci(n: usize) -> usize {
const fn f(n: usize, a: usize, b: usize) -> usize {
match n {
0 => a,
1 => b,
_ => f(n - 1, b, a + b),
}
}
f(n, 0, 1)
}
const F77: usize = fibonacci(77);
演算しないように最適化されるとか意味不明
演算はどこかで必ず発生する
コンパイル時点で演算してしまう定数化のことならばRustでも当然できる
const fn fibonacci(n: usize) -> usize {
const fn f(n: usize, a: usize, b: usize) -> usize {
match n {
0 => a,
1 => b,
_ => f(n - 1, b, a + b),
}
}
f(n, 0, 1)
}
const F77: usize = fibonacci(77);
526デフォルトの名無しさん
2022/06/07(火) 15:36:32.04ID:glYADNck >>511
俺環の遅いマシンだと6倍近く速くなった
この差なら用途によっては汚くする価値が十分あるね
まあ実際のプログラムでBigUintのサイズまで一つ一つイテレータで返すような使い方をすることはまずないだろうけど
俺環の遅いマシンだと6倍近く速くなった
この差なら用途によっては汚くする価値が十分あるね
まあ実際のプログラムでBigUintのサイズまで一つ一つイテレータで返すような使い方をすることはまずないだろうけど
527デフォルトの名無しさん
2022/06/07(火) 15:42:23.15ID:fRg0KLfu >>511
コードが汚い上にget_mutが失敗してpanicする欠陥コードを恥ずかしげもなく披露できるもんだな
コードが汚い上にget_mutが失敗してpanicする欠陥コードを恥ずかしげもなく披露できるもんだな
528デフォルトの名無しさん
2022/06/07(火) 17:49:46.06ID:jaUMaLrL >>525
だからそう言ってる、そして機能紹介は知ってることを言わなくてよいよ?コンパイル時実行とは違う。gcc系は数学的に既に答えが出るようなアルゴリズムを書いた場合に演算しないで低い桁で答えを持つ場合がある。
意味が分からないんだったら日本語から勉強しなおせ。それと汚いものを張り付けるな
だからそう言ってる、そして機能紹介は知ってることを言わなくてよいよ?コンパイル時実行とは違う。gcc系は数学的に既に答えが出るようなアルゴリズムを書いた場合に演算しないで低い桁で答えを持つ場合がある。
意味が分からないんだったら日本語から勉強しなおせ。それと汚いものを張り付けるな
529デフォルトの名無しさん
2022/06/07(火) 18:06:57.96ID:WAenZnu4 >>523
定数たたみ込みのことかな
試した限りでは gcc でも clang でも rustc でも最適化されて fib 呼び出しは消えているよ
どういうコードで問題おきるの?
gcc: https://godbolt.org/z/nx3hnsxTT
clang: https://godbolt.org/z/MYc7G9jeG
rustc: https://godbolt.org/z/x18ob3MjP
定数たたみ込みのことかな
試した限りでは gcc でも clang でも rustc でも最適化されて fib 呼び出しは消えているよ
どういうコードで問題おきるの?
gcc: https://godbolt.org/z/nx3hnsxTT
clang: https://godbolt.org/z/MYc7G9jeG
rustc: https://godbolt.org/z/x18ob3MjP
530デフォルトの名無しさん
2022/06/07(火) 18:10:22.54ID:WAenZnu4 >>523
あとrustがllvmに執着しているというのも間違いで
gccのcodegenを使えるようにするプロジェクトもあって活発に開発されてるよ
https://github.com/rust-lang/rustc_codegen_gcc
あとrustがllvmに執着しているというのも間違いで
gccのcodegenを使えるようにするプロジェクトもあって活発に開発されてるよ
https://github.com/rust-lang/rustc_codegen_gcc
532デフォルトの名無しさん
2022/06/07(火) 20:22:53.88ID:UaJ7fd+W フィボナッチなんて普通に解析解あるんだからそれ使えばいいじゃん
533デフォルトの名無しさん
2022/06/07(火) 20:28:59.38ID:ZSCymycr フィボナッチよりボイニッチを解読してくれ
534デフォルトの名無しさん
2022/06/07(火) 23:19:58.58ID:bfW1tdFv ボイニッチはどうせ創作ノートでしかないし
535デフォルトの名無しさん
2022/06/07(火) 23:25:02.45ID:lnwubCy8536デフォルトの名無しさん
2022/06/07(火) 23:57:19.63ID:YQOkxy3N ワッチョイありスレに移住してここは複おじに明け渡してやったほうがいいのかもな
537デフォルトの名無しさん
2022/06/08(水) 00:55:31.29ID:QhxBwpDW538デフォルトの名無しさん
2022/06/08(水) 01:35:00.04ID:jyTDsLRS539デフォルトの名無しさん
2022/06/08(水) 01:40:47.24ID:C5b6ywPX https://play.rust-lang.org/?version=nightly&mode=release&edition=2021&gist=5180fadf9fda409e0456042fc1bccd8e
遅くなるの分かりきってたから出し渋ったつもりだったけど普通に速かったわwwwメンゴメンゴ
test bench_1 ... bench: 426,277 ns/iter (+/- 1,804)
test bench_fast ... bench: 350,928 ns/iter (+/- 2,760)
一応criterion版も貼っとく
>>502で提起されたベンチマーク不適切説の真偽が気になるなら是非実行してみてくれ
https://gist.github.com/rust-play/3bd45555b9e6faef2b1426712e4e7601
遅くなるの分かりきってたから出し渋ったつもりだったけど普通に速かったわwwwメンゴメンゴ
test bench_1 ... bench: 426,277 ns/iter (+/- 1,804)
test bench_fast ... bench: 350,928 ns/iter (+/- 2,760)
一応criterion版も貼っとく
>>502で提起されたベンチマーク不適切説の真偽が気になるなら是非実行してみてくれ
https://gist.github.com/rust-play/3bd45555b9e6faef2b1426712e4e7601
540デフォルトの名無しさん
2022/06/08(水) 02:05:38.58ID:jyTDsLRS541デフォルトの名無しさん
2022/06/08(水) 02:17:57.20ID:aUi5KtMm542デフォルトの名無しさん
2022/06/08(水) 02:29:17.13ID:aUi5KtMm543デフォルトの名無しさん
2022/06/08(水) 04:21:09.02ID:uEpi8n1p544デフォルトの名無しさん
2022/06/08(水) 05:52:38.17ID:78wIRTgY545デフォルトの名無しさん
2022/06/08(水) 06:22:34.20ID:2tL4qRNc546デフォルトの名無しさん
2022/06/08(水) 08:45:07.60ID:C5b6ywPX >>541
「checked_addしてから代入」と「add_assign」の比較だよ
で現状後者はジェネリックにやるために適切なtraitが無いから、
ジェネリックな関数では性能向上に限界があるよねって話
>>540の言う通り、ジェネリック関数とmonomorphized関数をの性能を比較したいわけじゃないよ
>>542
>>490,491でも出た通り、checked_addとadd(両辺とも参照の場合)はどっちもcloneが発生する
だから(2)を(3)にしても、遅いchecked_addを遅いaddで置き換えただけなので性能向上は無い
あとclone発生してるのはここね、docs.rsの[src]からたどれば&BigUint同士のaddがこのマクロで定義されているのが分かるはず
https://docs.rs/num-bigint/latest/src/num_bigint/macros.rs.html#91-107
「checked_addしてから代入」と「add_assign」の比較だよ
で現状後者はジェネリックにやるために適切なtraitが無いから、
ジェネリックな関数では性能向上に限界があるよねって話
>>540の言う通り、ジェネリック関数とmonomorphized関数をの性能を比較したいわけじゃないよ
>>542
>>490,491でも出た通り、checked_addとadd(両辺とも参照の場合)はどっちもcloneが発生する
だから(2)を(3)にしても、遅いchecked_addを遅いaddで置き換えただけなので性能向上は無い
あとclone発生してるのはここね、docs.rsの[src]からたどれば&BigUint同士のaddがこのマクロで定義されているのが分かるはず
https://docs.rs/num-bigint/latest/src/num_bigint/macros.rs.html#91-107
547デフォルトの名無しさん
2022/06/08(水) 09:03:01.17ID:C5b6ywPX あんまり頑固になっても聞かなさそうなんでそろそろ妥協案でも
どうしてもジェネリックでやりたかったら、num::PrimIntでも使ってればここまでの批判は無かったんじゃないですかね
BigUint/BigIntは範囲から外れるけど、それはやっぱりそういうものなんですよ
どうしてもジェネリックでやりたかったら、num::PrimIntでも使ってればここまでの批判は無かったんじゃないですかね
BigUint/BigIntは範囲から外れるけど、それはやっぱりそういうものなんですよ
548デフォルトの名無しさん
2022/06/08(水) 09:13:21.45ID:2tL4qRNc549デフォルトの名無しさん
2022/06/08(水) 11:26:56.36ID:oyhrGaRU Rustが自由自在に書けるようなプログラマになりたがったンゴねえ
ワイは低脳だから躓いてるンゴ
例えば&'static TとT: 'staticの違いがなんかあるらしいんやがわからなかったンゴ
前者はプログラム終了時まで生きる変数の参照って意味で後者はもしTに参照があったらそれは'static以上生きるって解釈であってるんか?
ワイは低脳だから躓いてるンゴ
例えば&'static TとT: 'staticの違いがなんかあるらしいんやがわからなかったンゴ
前者はプログラム終了時まで生きる変数の参照って意味で後者はもしTに参照があったらそれは'static以上生きるって解釈であってるんか?
550デフォルトの名無しさん
2022/06/08(水) 11:49:32.36ID:oyhrGaRU いや理解したんご
前者は参照型しか受け付けないけど後者はそれ以上の種類の型を受け付けるンゴねえ
さらに違いがあるかもだけど勉強進めるわ
なんでもなかった
前者は参照型しか受け付けないけど後者はそれ以上の種類の型を受け付けるンゴねえ
さらに違いがあるかもだけど勉強進めるわ
なんでもなかった
551デフォルトの名無しさん
2022/06/08(水) 12:37:42.94ID:C5b6ywPX552デフォルトの名無しさん
2022/06/08(水) 14:46:42.18ID:JNpA1ROM553デフォルトの名無しさん
2022/06/08(水) 15:00:02.66ID:0R8j40RZ554デフォルトの名無しさん
2022/06/08(水) 15:48:23.76ID:kiLfNcoT555デフォルトの名無しさん
2022/06/08(水) 17:10:39.22ID:C5b6ywPX556デフォルトの名無しさん
2022/06/08(水) 17:16:08.77ID:LlAtoLIj これだけ時間をかけても原因すら分からずノンジェネリックとの速度差を埋められない状況をコストとして認識できてないのが恐ろしい
557デフォルトの名無しさん
2022/06/08(水) 17:31:51.50ID:H0oyRmek558デフォルトの名無しさん
2022/06/08(水) 18:18:03.20ID:cKPONsWM559デフォルトの名無しさん
2022/06/08(水) 18:32:47.55ID:y1p7Fxu2560デフォルトの名無しさん
2022/06/08(水) 19:11:11.80ID:sj9oTS9C561デフォルトの名無しさん
2022/06/08(水) 19:45:52.60ID:btlg3B6B562デフォルトの名無しさん
2022/06/08(水) 19:54:30.37ID:hF0KVPZD CheckedAddAssignの定義難しいよね
cloneを減らせるうまい定義見せて欲しい
cloneを減らせるうまい定義見せて欲しい
563デフォルトの名無しさん
2022/06/08(水) 19:58:01.42ID:hF0KVPZD >>560
> 一方でノンジェネリックで書いてもオーバフロー対策としてchecked_addは使わざるを得ない
つまりどちらが有利とか優れているとかいう問題ではない
BigUintの場合はオーバーフローを想定しなくて良いからただのAddAssignで良いよね
ジェネリックな実装の場合は考慮すべき事項が増えるというハンデを抱えている
> 一方でノンジェネリックで書いてもオーバフロー対策としてchecked_addは使わざるを得ない
つまりどちらが有利とか優れているとかいう問題ではない
BigUintの場合はオーバーフローを想定しなくて良いからただのAddAssignで良いよね
ジェネリックな実装の場合は考慮すべき事項が増えるというハンデを抱えている
564デフォルトの名無しさん
2022/06/08(水) 20:09:35.76ID:Pauu0yN9 基地同士の喧嘩おもすれー
565デフォルトの名無しさん
2022/06/08(水) 21:16:33.76ID:zfNTYu3X ジェネリックでなくても各i8版~u128版でchecked_add要るんじゃね?
566デフォルトの名無しさん
2022/06/08(水) 21:31:30.99ID:uKz/tAPi567デフォルトの名無しさん
2022/06/08(水) 22:52:52.99ID:C5b6ywPX このままでは誰も気付かなさそうなのでここでネタばらし
>>539のcriterion版ですがこちらで動かすとこうなりました
fibonacci_iter_1 time: [7.3605 ms 7.3655 ms 7.3711 ms]
Found 9 outliers among 100 measurements (9.00%)
1 (1.00%) high mild
8 (8.00%) high severe
fibonacci_biguint_iter time: [7.5944 ms 7.5967 ms 7.5992 ms]
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
同程度に遅くなってしまいました
理由は>>548の通り、せっかく減らしたcloneをイテレータ化するために戻さざるを得なかったからです
一見非ジェネリックのほうが速い結果が出たのは、criterion版がN=50000としていたのに対して、
test crate版は最初に貼られたN=10000から変えずにやっていたためでした
criterion版をN=10000で、test crate版をN=50000で計測してみると大体同じような結果になりました
N<2^15あたりまでは非ジェネリックのほうがちょっとだけ速いみたいですが、まあ誤差の範疇かと思います
そういうわけで>>539で非ジェネリックのほうが速いと主張したのは嘘です
本気で信じちゃった人はごめんね
最初はcriterionとtest crateの差だと早とちりしたため、ベンチマーク不適切説とか勿体ぶった書き方をしてました
>>502で根拠も無く疑いをかけたのに対するカウンターのつもりで黙ってたんですが、不発になっちゃいました
まあでもtest crateってwarm upもしないしサンプル数固定だし、その結果ひどい場合だと>>511なんか相対誤差10%超えてるし
criterion使ったほうがいいよってのは大筋では間違ってないよね
最後に+=でイテレートするこれだけ貼っとくから
某おじはこれに相当する性能のジェネリックなイテレータが書けるまでそういったクソどうでもいい執着に人を付き合わせるんじゃないぞ
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=76cd0aad53f19888900a4b450fd078c5
>>539のcriterion版ですがこちらで動かすとこうなりました
fibonacci_iter_1 time: [7.3605 ms 7.3655 ms 7.3711 ms]
Found 9 outliers among 100 measurements (9.00%)
1 (1.00%) high mild
8 (8.00%) high severe
fibonacci_biguint_iter time: [7.5944 ms 7.5967 ms 7.5992 ms]
Found 2 outliers among 100 measurements (2.00%)
1 (1.00%) high mild
1 (1.00%) high severe
同程度に遅くなってしまいました
理由は>>548の通り、せっかく減らしたcloneをイテレータ化するために戻さざるを得なかったからです
一見非ジェネリックのほうが速い結果が出たのは、criterion版がN=50000としていたのに対して、
test crate版は最初に貼られたN=10000から変えずにやっていたためでした
criterion版をN=10000で、test crate版をN=50000で計測してみると大体同じような結果になりました
N<2^15あたりまでは非ジェネリックのほうがちょっとだけ速いみたいですが、まあ誤差の範疇かと思います
そういうわけで>>539で非ジェネリックのほうが速いと主張したのは嘘です
本気で信じちゃった人はごめんね
最初はcriterionとtest crateの差だと早とちりしたため、ベンチマーク不適切説とか勿体ぶった書き方をしてました
>>502で根拠も無く疑いをかけたのに対するカウンターのつもりで黙ってたんですが、不発になっちゃいました
まあでもtest crateってwarm upもしないしサンプル数固定だし、その結果ひどい場合だと>>511なんか相対誤差10%超えてるし
criterion使ったほうがいいよってのは大筋では間違ってないよね
最後に+=でイテレートするこれだけ貼っとくから
某おじはこれに相当する性能のジェネリックなイテレータが書けるまでそういったクソどうでもいい執着に人を付き合わせるんじゃないぞ
https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=76cd0aad53f19888900a4b450fd078c5
568デフォルトの名無しさん
2022/06/08(水) 23:10:54.19ID:Pauu0yN9 Rust使うやつは全員クズ
569デフォルトの名無しさん
2022/06/08(水) 23:14:19.56ID:xZpQpCco ゴミみてぇに使いにくい
570デフォルトの名無しさん
2022/06/08(水) 23:33:46.23ID:1Qgkgfnu >>567
ジェネリックは遅くて使い物にならずRustはクソ言語のいい流れが出来ていたのに邪魔すんなボケ
ジェネリックは遅くて使い物にならずRustはクソ言語のいい流れが出来ていたのに邪魔すんなボケ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★4 [ぐれ★]
- 【音楽】Perfume・あ~ちゃんの結婚相手「一般男性」は吉田カバンの社長・吉田幸裕氏(41) 高身長で山本耕史似 [Ailuropoda melanoleuca★]
- 【大分】佐賀関で大規模火災、170棟以上が延焼中 70代男性1人と連絡取れず [ぐれ★]
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 「クマはなるべく山に返す努力を」「クマと戦争は間違っている」動物保護活動家の主張 棲み分けと学習放獣でクマ被害なくなるのか?★7 [ぐれ★]
- アンケート調査で「高市発言は問題なし」 93.5%wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 自閉症が「んなっしょい」と連呼するお🏡
- 現役猟師・俳優 東出昌大が語る「クマはそんな危ないもんじゃない」
- 【悲報】大分市佐賀関の火事、20軒→170軒に延焼🔥 [481941988]
- 日本人の海外旅行したきのマナーよくなったのはいつから
- へそグリグリ
