Hello hackers !
Qiitaは、エンジニアリングに関する知識を記録・共有するためのサービスです。
コードを書いていて気づいたことや、自分がハマったあの仕様について、
他のエンジニアと知見を共有しましょう ;)
https://qiita.com/
Qiita(キータ)は、Incrementsが運営するプログラミング情報のナレッジコミュニティ。
2016年現在で日本最大のプログラマーコミュニティとされている[1]。
https://internet.watch.impress.co.jp/docs/news/1025972.html
前スレ Qiita
https://mevius.5ch.net/test/read.cgi/tech/1542357242/
Qiita 2 - キータぞ、来たぞ、キータだぞー
https://mevius.5ch.net/test/read.cgi/tech/1658762410/
Qiita 3 - キータぞ、来たぞ、キータだぞー
■ このスレッドは過去ログ倉庫に格納されています
2023/05/28(日) 09:56:01.47ID:twg6yDS4
261デフォルトの名無しさん
2023/08/10(木) 19:42:46.48ID:c2H9n5TK > しかし多くのケースではコンパイラのコード生成に任せることができる
> 今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう
> ソースコードの可読性からもif文のままが好ましい
なにやら知ったようなことを言ってるので検証してみるとするか。
> 今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう
> ソースコードの可読性からもif文のままが好ましい
なにやら知ったようなことを言ってるので検証してみるとするか。
262デフォルトの名無しさん
2023/08/10(木) 19:43:13.35ID:c2H9n5TK void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
if (num[i] == deleteNum) { //deleteNumで指定した要素を0にする
num[i] = 0;
}
}
}
gcc 13.2 最適化オプション-O2でコンパイル
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
leaq (%rsi,%rdi,4), %rax
.L4:
cmpl %edx, (%rsi)
jne .L3
movl $0, (%rsi)
.L3:
addq $4, %rsi
cmpq %rax, %rsi
jne .L4
.L1:
ret
https://godbolt.org/z/noxvcGbff
条件分岐するじゃんw
{
for (int i = 0; i < n; i++) {
if (num[i] == deleteNum) { //deleteNumで指定した要素を0にする
num[i] = 0;
}
}
}
gcc 13.2 最適化オプション-O2でコンパイル
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
leaq (%rsi,%rdi,4), %rax
.L4:
cmpl %edx, (%rsi)
jne .L3
movl $0, (%rsi)
.L3:
addq $4, %rsi
cmpq %rax, %rsi
jne .L4
.L1:
ret
https://godbolt.org/z/noxvcGbff
条件分岐するじゃんw
263デフォルトの名無しさん
2023/08/10(木) 19:46:00.32ID:c2H9n5TK 記事の計算による方法
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
for (int i = 0; i < 6; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
}
hoge: xorl %r11d, %r11d
leaq 24(%rsi), %r10
xorl %r9d, %r9d
testl %edi, %edi
jle .L9
.L2: movq %rsi, %rax
.L4: movl (%rax), %ecx
movl %r9d, %r8d
cmpl %edx, %ecx
cmove %edx, %r8d
addq $4, %rax
subl %r8d, %ecx
movl %ecx, -4(%rax)
cmpq %r10, %rax
jne .L4
addl $1, %r11d
cmpl %r11d, %edi
jne .L2
ret
.L9: ret
https://godbolt.org/z/do55an9P9
cmov命令吐いてる
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
for (int i = 0; i < 6; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
}
hoge: xorl %r11d, %r11d
leaq 24(%rsi), %r10
xorl %r9d, %r9d
testl %edi, %edi
jle .L9
.L2: movq %rsi, %rax
.L4: movl (%rax), %ecx
movl %r9d, %r8d
cmpl %edx, %ecx
cmove %edx, %r8d
addq $4, %rax
subl %r8d, %ecx
movl %ecx, -4(%rax)
cmpq %r10, %rax
jne .L4
addl $1, %r11d
cmpl %r11d, %edi
jne .L2
ret
.L9: ret
https://godbolt.org/z/do55an9P9
cmov命令吐いてる
264デフォルトの名無しさん
2023/08/10(木) 19:47:40.53ID:c2H9n5TK ちなみに計算による方法でもこう書くと2行短くなった
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
for (int i = 0; i < 6; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
}
hoge: xorl %r10d, %r10d
leaq 24(%rsi), %r9
xorl %r8d, %r8d
testl %edi, %edi
jle .L9
.L2: movq %rsi, %rax
.L4: movl (%rax), %ecx
cmpl %edx, %ecx
cmove %r8d, %ecx
addq $4, %rax
movl %ecx, -4(%rax)
cmpq %r9, %rax
jne .L4
addl $1, %r10d
cmpl %r10d, %edi
jne .L2
ret
.L9: ret
https://godbolt.org/z/ro1qj98MG
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
for (int i = 0; i < 6; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
}
hoge: xorl %r10d, %r10d
leaq 24(%rsi), %r9
xorl %r8d, %r8d
testl %edi, %edi
jle .L9
.L2: movq %rsi, %rax
.L4: movl (%rax), %ecx
cmpl %edx, %ecx
cmove %r8d, %ecx
addq $4, %rax
movl %ecx, -4(%rax)
cmpq %r9, %rax
jne .L4
addl $1, %r10d
cmpl %r10d, %edi
jne .L2
ret
.L9: ret
https://godbolt.org/z/ro1qj98MG
265デフォルトの名無しさん
2023/08/10(木) 19:51:41.79ID:UyoKACkM したがって>>253の記事は全面的に正しい
bool値を数値演算として使うことを積極的に推奨する
bool値を数値演算として使うことを積極的に推奨する
266デフォルトの名無しさん
2023/08/10(木) 19:57:21.15ID:c2H9n5TK267デフォルトの名無しさん
2023/08/10(木) 20:01:44.72ID:s1ImWQTP >>256
数学に出てくるクロネッカーのデルタみたいなもので汚くはないし、型に厳しい言語でなければ他の言語でも使えるだろ。
数学に出てくるクロネッカーのデルタみたいなもので汚くはないし、型に厳しい言語でなければ他の言語でも使えるだろ。
268デフォルトの名無しさん
2023/08/10(木) 20:21:25.47ID:c2H9n5TK >>263訂正
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < 6; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
hoge:
leaq 24(%rsi), %r8
xorl %edi, %edi
.L2:
movl (%rsi), %eax
movl %edi, %ecx
cmpl %edx, %eax
cmove %edx, %ecx
addq $4, %rsi
subl %ecx, %eax
movl %eax, -4(%rsi)
cmpq %rsi, %r8
jne .L2
ret
https://godbolt.org/z/br4nPfcEa
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < 6; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
hoge:
leaq 24(%rsi), %r8
xorl %edi, %edi
.L2:
movl (%rsi), %eax
movl %edi, %ecx
cmpl %edx, %eax
cmove %edx, %ecx
addq $4, %rsi
subl %ecx, %eax
movl %eax, -4(%rsi)
cmpq %rsi, %r8
jne .L2
ret
https://godbolt.org/z/br4nPfcEa
269デフォルトの名無しさん
2023/08/10(木) 20:22:14.91ID:c2H9n5TK >>264も訂正
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < 6; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
hoge:
leaq 24(%rsi), %rdi
xorl %ecx, %ecx
.L2:
movl (%rsi), %eax
cmpl %edx, %eax
cmove %ecx, %eax
addq $4, %rsi
movl %eax, -4(%rsi)
cmpq %rdi, %rsi
jne .L2
ret
https://godbolt.org/z/7xhMr6oae
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < 6; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
hoge:
leaq 24(%rsi), %rdi
xorl %ecx, %ecx
.L2:
movl (%rsi), %eax
cmpl %edx, %eax
cmove %ecx, %eax
addq $4, %rsi
movl %eax, -4(%rsi)
cmpq %rdi, %rsi
jne .L2
ret
https://godbolt.org/z/7xhMr6oae
270デフォルトの名無しさん
2023/08/10(木) 20:25:05.76ID:c2H9n5TK すまん>>263再度訂正
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
leaq (%rsi,%rdi,4), %r8
xorl %edi, %edi
.L3:
movl (%rsi), %eax
movl %edi, %ecx
cmpl %edx, %eax
cmove %edx, %ecx
addq $4, %rsi
subl %ecx, %eax
movl %eax, -4(%rsi)
cmpq %rsi, %r8
jne .L3
.L1:
ret
https://godbolt.org/z/9K6dj7Goc
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
leaq (%rsi,%rdi,4), %r8
xorl %edi, %edi
.L3:
movl (%rsi), %eax
movl %edi, %ecx
cmpl %edx, %eax
cmove %edx, %ecx
addq $4, %rsi
subl %ecx, %eax
movl %eax, -4(%rsi)
cmpq %rsi, %r8
jne .L3
.L1:
ret
https://godbolt.org/z/9K6dj7Goc
271デフォルトの名無しさん
2023/08/10(木) 20:25:56.38ID:c2H9n5TK >>264も再度訂正
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
xorl %ecx, %ecx
leaq (%rsi,%rdi,4), %rdi
.L3:
movl (%rsi), %eax
cmpl %edx, %eax
cmove %ecx, %eax
addq $4, %rsi
movl %eax, -4(%rsi)
cmpq %rsi, %rdi
jne .L3
.L1:
ret
https://godbolt.org/z/WTTadjj5a
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
hoge:
testl %edi, %edi
jle .L1
movslq %edi, %rdi
xorl %ecx, %ecx
leaq (%rsi,%rdi,4), %rdi
.L3:
movl (%rsi), %eax
cmpl %edx, %eax
cmove %ecx, %eax
addq $4, %rsi
movl %eax, -4(%rsi)
cmpq %rsi, %rdi
jne .L3
.L1:
ret
https://godbolt.org/z/WTTadjj5a
272デフォルトの名無しさん
2023/08/10(木) 22:01:59.49ID:4Znn5xIX Rustでも同じ結果となった (diff -u 形式)
fn hoge(num_list: &mut [i32], delete_num: i32) {
for num in num_list {
- if *num == delete_num {
- *num = 0;
- }
+ *num *= (*num != delete_num) as i32;
}
}
アセンブラ出力の方はラベルと使用レジスタ名のズレだけ揃えてdiff
hoge:
test rsi, rsi
je .LBB1_4
shl rsi, 2
xor eax, eax
+ xor ecx, ecx
.LBB1_2:
- cmp dword ptr [rdi + rax], edx
- jne .LBB1_3
- mov dword ptr [rdi + rax], 0
-.LBB1_3:
+ mov r8d, dword ptr [rdi + rax]
+ cmp r8d, edx
+ cmove r8d, ecx
+ mov dword ptr [rdi + rax], r8d
add rax, 4
cmp rsi, rax
jne .LBB1_2
.LBB1_4:
ret
fn hoge(num_list: &mut [i32], delete_num: i32) {
for num in num_list {
- if *num == delete_num {
- *num = 0;
- }
+ *num *= (*num != delete_num) as i32;
}
}
アセンブラ出力の方はラベルと使用レジスタ名のズレだけ揃えてdiff
hoge:
test rsi, rsi
je .LBB1_4
shl rsi, 2
xor eax, eax
+ xor ecx, ecx
.LBB1_2:
- cmp dword ptr [rdi + rax], edx
- jne .LBB1_3
- mov dword ptr [rdi + rax], 0
-.LBB1_3:
+ mov r8d, dword ptr [rdi + rax]
+ cmp r8d, edx
+ cmove r8d, ecx
+ mov dword ptr [rdi + rax], r8d
add rax, 4
cmp rsi, rax
jne .LBB1_2
.LBB1_4:
ret
273デフォルトの名無しさん
2023/08/10(木) 22:05:03.94ID:4Znn5xIX つまりC言語もRustもどちらも同じく
if文の時は普通に条件分岐する
比較値を自己掛け算させるとcmoveを使う
生成コードで掛け算が消えてしまうのはいいね
代わりにやってることは
(1) レジスタの値にメモリから読み込む
(2) 比較
(3) 一致していた時のみレジスタに値0を入れる 【cmove】
(4) レジスタの値をメモリへ書き戻す
条件分岐がない代わりに0にしない時も常に書き込みが発生する
ただし読み込んだ位置への書き込みだから
1サイクルのみでキャッシュページミスのペナルティも無くて済むから問題なしか
一方で元の条件分岐ジャンプするコードと比較して速さはどうなの?
分岐予測ミスやパイプラインの乱れとやらがどれだけ効くのか教えて欲しい
if文の時は普通に条件分岐する
比較値を自己掛け算させるとcmoveを使う
生成コードで掛け算が消えてしまうのはいいね
代わりにやってることは
(1) レジスタの値にメモリから読み込む
(2) 比較
(3) 一致していた時のみレジスタに値0を入れる 【cmove】
(4) レジスタの値をメモリへ書き戻す
条件分岐がない代わりに0にしない時も常に書き込みが発生する
ただし読み込んだ位置への書き込みだから
1サイクルのみでキャッシュページミスのペナルティも無くて済むから問題なしか
一方で元の条件分岐ジャンプするコードと比較して速さはどうなの?
分岐予測ミスやパイプラインの乱れとやらがどれだけ効くのか教えて欲しい
274デフォルトの名無しさん
2023/08/10(木) 22:05:48.11ID:MwGz91pK 何度訂正されても暑さでやられたやつが発狂してるようにしか見えんからもういいぞ
どうしても主張したいなら記事書けよ
どうしても主張したいなら記事書けよ
275デフォルトの名無しさん
2023/08/10(木) 22:36:14.41ID:4Znn5xIX 訂正してる人はコピペミスか実験かどちらかで二重ループになってしまったのを訂正してるっぽいけどよくわからん
アドバイスできることは
clangの方で-O2だとベクタ展開して比較わかりにくくなってるのを
-Os指定すれば展開がなくなりgccとほぼ同じコードになるよ
アドバイスできることは
clangの方で-O2だとベクタ展開して比較わかりにくくなってるのを
-Os指定すれば展開がなくなりgccとほぼ同じコードになるよ
276デフォルトの名無しさん
2023/08/11(金) 06:16:54.95ID:YfwUjgK1277デフォルトの名無しさん
2023/08/11(金) 08:15:21.50ID:jaK9CZIt if文を使ったコードと使わないコードの2種類が示されている状況で
何と何を比較しているのかわからないのは深刻な脳のバグだよw
何と何を比較しているのかわからないのは深刻な脳のバグだよw
278デフォルトの名無しさん
2023/08/11(金) 08:34:14.26ID:YfwUjgK1279デフォルトの名無しさん
2023/08/11(金) 08:59:40.37ID:WAWJg8ep 発狂してる俺様のレスを追いかけて全部読めとかいう頭のバグったやつ
280デフォルトの名無しさん
2023/08/11(金) 09:03:31.51ID:YfwUjgK1 本人が気づいてない可能性があるからボランティアで教えてあげている
君の文章では他の人間は全く理解できないと
そもそも自分と他人を区別できてるのかなw
君の文章では他の人間は全く理解できないと
そもそも自分と他人を区別できてるのかなw
281デフォルトの名無しさん
2023/08/11(金) 09:09:23.31ID:Y8RASnRQ Cの人のレスは複数に分かれて訂正もあって二つの比較がわかりにくいけど
Rustの人のレス>>272はdiff形式で一つのレスに書かれているから何と何を比較しているか一目瞭然でしょ
Rustの人のレス>>272はdiff形式で一つのレスに書かれているから何と何を比較しているか一目瞭然でしょ
282デフォルトの名無しさん
2023/08/11(金) 09:26:13.77ID:sVlBLJlv RustとRubyとMAUIをNGしてるやつは多いと思う
283デフォルトの名無しさん
2023/08/11(金) 09:34:13.85ID:YXKl/G3F 単語NG設定してるやつがそいつだけ重要なレスを読めていないことが原因で勘違いな書き込みを繰り返すパターンはよくあるよな
しかし今回のアホな>>276はNGしていないからレスしてるわけで単なるアホなパターンかと
しかし今回のアホな>>276はNGしていないからレスしてるわけで単なるアホなパターンかと
284デフォルトの名無しさん
2023/08/11(金) 15:23:23.45ID:Dz1zKJwc void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
if (num[i] == deleteNum) { // deleteNumで指定した要素を0にする
num[i] = 0;
}
}
}
void piyo(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
void hogera(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
↑を
{
for (int i = 0; i < n; i++) {
if (num[i] == deleteNum) { // deleteNumで指定した要素を0にする
num[i] = 0;
}
}
}
void piyo(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] -= deleteNum * (deleteNum == num[i]); // deleteNumで指定した要素を消す
}
}
void hogera(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
num[i] *= deleteNum != num[i]; // deleteNumで指定した要素を消す
}
}
↑を
285デフォルトの名無しさん
2023/08/11(金) 15:24:31.74ID:Dz1zKJwc #include <stdio.h>
#include <stdlib.h>
#include <time.h>
void __attribute__((noinline)) bench(const char* name, void (*func)(int, int[], int))
{
const int n = 100000000;
int* a = calloc(n, sizeof(int));
if (a) {
for (int i = 0; i < n; i++) {
a[i] = rand() % 2;
}
clock_t s = clock();
func(n, a, 0);
double t = (double)(clock() - s) / CLOCKS_PER_SEC;
printf("%s:\t%f\n", name, t);
free(a);
}
}
int main(void)
{
bench("hoge", hoge);
bench("piyo", piyo);
bench("hogera", hogera);
}
↑で測定した。
#include <stdlib.h>
#include <time.h>
void __attribute__((noinline)) bench(const char* name, void (*func)(int, int[], int))
{
const int n = 100000000;
int* a = calloc(n, sizeof(int));
if (a) {
for (int i = 0; i < n; i++) {
a[i] = rand() % 2;
}
clock_t s = clock();
func(n, a, 0);
double t = (double)(clock() - s) / CLOCKS_PER_SEC;
printf("%s:\t%f\n", name, t);
free(a);
}
}
int main(void)
{
bench("hoge", hoge);
bench("piyo", piyo);
bench("hogera", hogera);
}
↑で測定した。
286デフォルトの名無しさん
2023/08/11(金) 15:29:01.99ID:Dz1zKJwc gcc 12.2.0に-O2を指定
hoge: 0.279982
piyo: 0.059988
hogera: 0.051996
https://wandbox.org/permlink/cLGAj1OcfqmjdJeZ
clang 15.0.7に-O2を指定
hoge: 0.283996
piyo: 0.036019
hogera: 0.028001
https://wandbox.org/permlink/jEA3G3XMSKeCUKbZ
clang 15.0.7に-O2 -march=nativeを指定
hoge: 0.028001
piyo: 0.028001
hogera: 0.027980
https://wandbox.org/permlink/cMJSCT2nnvyhpSpD
hoge: 0.279982
piyo: 0.059988
hogera: 0.051996
https://wandbox.org/permlink/cLGAj1OcfqmjdJeZ
clang 15.0.7に-O2を指定
hoge: 0.283996
piyo: 0.036019
hogera: 0.028001
https://wandbox.org/permlink/jEA3G3XMSKeCUKbZ
clang 15.0.7に-O2 -march=nativeを指定
hoge: 0.028001
piyo: 0.028001
hogera: 0.027980
https://wandbox.org/permlink/cMJSCT2nnvyhpSpD
287デフォルトの名無しさん
2023/08/11(金) 15:40:51.42ID:Dz1zKJwc gccとclangの両方で最適化指示に-O2だけを指定した場合にhogeの結果が極端に悪いのは
・条件分岐命令が生成されている
・配列の内容をrand()で生成しているため分岐予測が外れまくる
ことが原因と思われる。
clangに-O2 -march=nativeを指定した場合にhogeの結果が他と変わらなくなったのは恐らくはAVX命令が使用され条件分岐がなくなったため。
試しに-O2 -mavx2を指定しても
hoge: 0.028001
piyo: 0.028002
hogera: 0.028002
https://wandbox.org/permlink/XqiQgGEs1BZJmpmp
変わらない結果となった。
・条件分岐命令が生成されている
・配列の内容をrand()で生成しているため分岐予測が外れまくる
ことが原因と思われる。
clangに-O2 -march=nativeを指定した場合にhogeの結果が他と変わらなくなったのは恐らくはAVX命令が使用され条件分岐がなくなったため。
試しに-O2 -mavx2を指定しても
hoge: 0.028001
piyo: 0.028002
hogera: 0.028002
https://wandbox.org/permlink/XqiQgGEs1BZJmpmp
変わらない結果となった。
288デフォルトの名無しさん
2023/08/11(金) 15:42:39.23ID:k/CU0rlR 別スレ立ててそこでやって
リンク貼っていいから
Qiitaと関係なくてスレチだし
元の記事はQiitaから削除されて存在しない
1つのテーマを掘り下げる目的がありそうだし
長くなりそう
リンク貼っていいから
Qiitaと関係なくてスレチだし
元の記事はQiitaから削除されて存在しない
1つのテーマを掘り下げる目的がありそうだし
長くなりそう
289デフォルトの名無しさん
2023/08/11(金) 22:03:23.82ID:n9doW6N2290デフォルトの名無しさん
2023/08/12(土) 02:16:01.85ID:MQtFcy0V 「なんでそんな書き方するの?」
「こっちのが速いから」
「へー、どれくらい?」
「100万回実行して数msかな」
「でもここ数回しか実行されないよ?」
「こっちのが速いから」
「へー、どれくらい?」
「100万回実行して数msかな」
「でもここ数回しか実行されないよ?」
291デフォルトの名無しさん
2023/08/12(土) 10:23:43.34ID:BDIecCFX 長々と空気読めないこと喋るやつおるよな
292デフォルトの名無しさん
2023/08/12(土) 10:28:09.42ID:w3tn+9YE >>289
if文を無くせる場合はどんな場合がある?
ifがあるなら無くせないんじゃないの?
その場合を見つけたとしてこのスレで発表する?
それともこのスレを出典にする?
このスレにリンクを貼らないとif文を使うと10倍遅くなることを証明できないから
if文を無くせる場合はどんな場合がある?
ifがあるなら無くせないんじゃないの?
その場合を見つけたとしてこのスレで発表する?
それともこのスレを出典にする?
このスレにリンクを貼らないとif文を使うと10倍遅くなることを証明できないから
293デフォルトの名無しさん
2023/08/12(土) 12:27:02.41ID:kvrjqk0I 常にこんな書き方をするべきとかではなくてスループットを上げたい場合に考えられる手段の一つ、くらいの話だと思うんだが顔真っ赤にして否定してる奴なんなの
294デフォルトの名無しさん
2023/08/12(土) 13:09:09.17ID:VjFL1AwM 処理系やプロセッサ依存のソースを書く時代は終わったんだよ顔真っ赤なおじいちゃん
何度も言われてるようにここじゃなくQiitaに記事書きなよw
何度も言われてるようにここじゃなくQiitaに記事書きなよw
295デフォルトの名無しさん
2023/08/12(土) 13:13:42.09ID:kvrjqk0I > 処理系やプロセッサ依存のソースを書く時代は終わったんだよ
組み込みとか念頭にない人は世の中が単純に見えて幸せそうですね。
組み込みとか念頭にない人は世の中が単純に見えて幸せそうですね。
296デフォルトの名無しさん
2023/08/12(土) 14:21:39.40ID:VjFL1AwM 組み込みの現場も知らない癖に何をイキッてるんだ無職くんはw
いいから記事を書きなよ
そしたらここで話題にしてもいいからさ
スレ違いってわかる?
いいから記事を書きなよ
そしたらここで話題にしてもいいからさ
スレ違いってわかる?
297デフォルトの名無しさん
2023/08/12(土) 16:29:25.06ID:QkMalqzA298デフォルトの名無しさん
2023/08/12(土) 16:53:18.46ID:wD60IGH3299デフォルトの名無しさん
2023/08/12(土) 16:55:33.58ID:dxjaE8PG プロセッサに依存していいならどう最適化されるか決まってないCよりアセンブラ使う方が確実だぞ
300デフォルトの名無しさん
2023/08/12(土) 17:42:26.72ID:LEE4+Uqf 終わった記事に関してウダウダと
そんなんだからいつまで経っても独り身なんだぞ
そんなんだからいつまで経っても独り身なんだぞ
301デフォルトの名無しさん
2023/08/12(土) 17:51:13.60ID:yNBhBfdR >>299
CMOV命令はintelにもamdにもあるから一般的な環境でプロセッサ依存ではないですよね
もしCMOVがない特殊な環境でも条件フラグをレジスタに入れる命令があればそれが使われて大丈夫ですね
gccとclangどちらでも速くなったようだからコンパイラ処理系依存のテクニックではなさそう
C言語だけでなくRustでも同じ生成コードとなったから言語に依存したテクニックでもなさそう
CMOV命令はintelにもamdにもあるから一般的な環境でプロセッサ依存ではないですよね
もしCMOVがない特殊な環境でも条件フラグをレジスタに入れる命令があればそれが使われて大丈夫ですね
gccとclangどちらでも速くなったようだからコンパイラ処理系依存のテクニックではなさそう
C言語だけでなくRustでも同じ生成コードとなったから言語に依存したテクニックでもなさそう
302デフォルトの名無しさん
2023/08/12(土) 18:39:13.58ID:mEHRZZZJ >>298
> if文を無くせる場合があるというのが253の記事
記事にあるif文を無くせる場合はこれ1つだけ
if (num==1) { num=0 } else { num=1 }
↓
num = !(bool)num
他の読者のために書いてあげる
機会が非常に少なくて残念!!
レスの後半部分は間違ってる
> if文を無くせる場合があるというのが253の記事
記事にあるif文を無くせる場合はこれ1つだけ
if (num==1) { num=0 } else { num=1 }
↓
num = !(bool)num
他の読者のために書いてあげる
機会が非常に少なくて残念!!
レスの後半部分は間違ってる
303デフォルトの名無しさん
2023/08/12(土) 18:45:47.87ID:mEHRZZZJ if文の高速化が検索したら
ifとswitchで迷ったらswitchを使う
IF K=6 THEN X=X+1→X=X-(K=6)
が出てきてif文の高速化は有名な話だったようだ
補足訂正
ifとswitchで迷ったらswitchを使う
IF K=6 THEN X=X+1→X=X-(K=6)
が出てきてif文の高速化は有名な話だったようだ
補足訂正
304デフォルトの名無しさん
2023/08/12(土) 19:08:27.81ID:dqIchbhY >>302
プログラムも読めないのか
そんなバカが必死に否定してたのか
記事以外にもこのスレで他のコード例やコンパイラによるその生成アセンブラも出ている
さらにベンチマーク比較で大きく速度向上まで結果が出ている
この状況で必死に否定し続けるのはみっともないぜ
プログラムも読めないのか
そんなバカが必死に否定してたのか
記事以外にもこのスレで他のコード例やコンパイラによるその生成アセンブラも出ている
さらにベンチマーク比較で大きく速度向上まで結果が出ている
この状況で必死に否定し続けるのはみっともないぜ
305デフォルトの名無しさん
2023/08/12(土) 22:28:25.82ID:TiqzNocE >>301
組み込みの意味がわからない人?w
組み込みの意味がわからない人?w
306デフォルトの名無しさん
2023/08/12(土) 23:03:51.71ID:dqIchbhY 記事読んでも組み込みなんて限定はないな
必死に否定してるバカが勝手に組み込みの話と思い込んでいるのか
必死に否定してるバカが勝手に組み込みの話と思い込んでいるのか
307デフォルトの名無しさん
2023/08/13(日) 00:15:07.75ID:NKbs7DmP なんでそんなに必死なのか知らんけどここまで言われても記事を書こうとしないのは自分が間違ってることを薄々でもわかってるんだろ?w
無理すんな無職
無理すんな無職
308デフォルトの名無しさん
2023/08/13(日) 01:15:32.46ID:qIH8AICq309デフォルトの名無しさん
2023/08/13(日) 10:23:41.63ID:427/I8XL > 記事を書こうとしないのは
日本の技術力の底上げのために
検索結果の健全化のために
クソ記事書くのはもうやめてクレメンス
お願いですから書くのやめてクレメンス
書かないことでみんなが助かる
書かないことでみんなが嬉しい
わかってクレメンス
クソ記事書いてはいけないと
正常な人間ははじめから知っているんです
日本の技術力の底上げのために
検索結果の健全化のために
クソ記事書くのはもうやめてクレメンス
お願いですから書くのやめてクレメンス
書かないことでみんなが助かる
書かないことでみんなが嬉しい
わかってクレメンス
クソ記事書いてはいけないと
正常な人間ははじめから知っているんです
310デフォルトの名無しさん
2023/08/13(日) 10:23:43.05ID:ea9tHaSQ 逃げたw
311デフォルトの名無しさん
2023/08/13(日) 12:06:02.55ID:mxfdwtiA クソ記事は批判して良いと思うが
クソ記事に対する批判がみんなのためになるのなら賛成
ただ暇でやってるだけならもうちょっと時間を有効に使えと言いたい
クソ記事に対する批判がみんなのためになるのなら賛成
ただ暇でやってるだけならもうちょっと時間を有効に使えと言いたい
312デフォルトの名無しさん
2023/08/13(日) 13:52:34.26ID:bmBefS74 if文をなくすのが高速化に繋がってると解釈してる人がいるようなので補足。
>>286の投稿でhogeの結果が極端に悪いのは条件分岐命令が生成されていることが原因だが条件分岐命令が生成されているのはif文を使用しているからではない。条件によってメモリへの書き込みが行われたり行われなかったりするロジックのためである。
試しにhoge()の実装を
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
int x = num[i];
if (x == deleteNum) { // deleteNumで指定した要素を0にする
x = 0;
}
num[i] = x;
}
}
内容が変わろうが変わるまいが常にメモリへの書き込みが行われるよう変更したらどうなるか。
>>286の投稿でhogeの結果が極端に悪いのは条件分岐命令が生成されていることが原因だが条件分岐命令が生成されているのはif文を使用しているからではない。条件によってメモリへの書き込みが行われたり行われなかったりするロジックのためである。
試しにhoge()の実装を
void hoge(int n, int num[n], int deleteNum)
{
for (int i = 0; i < n; i++) {
int x = num[i];
if (x == deleteNum) { // deleteNumで指定した要素を0にする
x = 0;
}
num[i] = x;
}
}
内容が変わろうが変わるまいが常にメモリへの書き込みが行われるよう変更したらどうなるか。
313デフォルトの名無しさん
2023/08/13(日) 13:57:12.40ID:bmBefS74 gcc 12.2.0に-O2を指定
hoge: 0.044001
piyo: 0.060001
hogera: 0.052001
https://wandbox.org/permlink/Na7RxYGEttdpuCnR
clang 15.0.7に-O2を指定
hoge: 0.032001
piyo: 0.032002
hogera: 0.031992
https://wandbox.org/permlink/1FZCQD2WsnbvifWw
hoge()の実行時間はpiyo()やhogera()と大差なくなる。
if文の使用がhoge()が遅かった原因ではない。
hoge: 0.044001
piyo: 0.060001
hogera: 0.052001
https://wandbox.org/permlink/Na7RxYGEttdpuCnR
clang 15.0.7に-O2を指定
hoge: 0.032001
piyo: 0.032002
hogera: 0.031992
https://wandbox.org/permlink/1FZCQD2WsnbvifWw
hoge()の実行時間はpiyo()やhogera()と大差なくなる。
if文の使用がhoge()が遅かった原因ではない。
314デフォルトの名無しさん
2023/08/13(日) 14:09:26.02ID:aL79QjVh Qiitaアカウント持ってないからここでウダウダコメントするしかない雑魚w
315デフォルトの名無しさん
2023/08/13(日) 14:28:13.37ID:xVDxBOfX316デフォルトの名無しさん
2023/08/13(日) 14:59:12.83ID:427/I8XL > Qiitaアカウント持ってない
つまりそれは
正常な思考力を持ってるってこと
つまりそれは
正常な思考力を持ってるってこと
317デフォルトの名無しさん
2023/08/13(日) 16:34:36.74ID:Z5uDnRRN Qiitaに日記を書くんじゃない
318デフォルトの名無しさん
2023/08/13(日) 16:43:33.83ID:Z5uDnRRN319デフォルトの名無しさん
2023/08/13(日) 16:56:52.28ID:427/I8XL > 不愉快
彼らに不愉快という概念はないぞ
クソを食い
クソを出し
周囲をクソまみれにしても
そのとき
むしろ笑顔だから
彼らに不愉快という概念はないぞ
クソを食い
クソを出し
周囲をクソまみれにしても
そのとき
むしろ笑顔だから
320デフォルトの名無しさん
2023/08/14(月) 05:02:03.98ID:flQ8vQku >>315
以前「キモッ」だけのコメントをQiitaでしたことあるが、運営から「削除しろ。しなければ垢バンまである」というメールがきたw
以前「キモッ」だけのコメントをQiitaでしたことあるが、運営から「削除しろ。しなければ垢バンまである」というメールがきたw
321デフォルトの名無しさん
2023/08/14(月) 10:45:24.67ID:5M9frLMH >>320
草
草
322デフォルトの名無しさん
2023/08/14(月) 10:59:15.20ID:K6AS1572 >>321
草で済まない
ここでも言うべきでない
開示請求して制裁するように日本社会が変化
法律上は不特定多数に言うのがアウト
ここの発言は必然的に不特定多数
どうしても言いたいなら少数の友人だけに言えばいい
草で済まない
ここでも言うべきでない
開示請求して制裁するように日本社会が変化
法律上は不特定多数に言うのがアウト
ここの発言は必然的に不特定多数
どうしても言いたいなら少数の友人だけに言えばいい
323デフォルトの名無しさん
2023/08/14(月) 11:55:14.49ID:ra8tFfd0324デフォルトの名無しさん
2023/08/14(月) 14:52:20.96ID:ZSYq0zux > 運営からメールが来るのは運営に不都合なことを書いた人だけだよ
運営に不都合関係なくユーザーからの報告がある程度以上あると運営からコメントを直せってメールくるよ。
若年者や女性が書いたという体(てい)の記事に絶賛のコメントが多数付いてるところに水差すようなコメント書いて運営からメール貰ったこと何回かあるわ。
運営に自分の投稿したコメントのどこが問題なのか尋ねても「多数の苦情が来てるのだからお前のコメントが悪い」と埒が明かぬ。運営が苦情の数を気にして機械的に対応してることは確かだと思われる。
運営に不都合関係なくユーザーからの報告がある程度以上あると運営からコメントを直せってメールくるよ。
若年者や女性が書いたという体(てい)の記事に絶賛のコメントが多数付いてるところに水差すようなコメント書いて運営からメール貰ったこと何回かあるわ。
運営に自分の投稿したコメントのどこが問題なのか尋ねても「多数の苦情が来てるのだからお前のコメントが悪い」と埒が明かぬ。運営が苦情の数を気にして機械的に対応してることは確かだと思われる。
325デフォルトの名無しさん
2023/08/15(火) 16:44:03.65ID:0AvN5XPe326デフォルトの名無しさん
2023/08/15(火) 17:06:16.32ID:TjAS9EkF327デフォルトの名無しさん
2023/08/15(火) 18:05:42.32ID:zL0242H+ 「なんで、for文ってforなの?」って、みんな思ったはず。
https://qiita.com/jin237/items/444688df1b6bfad3bd75
> 皆さまのありがたいお声の数々
> 叩かれ放題の記事となっております(笑)
> はてなブックマーク
> https://b.hatena.ne.jp/entry/s/qiita.com/jin237/items/444688df1b6bfad3bd75
> twitterでの記事の検索結果
> https://twitter.com/search?q=https%3A%2F%2Fqiita.com%2Fjin237%2Fitems%2F444688df1b6bfad3bd75
https://twitter.com/jin2372/status/1691061293107859457
> ・釣りタイトルにする。
> ・正解も不正解もある内容にする。
> ・叩き放題でマウント取れるものにする。
> ・文を下手にしてみる。
> ・タグの中で見られやすいものを選ぶ。
> ・別の場所にスレを作る。
> ・見られやすいトレンドにとりあえず載せる。
> 結果:プチ炎上できた。
https://twitter.com/5chan_nel (5ch newer account)
https://qiita.com/jin237/items/444688df1b6bfad3bd75
> 皆さまのありがたいお声の数々
> 叩かれ放題の記事となっております(笑)
> はてなブックマーク
> https://b.hatena.ne.jp/entry/s/qiita.com/jin237/items/444688df1b6bfad3bd75
> twitterでの記事の検索結果
> https://twitter.com/search?q=https%3A%2F%2Fqiita.com%2Fjin237%2Fitems%2F444688df1b6bfad3bd75
https://twitter.com/jin2372/status/1691061293107859457
> ・釣りタイトルにする。
> ・正解も不正解もある内容にする。
> ・叩き放題でマウント取れるものにする。
> ・文を下手にしてみる。
> ・タグの中で見られやすいものを選ぶ。
> ・別の場所にスレを作る。
> ・見られやすいトレンドにとりあえず載せる。
> 結果:プチ炎上できた。
https://twitter.com/5chan_nel (5ch newer account)
328デフォルトの名無しさん
2023/08/15(火) 18:38:37.81ID:ZksP2F0f 苦情の数の話はその人の体験談で話が具体的で信じられる
創作の可能性もあるがそこまで疑わないぞ
運営にメールで尋ねたなどの体験談はwelcomeで書いてほしい
welcomeなレスに騙されやすいなどとくだらない批判をいれるべきでない
何を言いたいかと言うと話の構造が根本的に違うだろと
創作の可能性もあるがそこまで疑わないぞ
運営にメールで尋ねたなどの体験談はwelcomeで書いてほしい
welcomeなレスに騙されやすいなどとくだらない批判をいれるべきでない
何を言いたいかと言うと話の構造が根本的に違うだろと
329デフォルトの名無しさん
2023/08/15(火) 18:46:26.63ID:ZksP2F0f330デフォルトの名無しさん
2023/08/15(火) 18:47:04.69ID:hWbexh2P331デフォルトの名無しさん
2023/08/15(火) 19:07:59.33ID:ZksP2F0f332デフォルトの名無しさん
2023/08/15(火) 19:09:41.51ID:ZzYADMsV と思いたいんだなw
だからやってみればわかると言ってるのにw
https://qiita.com/youwht
こいつが組織票でトレンドに載ってることをバラした記事があったのでこいつを通報したら逆にその記事が消えたのをどう説明するんだよw
だからやってみればわかると言ってるのにw
https://qiita.com/youwht
こいつが組織票でトレンドに載ってることをバラした記事があったのでこいつを通報したら逆にその記事が消えたのをどう説明するんだよw
333デフォルトの名無しさん
2023/08/15(火) 19:27:20.24ID:ZksP2F0f >>332
youwhtで前スレ1から3を検索したが1つもレスがない
話すまでもないというのがQiitaスレの共通認識
説明しようにも何を言ってるのかわからん
陰謀論って早く忘れたほうがいい
いつまでも引きずるのが精神衛生上良くない
起きたときにスレに投稿すべきだった
youwhtで前スレ1から3を検索したが1つもレスがない
話すまでもないというのがQiitaスレの共通認識
説明しようにも何を言ってるのかわからん
陰謀論って早く忘れたほうがいい
いつまでも引きずるのが精神衛生上良くない
起きたときにスレに投稿すべきだった
334デフォルトの名無しさん
2023/08/16(水) 08:17:39.47ID:L1EQEMLK >>333
他の記事やコメント含めてそれだけ徹底的に消されたってことだよw
一時期話題になってたから知ってるやつに聞けよ
こいつの組織票はえげつなかったぞ
なにせqiitaを読みもしないまるで関係ない職場の人間に大量にアカウント作らせて記事をアップすると同時にそいつらに一斉送信していいねさせてたことを自白してたからな
そのいいねの付き方があまりに不自然すぎることに気づいたやつが計測して記事にしたところ数日して削除されて今は痕跡も残ってない
こんな話はその辺にゴロゴロしてるが何せこんなふうに証拠隠滅してるからな
他の記事やコメント含めてそれだけ徹底的に消されたってことだよw
一時期話題になってたから知ってるやつに聞けよ
こいつの組織票はえげつなかったぞ
なにせqiitaを読みもしないまるで関係ない職場の人間に大量にアカウント作らせて記事をアップすると同時にそいつらに一斉送信していいねさせてたことを自白してたからな
そのいいねの付き方があまりに不自然すぎることに気づいたやつが計測して記事にしたところ数日して削除されて今は痕跡も残ってない
こんな話はその辺にゴロゴロしてるが何せこんなふうに証拠隠滅してるからな
335デフォルトの名無しさん
2023/08/16(水) 08:19:13.27ID:L1EQEMLK あとスレに関してはこのスレのできる前の出来事だから話題になってないのは当然だ
336デフォルトの名無しさん
2023/08/16(水) 08:26:56.16ID:L1EQEMLK https://www.google.com/search?q=youwht%20site%3Amegalodon.jp
魚拓にyouwhtが無いのも不思議だろ?
あれだけ人気記事書いて本も書いて人気ソフト作ってテレビにも出演してるのに一切アーカイブされてないんだぜ?
そんなことあり得ると思う?
答えは一つ
消したんだよ
魚拓にyouwhtが無いのも不思議だろ?
あれだけ人気記事書いて本も書いて人気ソフト作ってテレビにも出演してるのに一切アーカイブされてないんだぜ?
そんなことあり得ると思う?
答えは一つ
消したんだよ
337デフォルトの名無しさん
2023/08/16(水) 18:44:29.95ID:8EM0gubg > 魚拓にyouwhtが無いのも不思議だろ?
別に不思議はないなあ。
> あれだけ人気記事書いて本も書いて人気ソフト作ってテレビにも出演してるのに一切アーカイブされてないんだぜ?
> そんなことあり得ると思う?
魚拓取られるのってやらかした奴の証拠保全が目的だからなあ、人気記事たくさん書いてる人気者なら問題行動起こす可能性も低そうだし魚拓取られる機会もそうそうないんじゃないの。つか
> 答えは一つ
> 消したんだよ
妄想乙w
別に不思議はないなあ。
> あれだけ人気記事書いて本も書いて人気ソフト作ってテレビにも出演してるのに一切アーカイブされてないんだぜ?
> そんなことあり得ると思う?
魚拓取られるのってやらかした奴の証拠保全が目的だからなあ、人気記事たくさん書いてる人気者なら問題行動起こす可能性も低そうだし魚拓取られる機会もそうそうないんじゃないの。つか
> 答えは一つ
> 消したんだよ
妄想乙w
338デフォルトの名無しさん
2023/08/16(水) 18:55:47.22ID:8EM0gubg > こいつが組織票でトレンドに載ってることをバラした記事があったのでこいつを通報したら逆にその記事が消えたのをどう説明するんだよw
妄想記事が消された以外の解釈あるかな?
つかどこの誰が書いたか正しいかもわからん記事が「あった」というだけで通報って大分イカれてるぞ
妄想記事が消された以外の解釈あるかな?
つかどこの誰が書いたか正しいかもわからん記事が「あった」というだけで通報って大分イカれてるぞ
339デフォルトの名無しさん
2023/08/16(水) 18:56:47.72ID:cRvVyw2V そんなに発狂するなよw
正体がバレるぞw
正体がバレるぞw
340デフォルトの名無しさん
2023/08/16(水) 19:04:30.78ID:8EM0gubg > 正体がバレるぞw
妄想持ちならではのセリフw
妄想持ちならではのセリフw
341デフォルトの名無しさん
2023/08/17(木) 09:06:45.29ID:6LvfXp3I 妄想ブーメランで火消しに必死になってるのは本人なんだろうなあ
342デフォルトの名無しさん
2023/08/17(木) 09:27:37.89ID:vPTmktkt いつでも本人がいると思うのは都合が良すぎる
病気なんだろうなあ
精神病棟で隔離されてそう
病気なんだろうなあ
精神病棟で隔離されてそう
343デフォルトの名無しさん
2023/08/17(木) 09:30:01.29ID:vPTmktkt このスレ3人しかいない
344デフォルトの名無しさん
2023/08/17(木) 13:58:17.84ID:iq59CIRP まあこれだけ発狂してたらそりゃ本人かくらい言われるだろ
みんな知ってる事件なんだし
みんな知ってる事件なんだし
345デフォルトの名無しさん
2023/08/17(木) 13:59:32.09ID:iq59CIRP 精神病棟とか3人とか妄想がきっついな
こういうのって大概自分が言われなれてることを言うんだよな
こういうのって大概自分が言われなれてることを言うんだよな
346デフォルトの名無しさん
2023/08/18(金) 20:22:10.84ID:O8jCLexo カタカタ
|| ̄ Λ_Λ
||_(Д`; ) 「なに?このスレ・・・」
\⊂´ )
( ┳'
|| ̄ Λ_Λ
||_(Д`; ) 「なに?このスレ・・・」
\⊂´ )
( ┳'
347デフォルトの名無しさん
2023/08/19(土) 09:59:43.77ID:8IQY/lun qiitaのスレということがわかってないやつが病棟から常駐してるな
自説の主張を話題にしたいなら記事書けと何度も言われてるのに
自説の主張を話題にしたいなら記事書けと何度も言われてるのに
348デフォルトの名無しさん
2023/08/23(水) 21:43:18.69ID:xWiJzaGi ナイーブな再帰フィボナッチでマイクロベンチマーク
https://qiita.com/Nabetani/items/19ea2d3f8c18d862497f
> もともと
> https://qiita.com/fsdg-adachi_h/items/5feeda2ed19f879fdf9a
> という URL で公開されていた記事に
> > int の長さが処理系によって違うので公平じゃないかもしれません。
> > それと
> > > ネイティブコンパイルの優位性
> > とありますが、Go が Java に負けてますね。
> > int の長さの影響かもしれません。
> というコメントを書いたら、その記事は削除されて。
> 同じ方が、全く同じような内容で
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c
> という記事を公開されて。
> なぜか私はコメントできない(ブロックされてるのかな)ようなので、コメントで書きたかった追加情報に関する記事を書こうと思った。
まとめると、
・コメントしたらブロックされた
・コメントされたことをなかったことにしたいのか元記事は削除、同じ内容で再投稿
で、
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c
見に行ったらこっちも既に削除済みw 誰かコメントしたんだろうなw
新記事が↓らしい。
C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる
https://qiita.com/fsdg-adachi_h/items/74764a835be31c1e73c6
どうでもいい内容の記事だったけど、タイトルのC++はg++じゃね? 言語じゃなくて処理系の話してるよね? くらいは誰でも言いそうになると思う罠。
https://qiita.com/Nabetani/items/19ea2d3f8c18d862497f
> もともと
> https://qiita.com/fsdg-adachi_h/items/5feeda2ed19f879fdf9a
> という URL で公開されていた記事に
> > int の長さが処理系によって違うので公平じゃないかもしれません。
> > それと
> > > ネイティブコンパイルの優位性
> > とありますが、Go が Java に負けてますね。
> > int の長さの影響かもしれません。
> というコメントを書いたら、その記事は削除されて。
> 同じ方が、全く同じような内容で
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c
> という記事を公開されて。
> なぜか私はコメントできない(ブロックされてるのかな)ようなので、コメントで書きたかった追加情報に関する記事を書こうと思った。
まとめると、
・コメントしたらブロックされた
・コメントされたことをなかったことにしたいのか元記事は削除、同じ内容で再投稿
で、
> C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる - Qiita
> https://qiita.com/fsdg-adachi_h/items/c54135cf0a562019295c
見に行ったらこっちも既に削除済みw 誰かコメントしたんだろうなw
新記事が↓らしい。
C++ はどれくらい速いのか?:フィボナッチ数列の演算で比較してみる
https://qiita.com/fsdg-adachi_h/items/74764a835be31c1e73c6
どうでもいい内容の記事だったけど、タイトルのC++はg++じゃね? 言語じゃなくて処理系の話してるよね? くらいは誰でも言いそうになると思う罠。
349デフォルトの名無しさん
2023/08/23(水) 23:22:56.21ID:vW0JBYYG >>348
その最後の記事
CとRustで速さ約2倍は明らかにおかしいので
手元で実行してみたらCとRustは同じ速さとなった
CとRustのこの種のベンチマークで2倍差となったのを見たことがない
少なくとも今回のような類いのコードならば同じ速さとなっている
今回よほど何か特殊な環境下で実行計測しているのか
あるいは記事が間違っているのか
その最後の記事
CとRustで速さ約2倍は明らかにおかしいので
手元で実行してみたらCとRustは同じ速さとなった
CとRustのこの種のベンチマークで2倍差となったのを見たことがない
少なくとも今回のような類いのコードならば同じ速さとなっている
今回よほど何か特殊な環境下で実行計測しているのか
あるいは記事が間違っているのか
350デフォルトの名無しさん
2023/08/23(水) 23:47:17.93ID:7ZcdnLBa 間違ってない
(非線形)再帰に関してはgcc/g++の最適化が進んでいる
(非線形)再帰に関してはgcc/g++の最適化が進んでいる
351デフォルトの名無しさん
2023/08/23(水) 23:50:22.47ID:7ZcdnLBa GOに関してもtinygoを使えばLLVMの速度がでると思われる
352デフォルトの名無しさん
2023/08/23(水) 23:59:13.29ID:KHKtVRzu 実名だけでなく会社名も晒してるけど問題ないのか?
誰もレビューしてないのかしら
誰もレビューしてないのかしら
353デフォルトの名無しさん
2023/08/23(水) 23:59:14.64ID:vW0JBYYG >>350
やってみた
その指摘は正しいようだ
ただしこちらも正しいという結果になった
速さの結果
Rust = C (gcc) > C (clang)
これによりRustがLLVMに渡す前にその最適化しているっぽいな
やってみた
その指摘は正しいようだ
ただしこちらも正しいという結果になった
速さの結果
Rust = C (gcc) > C (clang)
これによりRustがLLVMに渡す前にその最適化しているっぽいな
354デフォルトの名無しさん
2023/08/24(木) 00:23:12.72ID:3T5NvKnH >>353
Rust=C(gcc)は再現しない
gcc 13.2.0
rustc 1.71.1
gcc -o fibonacci_c fibonacci.c -O2
time ./fibonacci_c
Result: 701408733
Time: 0.00069 seconds <-- time関数が別物(1/1000)
real 0m0.774s <--コマンド実時間
clang -o fibonacci_clang fibonacci.c -O2
time ./fibonacci_clang
Result: 701408733
Time: 0.00157 seconds
real 0m1.592s
rustc -C opt-level=2 -o fibonacci_rs fibonacci.rs
time ./fibonacci_rs
Result: 701408733
Time: 1.55644 seconds
real 0m1.641s
Rust=C(gcc)は再現しない
gcc 13.2.0
rustc 1.71.1
gcc -o fibonacci_c fibonacci.c -O2
time ./fibonacci_c
Result: 701408733
Time: 0.00069 seconds <-- time関数が別物(1/1000)
real 0m0.774s <--コマンド実時間
clang -o fibonacci_clang fibonacci.c -O2
time ./fibonacci_clang
Result: 701408733
Time: 0.00157 seconds
real 0m1.592s
rustc -C opt-level=2 -o fibonacci_rs fibonacci.rs
time ./fibonacci_rs
Result: 701408733
Time: 1.55644 seconds
real 0m1.641s
355デフォルトの名無しさん
2023/08/24(木) 00:39:14.97ID:3T5NvKnH GOROOT=... tinygo build -opt=2 -o fibonacci_tinygo
time ./fibonacci_tinygo
Result: 701408733
Time: 1.55111 seconds
real 0m1.626s
LLVM(Clang/Rust/tinygo)=1.55s
GCC=0.7s
以上
time ./fibonacci_tinygo
Result: 701408733
Time: 1.55111 seconds
real 0m1.626s
LLVM(Clang/Rust/tinygo)=1.55s
GCC=0.7s
以上
356デフォルトの名無しさん
2023/08/24(木) 04:19:18.96ID:ejJL7Sq0357デフォルトの名無しさん
2023/08/24(木) 08:31:12.59ID:jcLl4hPI こちらでも Rust(rustc)=C(gcc)>>>C(clang) となった
gccとrustcが同じ最適化をしてると思われる
確認のためLLVM IRを吐くrustcとclangでどのようにコードが異なるか調べてみた
まずclangによるLLVM IR生成
$ clang -S -emit-llvm -O2 -o fibonacci_cl.ll fibonacci.c
そのうちfibonacci()関数部分を抜粋すると以下のコードとなった
; Function Attrs: nounwind readnone uwtable
define dso_local i32 @fibonacci(i32 %0) local_unnamed_addr #0 {
%2 = icmp ult i32 %0, 2
br i1 %2, label %9, label %3
3: ; preds = %1
%4 = add nsw i32 %0, -2
%5 = tail call i32 @fibonacci(i32 %4)
%6 = add nsw i32 %0, -1
%7 = tail call i32 @fibonacci(i32 %6)
%8 = add nsw i32 %7, %5
ret i32 %8
9: ; preds = %1
ret i32 %0
}
元のCコードそのままでnが2未満すなわち0と1の時はそのまま返して
それ以外は fibonacci(n-2) + fibonacci(n-1) を返している
最適化をしていないのでclangがgccよりも遅いのはこれで納得
gccとrustcが同じ最適化をしてると思われる
確認のためLLVM IRを吐くrustcとclangでどのようにコードが異なるか調べてみた
まずclangによるLLVM IR生成
$ clang -S -emit-llvm -O2 -o fibonacci_cl.ll fibonacci.c
そのうちfibonacci()関数部分を抜粋すると以下のコードとなった
; Function Attrs: nounwind readnone uwtable
define dso_local i32 @fibonacci(i32 %0) local_unnamed_addr #0 {
%2 = icmp ult i32 %0, 2
br i1 %2, label %9, label %3
3: ; preds = %1
%4 = add nsw i32 %0, -2
%5 = tail call i32 @fibonacci(i32 %4)
%6 = add nsw i32 %0, -1
%7 = tail call i32 @fibonacci(i32 %6)
%8 = add nsw i32 %7, %5
ret i32 %8
9: ; preds = %1
ret i32 %0
}
元のCコードそのままでnが2未満すなわち0と1の時はそのまま返して
それ以外は fibonacci(n-2) + fibonacci(n-1) を返している
最適化をしていないのでclangがgccよりも遅いのはこれで納得
358デフォルトの名無しさん
2023/08/24(木) 08:33:36.30ID:jcLl4hPI 次に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()呼び出しが一つとなり最適化されている
$ 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()呼び出しが一つとなり最適化されている
359デフォルトの名無しさん
2023/08/24(木) 08:41:31.44ID:jcLl4hPI ちなみに>>358の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)の両者が最も速い」
見やすく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)の両者が最も速い」
360デフォルトの名無しさん
2023/08/24(木) 13:00:39.60ID:LKMQI7nB で、それぞれの実行時間は?
うちでは clangもrustcも>>358相当の.llを吐くけど実行したらgccより激遅い
うちでは clangもrustcも>>358相当の.llを吐くけど実行したらgccより激遅い
361デフォルトの名無しさん
2023/08/24(木) 13:10:33.06ID:LKMQI7nB https://godbolt.org/z/96ePGvT76
これがgccより激遅い
これがgccより激遅い
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 中国側が首相答弁の撤回要求、日本側拒否★3 [夜のけいちゃん★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★6 [BFU★]
- 債券・円・株「トリプル安」に…長期金利1.755%まで上昇、円は対ユーロで史上最安値 ★2 [蚤の市★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★6 [ぐれ★]
- 被爆者は「怒りが腹の底から湧いてくる」高市首相“非核三原則見直し報道”に被爆地で懸念や憤りの声《長崎》 [1ゲットロボ★]
- おこめ券 予算約9.5億円のうち約2.4億円が経費(そのうちJAに約1億円支払い) 東京・台東区 [Hitzeschleier★]
- 【立憲岡田】高市早苗、2021年岸田政権に「台湾有事は日本の有事か」と迫っていたwww★2 [237216734]
- 【悲報】ジャップメディア「高市早苗の発言があってもインバウンドは過去最高を更新しているんだが?」 [616817505]
- 【悲報】小野田紀美「何か気に入らないことがあったら威圧する国に依存するのはリスク」脱アメリカ宣言か [769931615]
- 「農家は貧しくない」農家の所得は2000万円😱関税や減反で手厚く守られてきた農家の実態 [993451824]
- ホテル業界、高市のせいで中国から大量キャンセル 「大変厳しい状態。一刻も早い収束を願います」 [271912485]
- んなり放題🍬のお🏡
