[過去ログ] Qiita 3 - キータぞ、来たぞ、キータだぞー (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
359(1): デフォルトの名無しさん [sage] 2023/08/24(木) 08:41:31.44 ID:jcLl4hPI(3/3) AAS
ちなみに>>358358(2): デフォルトの名無しさん [sage] 2023/08/24(木) 08:33:36.30 ID:jcLl4hPI(2/3) AAS
次にrustcによるLLVM IR生成
$ rustc -C opt-level=2 --emit llvm-ir -o fibonacci_rs.ll fibonacci.rs
そのうちfibonacci()関数部分を抜粋すると以下のコードとなった
; fibonacci::fibonacci
; Function Attrs: nofree nosync nounwind nonlazybind memory(none) uwtable
define internal fastcc noundef i32 @_ZN9fibonacci9fibonacci17h1af4b62ef57b502cE(i32 noundef %n) unnamed_addr #4 {
start:
%switch1 = icmp ult i32 %n, 2
br i1 %switch1, label %bb8, label %bb5
bb5: ; preds = %start, %bb5
%n.tr3 = phi i32 [ %_7, %bb5 ], [ %n, %start ]
%accumulator.tr2 = phi i32 [ %0, %bb5 ], [ 0, %start ]
%_5 = add i32 %n.tr3, -2
; call fibonacci::fibonacci
%_4 = tail call fastcc noundef i32 @_ZN9fibonacci9fibonacci17h1af4b62ef57b502cE(i32 noundef %_5)
%_7 = add i32 %n.tr3, -1
%0 = add i32 %_4, %accumulator.tr2
%switch = icmp ult i32 %_7, 2
br i1 %switch, label %bb8, label %bb5
bb8: ; preds = %bb5, %start
%accumulator.tr.lcssa = phi i32 [ 0, %start ], [ %0, %bb5 ]
%n.tr.lcssa = phi i32 [ %n, %start ], [ 1, %bb5 ]
%accumulator.ret.tr = add i32 %n.tr.lcssa, %accumulator.tr.lcssa
ret i32 %accumulator.ret.tr
}
clangの場合>>357とは異なり「call」によるfibonacci()呼び出しが一つとなり最適化されている
のRustコンパイラが吐いたLLVM IRのコードを
見やすくC言語に翻訳するとこういうコードになっている
(このコードはLLVM自体による最適化をする前であることに注意)
int fibonacci(int n) {
if (n < 2) {
return n;
}
int f = 0;
while (1) {
f += fibonacci(n - 2);
n = n - 1;
if (n < 2) {
return f + 1;
}
}
}
これはgccが吐いたアセンブラコードと同じ構造であり
rustcとgccは同様の最適化をしていることがわかる
したがって実測結果の Rust(rustc)=C(gcc)>>>C(clang) が生成コードによっても裏付けられた
結論「同様の最適化をしているRustとC(gcc)の両者が最も速い」
363(1): デフォルトの名無しさん [sage] 2023/08/24(木) 22:58:58.23 ID:4A/i1xa5(1) AAS
俺のところではこうなった
>>348348(2): デフォルトの名無しさん [sage] 2023/08/23(水) 21:43:18.69 ID:xWiJzaGi(1) AAS
ナイーブな再帰フィボナッチでマイクロベンチマーク
外部リンク:qiita.com
> もともと
> 外部リンク:qiita.com
> という URL で公開されていた記事に
> > int の長さが処理系によって違うので公平じゃないかもしれません。
> > それと
> > > ネイティブコンパイルの優位性
> > とありますが、Go が Java に負けてますね。
> > int の長さの影響かもしれません。
> というコメントを書いたら、その記事は削除されて。
> 同じ方が、全く同じような内容で
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> 外部リンク:qiita.com
> という記事を公開されて。
> なぜか私はコメントできない(ブロックされてるのかな)ようなので、コメントで書きたかった追加情報に関する記事を書こうと思った。
まとめると、
・コメントしたらブロックされた
・コメントされたことをなかったことにしたいのか元記事は削除、同じ内容で再投稿
で、
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> 外部リンク:qiita.com
見に行ったらこっちも既に削除済みw 誰かコメントしたんだろうなw
新記事が↓らしい。
C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる
外部リンク:qiita.com
どうでもいい内容の記事だったけど、タイトルのC++はg++じゃね? 言語じゃなくて処理系の話してるよね? くらいは誰でも言いそうになると思う罠。
の記事の再帰呼び出し2つのfibonacci.rsとfibonacci.c
$ rustc -C opt-level=2 -o fibonacci_rs fibonacci.rs ; ./fibonacci_rs
Time: 1.90858 seconds
$ gcc -o fibonacci_gcc fibonacci.c -O2 ; ./fibonacci_gcc
Time: 1.90691 seconds
$ clang -o fibonacci_clang fibonacci.c -O2; ./fibonacci_clang
Time: 3.16011 seconds
>>359の再帰呼び出し1つと片方ループ化のfibonacci_opt.rsとfibonacci_opt.c
$ rustc -C opt-level=2 -o fibonacci_opt_rs fibonacci_opt.rs ; ./fibonacci_opt_rs
Time: 1.94240 seconds
$ gcc -o fibonacci_opt_gcc fibonacci_opt.c -O2 ; ./fibonacci_opt_gcc
Time: 1.92169 seconds
$ clang -o fibonacci_opt_clang fibonacci_opt.c -O2 ; ./fibonacci_opt_clang
Time: 1.94741 seconds
ループ化した最適化コードをLLVMに渡さないclangだけが遅い
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.053s