C vs C++ vs Rust Part.3

■ このスレッドは過去ログ倉庫に格納されています
2022/01/27(木) 22:19:47.56ID:avZQ9Wm7
闘え
※前スレ
C++ vs Rust
https://mevius.5ch.net/test/read.cgi/tech/1619219089/
C vs C++ vs Rust Part.2
https://mevius.5ch.net/test/read.cgi/tech/1639539350/
2022/03/17(木) 21:58:49.13ID:S0ETBIy2
コードそのままならイテレータ2つより1つの方が速いと明白なので
速さが同じと主張する>>555が最適化で同じコードになることを示す必要がある
2022/03/17(木) 22:05:07.99ID:faeKJv0z
明白じゃねーよwwwww
2022/03/17(木) 22:19:03.24ID:ONkUn4dy
たぶん>>557氏はイテレータの動作原理を知らないのだと思う
例えばfilterは構造体Filterを返しそのメソッドnext()がイテレータを進めるごとに呼ばれる
同様にmapは構造体Mapを返しそのメソッドnext()がイテレータを進めるごとに呼ばれる
最適化前はそれら二重のオーバヘッドがある
2022/03/17(木) 22:24:52.40ID:qNBuWQhB
速さに関して議論するなら最適化のコードがどうなるかを確認すべきでは
特にイテレーターアダプターを何度も噛ませてもfor文相当のコードが生成されるというのはrustの売りのひとつだよね
2022/03/17(木) 22:29:02.79ID:IFNw/pUN
もし最適化後に有意に速度差があるなら、それは性能バグとしてIssueにあげるべき問題だと思う
2022/03/17(木) 22:31:57.85ID:IHLBrgoM
>>559
その通りで最適化で非常に効率な最終コードとなる
ただし今回のケースでfilter().map()がfilter_map()と同一コードになるかどうかは自明ではない
したがって>>553に立証義務がある
2022/03/17(木) 22:36:47.68ID:faeKJv0z
立証義務なんてねーだろwwww
できないからって他人に頼るなwwwww
2022/03/17(木) 22:38:48.81ID:IFNw/pUN
意味的に同じことやってるんだから、理想的な最適化コンパイラは全く同じバイナリを吐くはずで
遅くなるはずってのも別に自明ではないのでは
2022/03/17(木) 22:46:51.69ID:IHLBrgoM
>>563
意味の同じプログラムが最適化で常に同じコードになるかどうかは自明ではない
そしてそれを期待することはよいが前提としてはいけない
自明ではないことを同じと主張する側に立証義務がある
2022/03/17(木) 22:48:42.58ID:faeKJv0z
できないんだねwwww
rustの吐くコードすげー見にくいしなw
それ以前にアセンブラ読めなそうw
2022/03/17(木) 22:52:00.13ID:IFNw/pUN
>>564
ん?別に同じになるのが自明とは言ってないよ
どちらも同程度に自明でないって言ってるだけ
立証はまぁやりたい人がやればいいんじゃない
2022/03/17(木) 22:57:38.05ID:s2P7MscG
>>565
> rustの吐くコードすげー見にくいしなw

無知っぷりを曝け出してるな
2022/03/17(木) 23:14:09.53ID:faeKJv0z
お前が無知なだけw
2022/03/17(木) 23:29:12.99ID:OpaED0hw
>>565
LLVMがアセンブリを吐いてることも知らないのか
2022/03/17(木) 23:31:17.03ID:faeKJv0z
ビビリ単発IDが何もかもを証明しちゃってるw
お前は何も分かってないw
2022/03/17(木) 23:50:47.22ID:76PcfavB
>>529
C++ではそんなに簡単には書けない
2022/03/17(木) 23:59:39.29ID:faeKJv0z
C++でも簡単に書けるよw
C++20で導入されたrangeでも使ってみw
より古い規格でもユーザーライブラリを使えばRxっぽい記述は簡単に出来る
自分で書くと難しくはないが骨が折れるタイプの実装
並列化を意識しない限りだけどw
まあ並列化を意識しないで簡便さを意識すれば無理にRxを使う必要もないけども・・・
2022/03/18(金) 00:00:49.69ID:Mo7HNly3
>>572
無理でしょ
実際に書いてみ
2022/03/18(金) 00:03:10.42ID:slshVm4c
加えて言えばRxでなければ上限を意識したループで書けるのでメモリ確保が最適化できるし、手でinlineにする部分を選べる分より速く書ける可能性もあるw
2022/03/18(金) 00:03:27.72ID:slshVm4c
>>573
いくらくれる?
2022/03/18(金) 00:10:24.15ID:eD3MnnxT
>>574
無理だ
2022/03/18(金) 00:13:29.40ID:slshVm4c
君にはそうなんだねw可哀想にねw
2022/03/18(金) 00:37:03.66ID:3Q/aNMKI
前スレの時からそうだけどRustのコードばかり出てくるスレ
C++で同じコードを書くと長く見難くなってしまうからだろうけど
2022/03/18(金) 00:49:14.78ID:slshVm4c
C++20なら普通に同じくらいw
あるのはRustの不慣れな部分コードねw まあこのレベルの作業に良い悪いもないけどw
君等のお勉強()にはいいんじゃないのw
2022/03/18(金) 03:33:36.54ID:ljbCBN/E
>>524のC++バージョン教えて
2022/03/18(金) 06:33:28.96ID:slshVm4c
これだけヒント出してやったのにまだ書けないのやばくね?w
2022/03/18(金) 08:39:50.87ID:q9WLoJ2B
>>542
変数の型を必要最低限の小さいインタフェースで宣言するのが嬉しいのに

とか言っているのに、使わない部分も含めてインターフェイスを制限する変数の型制限を有難がるのは笑いどころでしょうか?
「変数の型を固定して、コーダーの想定外の動きをしないように限定する」なら、そういう考えをもあるよね、となるけど。
2022/03/18(金) 19:44:54.15ID:MDox3gf5
>>580
手間がかかって分かりにくいのでC++でやるのは不向き
2022/03/18(金) 21:03:36.45ID:slshVm4c
>>583
この人も出来ないタイプなんだねw そういうことは全くないよw
2022/03/18(金) 21:36:44.00ID:w8aoFpzv
>>584
Rustのように楽にコード書けるの?
2022/03/18(金) 21:41:42.97ID:slshVm4c
>>585
楽かどうかは主観なので、まず自分でやってみれば?
このレベルなら俺はどちらが楽とかはないよw
2022/03/18(金) 22:10:37.73ID:HiGga5GH
9割9分はRustの方が楽にプログラミングできる
2022/03/18(金) 22:13:55.40ID:slshVm4c
単発IDは自作自演だから信用ならんのだよねw
2022/03/18(金) 23:01:40.37ID:l4s3ZEj8
ほとんどのケースでC++よりRustが簡潔になることは皆承知
2022/03/18(金) 23:44:11.33ID:slshVm4c
お前がC++使えてないだけw
変わらないよw
単発IDは自作自演
2022/03/19(土) 06:24:53.41ID:GZmTU31E
>>590
あちゃ、痛いところつかれましたわ
2022/03/19(土) 08:29:04.12ID:yuJH1G8D
変わらない と連呼するだけの簡単なお仕事ですw
2022/03/19(土) 08:34:00.61ID:DslNhsx1
単発IDが皆承知というだけで、ヒントも出したのにC++書けないバカが悪いw
2022/03/19(土) 08:35:31.99ID:GnnMuKUb
Rust信者がたくさん居るかのような見せかけのIDコロコロ
2022/03/19(土) 14:50:55.94ID:QSBhdvNV
公平に見てここまでに
Rustでの実装コードはある>>522 >>524
C++での実装コードはない
不利なのはC++側
2022/03/19(土) 15:08:06.66ID:DslNhsx1
必要だと思うなら自分で書けよwwww
書かなくても分かるから書いてないだけでw
両方分かる人はちゃんと言葉で説明できるからw
2022/03/19(土) 15:10:45.07ID:DslNhsx1
そもそも分からない言語があるのにこういうスレに来る方が間違いなんだがw
2022/03/19(土) 15:57:28.84ID:+R/acvy/
>>595
やめたれw
2022/03/19(土) 16:01:08.28ID:unVMuDSw
口だけでコードとか全然書けないヤツってよくいるよね
2022/03/19(土) 16:04:54.04ID:DslNhsx1
単発ID君悔しいのねw
俺は永遠に返事し続けるよw 君がC++使えるようになる日が来るといいねw
2022/03/19(土) 16:11:35.17ID:+R/acvy/
>>599
いるよなw
コード書いたようが早いような言い訳はいっぱい書けるのになw
言い訳だけはいっぱい書けるんよw
602デフォルトの名無しさん
垢版 |
2022/03/19(土) 16:12:10.15ID:m5PNQvz6
>>547
互換性が壁になるのは、長く広く使われてる言語ではどうしようも無いしなぁ。
だから言語も新しく作られるわけだけど、新しいものは認めません!という奴はいつだっている。
2022/03/19(土) 16:13:51.10ID:M61n5/yF
もう少しわかりやすくして
このsubsetsイテレータをC++で実装すればいいんだよね

fn subsets<T>(input: &[T]) -> impl Iterator<Item=Vec<&T>> {
let len = input.len();
(0..(1 << len))
.map(move |bits| (0..len)
.filter(|index| bits & (1 << index) != 0)
.map(|index| &input[index])
.collect())
}

fn main() {
let input = ["a", "b", "c"];
for s in subsets(&input) {
println!("{s:?}");
}
}

出力結果
[]
["a"]
["b"]
["a", "b"]
["c"]
["a", "c"]
["b", "c"]
["a", "b", "c"]
2022/03/19(土) 16:30:53.75ID:kMuw3v3E
>>602
置き換えのためのテスト手順なんかも考えずに新しいものにすればいいって言い張る老害も
たくさんいるんでその辺はどっちもどっちだがな。
2022/03/19(土) 16:40:18.91ID:DslNhsx1
filter_mapがfilterとmapに分かれただけじゃんwwww
マジでそんなのを何度もブラッシュアップするレベルでは俺には一生追いつけないぞw
どうでもいいけどクロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪いのと結局collectしちゃうのはイマイチだねw
あと生成コードの比較、もしくは時間測定は出来たのか?w
何度も言うが、誰でもどちらの言語でも同じように書けるぞw
2022/03/19(土) 17:31:22.77ID:M61n5/yF
>>603
やってみたがC++の従来のイテレータ仕様が悪すぎることが敗因
なのでC++20からのstd::rangesでかなり改善できる
ただしRust版ほどシンプルに仕上がらないな

>>605
勘違いで詰まらない言いがかりを付けてくるな
そこまで言うならばC++版のコードはおまえに任せる
2022/03/19(土) 18:10:48.21ID:DslNhsx1
単発IDがたまに連続させたって意味ないんだけどw
その辺はとうに>>572に書いたよね?w まだ出来ないの?wwwww
2022/03/19(土) 18:22:18.16ID:u/mznaJY
>>605
> クロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い

意味不明すぎ
クロージャを理解できていない?

> 結局collectしちゃうのはイマイチだね

わかりやすくcollectしてるだけだろう
collectを外せばイテレータを返すイテレータとなるのは自明
2022/03/19(土) 18:31:58.03ID:DslNhsx1
またID変えて忙しいやつだなwww
1つ目の点は細かいが、クロージャを外に出したいと思ったときに不自由なんだよw
2つ目の点は遅延評価をわざわざ使うなら、collectしちゃうとロスが発生するのは分かるだろw
例えばコンソールに出力する場合、そのままiteratorをぶん回したらメモリ要らないのに、最初にcollect付けちゃってるから問題なんだよw
後から付ける事はできても、取り外すことは出来ないからw
2022/03/19(土) 18:34:23.73ID:+R/acvy/
エアプC++erの言い訳無限に出てくるよw
2022/03/19(土) 18:37:48.37ID:LL+Ti59i
もういいから正解書いてくれ。
2022/03/19(土) 18:38:41.55ID:DslNhsx1
ありゃりゃココで複垢まで使っちゃうと他で使えなくなっちゃうよ?w いいの?w
2022/03/19(土) 18:39:15.88ID:+R/acvy/
書けないのに書けるフリして可哀想やわ
614デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:41:43.33ID:LL+Ti59i
複垢とか何を言ってるのかよくわからんが、正解がどうなるのか気になるので正解かいてくれ。
おれはC++もRustもそんなに知らん。
615デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:43:31.88ID:6MHm2WKJ
>>545
手間を惜しまないならチュリ完ならなんでも出来るからなw
2022/03/19(土) 18:44:04.03ID:DslNhsx1
そんなに知らないならココ見るなよwwww 答えクレクレ君が来る場所じゃないw
2022/03/19(土) 18:44:08.25ID:jyTBsiM0
>>605
>どうでもいいけどクロージャ(ラムダ)の引数を次のクロージャで使うのは気持ち悪い

クロージャーは互いに独立しているので
引数を次のクロージャーで使うのは不可能です
根本的な理解が出来ていないのでは?
2022/03/19(土) 18:45:06.81ID:DslNhsx1
チュリ完はプログラミング出来るというだけで、何でもは出来んよw 知ったかくんw
2022/03/19(土) 18:46:38.78ID:DslNhsx1
入れ子のクロージャでって意味の次のだよw ただの順番w
2022/03/19(土) 18:47:35.76ID:+R/acvy/
だっさwwww
言い訳ばっかやんwww
2022/03/19(土) 18:49:45.68ID:DslNhsx1
分かる人は最初ので全部分かってるから、何もしないw
バカが煽ったり質問したりするから永遠に反応してやってるだけw
622デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:49:59.87ID:LL+Ti59i
いやくるなと言われてもくるけどね。
623デフォルトの名無しさん
垢版 |
2022/03/19(土) 18:50:09.75ID:m5PNQvz6
相変わらすc++コードは全然でてこないな。
2022/03/19(土) 18:50:51.71ID:+R/acvy/
C++書いたほうが早いのに言い訳しか出てこないの怖いわw
2022/03/19(土) 18:54:53.91ID:DslNhsx1
Rust推しの駆け出し君がC++を語るとか片腹痛いw
2022/03/19(土) 19:02:54.69ID:cmtG3lS6
>>619
何を言ってるのかわからん
皆にイチャモンつけまくっているだけにみえる
君のsubsetsイテレータ実装を出したまえ
2022/03/19(土) 19:04:05.03ID:DslNhsx1
君等のような駆け出し君がやれマウントだドヤ顔だ上から目線だのと言いつつ、自分の仕事に真摯に取り組まず、自身の評価ばかり気にして待遇がどうの周りがどうのと言い始めて辞めた挙げ句、技術も経験もないままニートになってるから社会問題になってるんだよw
まずは足元を固めてじっくり1つのことをやった方がいいと思うぞおっさん的にはw
2022/03/19(土) 19:06:49.48ID:+R/acvy/
お前がなw
2022/03/19(土) 19:09:27.82ID:DslNhsx1
あれれ?当たっちゃった?w 頑張れよw
2022/03/19(土) 19:10:49.95ID:GZmTU31E
>>625
痛いのは左の腹ですか?それとも右脇腹ですか?
2022/03/19(土) 19:14:41.36ID:DslNhsx1
あえて訂正してこないところが出来るね君w 背中側の腹だよw
2022/03/19(土) 19:33:55.07ID:YQxYhoLA
>>605
もちろんcollect()を外せばそのままイテレータを返すイテレータを返す関数になる

fn subsets<T>(input: &[T]) -> impl Iterator<Item=impl Iterator<Item=&T>> {
let len = input.len();
(0..(1 << len))
.map(move |bits| (0..len)
.filter(move |index| bits & (1 << index) != 0)
.map(|index| &input[index]))
}
2022/03/19(土) 19:50:41.66ID:YQxYhoLA
あとはID:DslNhsx1氏がC++バージョンを書けるかどうか
2022/03/19(土) 19:52:06.07ID:+R/acvy/
やめたれw
2022/03/19(土) 19:57:39.82ID:DslNhsx1
あれあれ?全文がなくなって動かなくなってるねwwww
変更はそこだけでいいのかな?w
C++はお前が書けないのがおかしいんだよw
2022/03/19(土) 20:09:59.31ID:YQxYhoLA
>>635
言いがかりをつけることしか出来ないダメなやつだな
自分でコードを書けないってことなんだろ
どうぞ >>632用の簡易動作確認コード
let input = ["a", "b", "c"];
for mut iter in subsets(&input) {
println!("({})", iter.join(","));
}
2022/03/19(土) 20:41:03.66ID:DslNhsx1
# こんな感じねw
cargo install cargo-edit cargo-geiger
cargo new subsets
cd subsets
cargo add itertools
cat >src/main.rs <<EOF
#![forbid(unsafe_code)]
use itertools::Itertools;
fn subsets<T>(input: &[T]) -> impl Iterator<Item = impl Iterator<Item = &T>> {
let len = input.len();
(0..(1 << len)).map(move |bits| {
(0..len)
.filter(move |index| bits & (1 << index) != 0)
.map(|index| &input[index])
})
}
fn main() {
let input = ["a", "b", "c"];
for s in subsets(&input) {
println!("[{}]", s.format(","));
}
}
EOF
cargo run
cargo geiger
# Run cargo-geiger!
2022/03/19(土) 20:42:40.39ID:DslNhsx1
まあ外部に括りにくいのが気になるのは趣味だから修正はやめといたw
joinはformatに変えただけw
そのまま動くというのはこういうコードw
2022/03/19(土) 21:18:01.62ID:OlJIHMMJ
相変わらずコピペ&改変だけしかできないガイガー君だ
ゼロからコードを書くのは苦手だからC++版の方は手付かずのままなわけだ
2022/03/19(土) 21:27:48.52ID:jYZm0dN8
金もらわないとコード書かないんじゃなかったのか
機嫌が良かったのかな?
2022/03/19(土) 21:39:07.36ID:DslNhsx1
俺は書けるけど、お前らが書けないのに俺が書いたら書かされた感があって嫌なだけw
2022/03/19(土) 21:44:20.43ID:LL+Ti59i
残念だな。エレガントなC++のコードみたかったわ。
2022/03/19(土) 21:47:05.64ID:DslNhsx1
じゃあエレガントでないC++のコードを見せろよw
2022/03/19(土) 21:50:10.65ID:LL+Ti59i
いやおれは書かないけどね。なにをいうてんの。
2022/03/19(土) 21:57:27.50ID:OlJIHMMJ
ガイガー君はコピペ改変なら辛うじてできるからC++派の誰かがコードを書くまで無理だろう
2022/03/19(土) 22:02:11.32ID:DslNhsx1
なんでC++派とかRust派とかいるんだよwwww
両方書けないのになんでこのスレにいるんだよゴミクズどもwwww
2022/03/19(土) 22:18:51.04ID:pGbdb8un
>>646
スレタイと >>1 を見なさいよ
ここは各派閥が争うスレ
2022/03/19(土) 22:19:15.66ID:/tgdZc/e
正確には
Rustだと色々シンプルに書けるためRust派

C++でも書ける派
ただし後者はコードが出てこないので実証されていない
2022/03/19(土) 22:25:23.19ID:DslNhsx1
いやいや
RustだとC++より色々シンプルに書ける派と
RustもC++も同じ派がいるだけだろw
C++だとこんなになっちゃいますってコードが前者から出てないんだがw
C++書けないのにRustだけシンプルに書けると思い込んでるバカはお引取り願おうかねwwwww
2022/03/19(土) 22:32:19.39ID:DslNhsx1
あと個人的に無駄が結構気になるので、さっきのコードRust部分だけ以下に置き換えてくれ
#![forbid(unsafe_code)]
use itertools::Itertools;
fn subsets(len: usize) -> impl Iterator<Item=impl Iterator<Item=usize>> {
(0..(1 << len)).map(move |bits| {
(0..len).filter(move |index| bits & (1 << index) != 0)
})
}
fn main() {
let input = ["a", "b", "c"];
for s in subsets(input.len()) {
println!("[{}]", s.map(|index|&input[index]).format(","));
}
}
2022/03/19(土) 22:36:43.09ID:unVMuDSw
絶対コード書けないだろ
面白すぎw
2022/03/19(土) 22:42:30.15ID:miakijMp
>>650
ポインタとusizeは同じ大きさだから
そのコードでは何か無駄を削除できているわけではない
むしろ使う側で毎回mapしなければならず使い勝手が悪くなっている
さらに大元の話は>>460から始まっているのだから大きく仕様を変えるべきではない
以上3点により却下だ
2022/03/19(土) 23:04:04.71ID:DslNhsx1
別にu32やu16でもいいよw
むしろセットである必要がないのが素晴らしく合理的だし元とかiteratorにした時点で細かく言えば変わっているw
ただ最適化時に範囲チェックがどこまで見てくれるのかが気になるかな…
ノーチェックでいいと判断してくれたら御の字w
2022/03/19(土) 23:27:21.61ID:YSd+hKe3
>>653
添え字を返すならusize必須
あと使う側で変換すればいいと言う主張ならば最初の>>522『0..(1 << len)』でも良いことになる
そのままの方がビット演算処理もできてより利便性が高い
2022/03/19(土) 23:49:24.15ID:DslNhsx1
お前は何を言ってるんだw
inputのサイズで、この方式だと30個が上限w
usizeはオーバースペックなのw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況