Qiita 3 - キータぞ、来たぞ、キータだぞー

■ このスレッドは過去ログ倉庫に格納されています
2023/05/28(日) 09:56:01.47ID:twg6yDS4
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/
2023/07/23(日) 13:14:12.17ID:UQ8GpMFP
>>211
リーダブルコード「汎用的な名前を避ける」は?
valueやarg、fooなどの空虚な名前はできるだけさけるべきである
2023/07/23(日) 13:48:36.00ID:2fSUkmWu
>>212
いや、俺に聞くなよ
俺が記事書いてるわけじゃないんだから

記事主としてはリーダブルコードの「無駄な単語は捨てる」を実践してるんだろう
今回のケースが適切かどうか知らんけど
2023/07/23(日) 14:06:16.50ID:UQ8GpMFP
>>213
記事の読み方の違いだが記事の
> 「変に削るより、長くてもいいから正確な命名を」という言説をしばしば見るように感じますし、私も同意
は「無駄な単語は捨てる」の逆だと思った
リーダブルコードは短いほうがいいで記事は長くてもいい
日本人は英語ができないから正確に削れないということだろう
2023/07/23(日) 16:57:38.73ID:Ljmpzq1Q
>>210
> 絶対値で高さを変えるか相対値で高さを変えるかで意味ある

change〜 なんてアホなメソッド名やめて set〜 や add〜 とかにすればおk
2023/07/23(日) 20:38:42.33ID:KrEjITHo
> 今ほぼコードレビュー専になってる私が、リーダブルなコードを書くうえで意識してほしいと考えている順番

ハンパな知識のオッサンが若い人のコードに思いつきでダメ出ししてる光景が目に浮かぶんだけど。
2023/07/23(日) 21:02:45.58ID:lN+Odn9h
今回のは結論ありきのお題だから突っ込むのは野暮かもしれんが
>>215に完全同意。この場合get/setのほうが百倍マシ。
メソッド名がシンプルで、メソッドの内容がシンプルで、メソッド間の直行性が高い。

$myCar->changeHeightByRelativeMeter(1); ←きがくるっとる
$myCar->changeHeightByRelativeMeter(0.2); ←きがくるっとる

$myCar->setHeight(1); ←きがくるってない
$myCar->setHeight($myCar->getHeight() + 0.2) ←きがくるってない

説明的な変数名、メソッド名をつけなきゃいけないのは
散らかったウンコを片付けずに消臭剤いっぱい振りかけるのと同じ
2023/07/23(日) 21:41:55.47ID:x6Y2rIay
確かにsetHeight, addHeightのほうがいいな
2023/07/23(日) 22:22:44.58ID:2fSUkmWu
>>215
絶対値相対値とか言われてもピンとこないよね普通は
2023/07/24(月) 13:45:58.84ID:6+/dyhSU
そもそも高さって何なん?
車高のこと?
なんで車高を変えんの?
2023/07/24(月) 15:07:41.98ID:4CElhr6b
シャコタンは文化だから理解しない人もいるかもね
2023/07/24(月) 15:39:05.61ID:6QZoLF36
ま、ユーザーがロードカーの車高を下げても良いことは何もないんだけどね
カッコいいと感じる感性の持ち主の部族のことは知らん
2023/07/24(月) 21:51:54.02ID:ntDhAqp5
2つの封筒問題(封筒のパラドックス)
https://qiita.com/SaitoTsutomu/items/3079a88163153abf2ac2

数学っぽいこと書いてる雰囲気なデタラメ記事。

> ※ 本記事へのコメントはしないでください。コメントがあった場合、すべて削除依頼します。

書いた本人にも自覚はあるんだろうな。
2023/07/25(火) 05:43:25.14ID:09XXQ3/E
>>223
2つの封筒問題(金額仮定版)の答えが「分からない」が真だとして、
なんで2つの封筒問題(未開封版)の答えが「変わらない」なのかが分からない。

金額仮定版は2つの事象が1/2で発生するか分からないから、という説明なのに対し
未開封版は2つの事象が1/2で発生することを前提にしているの?
2023/07/25(火) 06:41:00.76ID:/3oiUHuE
数学っぽいとかなんで2つの封筒問題(未開封版)の答えが「変わらない」なのかが分からないとか
記事を開く気がしない
2023/07/25(火) 06:42:02.53ID:/3oiUHuE
なんで人はわからないものや数学っぽいものに惹かれるのか
227デフォルトの名無しさん
垢版 |
2023/07/26(水) 20:16:12.52ID:wSHYoxMZ
わからないものはわからない
2023/07/26(水) 21:41:05.02ID:1fb/10Y2
【検証してみた】株式会社ゆめみは、Organization対抗戦で不正をしているのか?
https://qiita.com/Yametaro/items/3988455d103d2408ea77

組織票は現状ルール違反ではないことを前提として書いてるんだろうけど
トレンドが全く役に立たなくなったし迷惑行為であることは認識して欲しいもんだわ。
2023/07/26(水) 21:47:14.30ID:lkScsrJu
いやいやそもそも御本尊のキー太がね
検索結果のど真ん中に野糞置く教えだから
230デフォルトの名無しさん
垢版 |
2023/07/26(水) 21:47:30.02ID:jPIzcFjy
詳しく読んでないけど、ベイズ推定にそんな説明あったね
2023/07/27(木) 09:48:07.83ID:B9bn33s7
>>223
無茶苦茶だな
これ本気で書いてんのか?
2023/07/27(木) 09:51:23.51ID:B9bn33s7
>>228
オーガニゼーション組織票問題はユーザーからは前から言われてることだけど運営は全く問題にしてないしむしろ推奨してるからな
トレンドが糞記事ばかりになるのは当然
2023/07/27(木) 11:58:29.93ID:FdKMOCta
QiitaはSEOに強かったからネットユーザーに認知されて参加するも
いいねが付かないことに悩み
オーガニゼーション(組織票)の存在に気づくのは1年以上後だろう
気づいたら参加モチベーションが下がる
不公平だからな
ほとんどのネットユーザーに認知され新規参加者がいなくなり組織に属さない人のモチベーションが下がったままで
全く上げようとしないのは問題かな
今後も組織参加者を増やすのかな
2023/07/27(木) 12:25:26.22ID:ORsGKxw3
スクール系組織票も野放し?
235デフォルトの名無しさん
垢版 |
2023/07/27(木) 17:43:34.41ID:+lXodmcm
ゆめみでゴミ記事書くやつは、片っ端からミュートしてるわ
2023/07/28(金) 10:49:42.57ID:Zgvcm9f5
>>233
advent calendar ってなんなん?
2023/07/28(金) 12:20:44.76ID:9v9DJg3O
>>205
今読んだけどこれほんま草
2023/08/03(木) 08:01:34.37ID:tyCIsm4X
2023/08/03(木) 19:59:51.90ID:JeF/zddW
CとC++って低水準言語なの?
https://qiita.com/takeyoshinitta/items/a646a80f170e31a8c075

Cは低水準言語であるという与太話を広めたい人の記事。
自分はそうは思わないと断りを入れつつ自説に都合の良い記事探してきて
主張するモチベーションはどこから来るのだろう?
2023/08/03(木) 20:28:59.91ID:8npqW66R
インラインアセンブラが可能なC/C++/Rustは低水準記述が可能な言語
2023/08/03(木) 21:01:12.75ID:MT8wuS4o
>>239
「犬が人を噛んでもニュースにならないが、人が犬を噛んだらニュースになる」が基本
Cは低水準言語でないという論文なら論文にならないが、Cは低水準言語であるという論文なら論文になる
Cは低水準言語でないというだけなら主張するモチベーションが起きないが、Cは低水準言語であるというなら主張するモチベーションが起きる
242デフォルトの名無しさん
垢版 |
2023/08/04(金) 00:34:27.45ID:AtJZBxCM
んちゃ
243デフォルトの名無しさん
垢版 |
2023/08/04(金) 09:05:52.31ID:XLfSEGlw
そもそも低水準は誤訳
低レイヤと考える方がしっくりくる
244デフォルトの名無しさん
垢版 |
2023/08/04(金) 21:08:44.67ID:zB3gh1Xb
>>239
消えてるが
2023/08/04(金) 22:33:31.82ID:kIOCwZVw
https://megalodon.jp/2023-0804-1704-11/https://qiita.com:443/takeyoshinitta/items/a646a80f170e31a8c075
> 私としてはこのムーブメントが拡大されCが段々と当たり前のように低水準として
> 扱われていることついて例をいくつか紹介し将来的にどうなるのかを含め議論を
> したいと思って投稿したつもりでCが低水準か高水準についてしっかりと議論
> したかったわけではないのですが、このような投稿は初めてでしたので、うまく
> 伝えることができなかったのだと反省しております。
> 私の投稿に対しての誤解を閲覧者が生んでしまうのは申し訳ないのですが、急に
> 投稿を削除してしまうのもこれまでコメントされた方に失礼だと思いますので、
> しばらく時間をおいてから本日中に投稿は削除させていただきます。

うまく伝わらなかったのなら議論重ねりゃいいだけだし削除する言い訳にもなってない罠。
要は旗色悪いから逃げたんだろう。
2023/08/04(金) 22:34:10.96ID:vnzxSr9F
消えてるからなんだよ
webアーカイブでも探せばいいだろ
2023/08/04(金) 22:38:44.38ID:kIOCwZVw
しっかしコメントしてきた相手に対して長いコメント返してるなあ、例外なく。
負けん気の強さは人一倍だが本人の知識や能力が追い付いてない感じw
2023/08/05(土) 07:04:06.19ID:GPQId3vN
このスレに貼り付けた人もそうだが削除させる意図があるように見える
削除させなくてもいいんじゃない?
もしかしたら削除させる意図がないと言うかもしれないが
もしそうなら言い方を気をつけるべきだね
削除させる意図があるように見えるから
2023/08/05(土) 07:26:06.29ID:MfBtPlYk
>>248
「削除させる意図があるように見える」のはどの書き込みで
「削除させる意図があるように見える」ことがなくなるようにするには
その書き込みをどのように変えればいいと言うんだろ
250デフォルトの名無しさん
垢版 |
2023/08/05(土) 07:26:57.96ID:nczC8/3G
>>246
Zuishinいいこと言うなー
2023/08/05(土) 10:09:31.04ID:BuM8hDNP
削除は本人の判断だけど

> それにしてもCが低水準言語であると思っている人の数が圧倒的に多くそのような記事が当たり前のようにあるので驚いたところです。

とまで書いてた本人が記事を削除する意図が分からんのよね。
2023/08/05(土) 13:04:09.35ID:G0xPWQV0
低水準の意味を間違って捉えてるんだろ
ハッカーと同じ
2023/08/08(火) 19:36:07.20ID:bRo0TWoK
C言語における「bool型へのキャスト」が無限の(悪用)可能性を秘めている理由
https://webcache.googleusercontent.com/search?q=cache:ED5C8TAFrNYJ:https://qiita.com/wantun/items/4574049283e1cd7d50cf

程度低い記事だなあ、これはツッコまれるの不可避だわと思っていたら消えていた。
2023/08/08(火) 19:38:50.29ID:bRo0TWoK
「いいね」も付いてたし指摘された誤りは修正すれば消さんでも良かったんじゃないのとは思う。

己に対して完璧以外許さない性格かな。
2023/08/10(木) 10:14:42.42ID:P5HupFIS
誤り以前にboolに変換して掛け算するのはどうなのよ
2023/08/10(木) 10:17:08.67ID:P5HupFIS
C言語ならまだギリギリ許されることもあるけどセマンティクス的に汚いし他の言語だとNGだから積極的に学ぶ方法でもない
読みにくくなるだけでなくコーディング量もそれほど変わらない上に速度すら落ちてるから
2023/08/10(木) 10:19:04.97ID:P5HupFIS
あとデータが1と0に限定されるから拡張性にも欠ける
後で2を使いたくなった時に全コード見直す必要が出てくる
2023/08/10(木) 14:12:42.71ID:UgpRJI2F
キャスト使えばこういう悪事もできるよ(良い子は真似しないでね)という記事なんだから、掛け算以外の指摘に関しては論点ではない
2023/08/10(木) 14:15:03.93ID:4HGAEGv7
C言語だと別に悪事というほどではない
ひたすら汚いだけ
2023/08/10(木) 16:12:44.88ID:RFVZcdoC
>>253
考え自体は正しい
条件分岐はパイプラインを乱す
条件分岐とならないコードが生成されることが望ましい

しかし多くのケースではコンパイラのコード生成に任せることができる
今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう
ソースコードの可読性からもif文のままが好ましい

ただしもっと複雑なケースで複数の条件分岐をなくして演算のみにできる場合もある
そしてコンパイラ任せではそのようなコード生成が無理な場合もある
その場合はベンチ測定比較すれば有意な差が出るためそれは正しい判断となる
2023/08/10(木) 19:42:46.48ID:c2H9n5TK
> しかし多くのケースではコンパイラのコード生成に任せることができる
> 今回のケースならばif文のままでも条件ムーブ(CMOVcc)命令などが生成され条件分岐とならないだろう
> ソースコードの可読性からもif文のままが好ましい

なにやら知ったようなことを言ってるので検証してみるとするか。
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
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命令吐いてる
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
2023/08/10(木) 19:51:41.79ID:UyoKACkM
したがって>>253の記事は全面的に正しい
bool値を数値演算として使うことを積極的に推奨する
2023/08/10(木) 19:57:21.15ID:c2H9n5TK
> したがって>>253の記事は全面的に正しい

boolへのキャストなんてしねーよ馬鹿か
267デフォルトの名無しさん
垢版 |
2023/08/10(木) 20:01:44.72ID:s1ImWQTP
>>256
数学に出てくるクロネッカーのデルタみたいなもので汚くはないし、型に厳しい言語でなければ他の言語でも使えるだろ。
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
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
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
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
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
2023/08/10(木) 22:05:03.94ID:4Znn5xIX
つまりC言語もRustもどちらも同じく
if文の時は普通に条件分岐する
比較値を自己掛け算させるとcmoveを使う

生成コードで掛け算が消えてしまうのはいいね
代わりにやってることは
(1) レジスタの値にメモリから読み込む
(2) 比較
(3) 一致していた時のみレジスタに値0を入れる 【cmove】
(4) レジスタの値をメモリへ書き戻す

条件分岐がない代わりに0にしない時も常に書き込みが発生する
ただし読み込んだ位置への書き込みだから
1サイクルのみでキャッシュページミスのペナルティも無くて済むから問題なしか

一方で元の条件分岐ジャンプするコードと比較して速さはどうなの?
分岐予測ミスやパイプラインの乱れとやらがどれだけ効くのか教えて欲しい
2023/08/10(木) 22:05:48.11ID:MwGz91pK
何度訂正されても暑さでやられたやつが発狂してるようにしか見えんからもういいぞ
どうしても主張したいなら記事書けよ
2023/08/10(木) 22:36:14.41ID:4Znn5xIX
訂正してる人はコピペミスか実験かどちらかで二重ループになってしまったのを訂正してるっぽいけどよくわからん

アドバイスできることは
clangの方で-O2だとベクタ展開して比較わかりにくくなってるのを
-Os指定すれば展開がなくなりgccとほぼ同じコードになるよ
2023/08/11(金) 06:16:54.95ID:YfwUjgK1
>>273
元の条件分岐ジャンプするコードと比較して速さはどうなの?と聞いてるが
元のコードが何か分からないし
比較対象のコードが何か分からない
元のコードと比較対象のコードは何?
2023/08/11(金) 08:15:21.50ID:jaK9CZIt
if文を使ったコードと使わないコードの2種類が示されている状況で
何と何を比較しているのかわからないのは深刻な脳のバグだよw
2023/08/11(金) 08:34:14.26ID:YfwUjgK1
>>277
暗号解読の趣味はない
そもそも1レス内で完結してるの?
暗号みたいなレスだから他のレスは全く読まない
2023/08/11(金) 08:59:40.37ID:WAWJg8ep
発狂してる俺様のレスを追いかけて全部読めとかいう頭のバグったやつ
2023/08/11(金) 09:03:31.51ID:YfwUjgK1
本人が気づいてない可能性があるからボランティアで教えてあげている
君の文章では他の人間は全く理解できないと
そもそも自分と他人を区別できてるのかなw
2023/08/11(金) 09:09:23.31ID:Y8RASnRQ
Cの人のレスは複数に分かれて訂正もあって二つの比較がわかりにくいけど
Rustの人のレス>>272はdiff形式で一つのレスに書かれているから何と何を比較しているか一目瞭然でしょ
2023/08/11(金) 09:26:13.77ID:sVlBLJlv
RustとRubyとMAUIをNGしてるやつは多いと思う
2023/08/11(金) 09:34:13.85ID:YXKl/G3F
単語NG設定してるやつがそいつだけ重要なレスを読めていないことが原因で勘違いな書き込みを繰り返すパターンはよくあるよな
しかし今回のアホな>>276はNGしていないからレスしてるわけで単なるアホなパターンかと
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で指定した要素を消す
  }
}

↑を
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);
}

↑で測定した。
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
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

変わらない結果となった。
2023/08/11(金) 15:42:39.23ID:k/CU0rlR
別スレ立ててそこでやって
リンク貼っていいから

Qiitaと関係なくてスレチだし
元の記事はQiitaから削除されて存在しない
1つのテーマを掘り下げる目的がありそうだし
長くなりそう
2023/08/11(金) 22:03:23.82ID:n9doW6N2
>>286
if文を使うと10倍遅くなるのが衝撃的だ
今後はif文を無くせる場合は無くそうと思う
if文の中で代入してるだけならコンパイラが頑張ってcmoveを使って分岐を避けてくれればいいのにね
290デフォルトの名無しさん
垢版 |
2023/08/12(土) 02:16:01.85ID:MQtFcy0V
「なんでそんな書き方するの?」
「こっちのが速いから」
「へー、どれくらい?」
「100万回実行して数msかな」
「でもここ数回しか実行されないよ?」
2023/08/12(土) 10:23:43.34ID:BDIecCFX
長々と空気読めないこと喋るやつおるよな
2023/08/12(土) 10:28:09.42ID:w3tn+9YE
>>289
if文を無くせる場合はどんな場合がある?
ifがあるなら無くせないんじゃないの?
その場合を見つけたとしてこのスレで発表する?
それともこのスレを出典にする?
このスレにリンクを貼らないとif文を使うと10倍遅くなることを証明できないから
2023/08/12(土) 12:27:02.41ID:kvrjqk0I
常にこんな書き方をするべきとかではなくてスループットを上げたい場合に考えられる手段の一つ、くらいの話だと思うんだが顔真っ赤にして否定してる奴なんなの
2023/08/12(土) 13:09:09.17ID:VjFL1AwM
処理系やプロセッサ依存のソースを書く時代は終わったんだよ顔真っ赤なおじいちゃん
何度も言われてるようにここじゃなくQiitaに記事書きなよw
2023/08/12(土) 13:13:42.09ID:kvrjqk0I
> 処理系やプロセッサ依存のソースを書く時代は終わったんだよ

組み込みとか念頭にない人は世の中が単純に見えて幸せそうですね。
2023/08/12(土) 14:21:39.40ID:VjFL1AwM
組み込みの現場も知らない癖に何をイキッてるんだ無職くんはw
いいから記事を書きなよ
そしたらここで話題にしてもいいからさ
スレ違いってわかる?
2023/08/12(土) 16:29:25.06ID:QkMalqzA
https://qiita.com/kazukichi/items/281a86a1d53117b2a583
金持ち喧嘩せず
2023/08/12(土) 16:53:18.46ID:wD60IGH3
>>292
if文を無くせる場合があるというのが>>253の記事
そしてif文を無くした方が10倍速くなる場合を示してくれたのが>>286の測定

何がトレードオフになっているかというと
if文があるとCPUは条件分岐によるパイプラインの乱れのペナルティを喰らう
if文がないとCPUは条件に関わらず同じ命令群を実行する (=条件の片方では無意味なことをする可能性がある)

したがってif文を無くせる場合はまず大雑把に言うとif文の(条件部ではなく)実行部がある程度短く実行サイクルも短いこと
例えば軽い数値の演算やその代入などならばif文を無くせる場合に合致することが多いだろう
2023/08/12(土) 16:55:33.58ID:dxjaE8PG
プロセッサに依存していいならどう最適化されるか決まってないCよりアセンブラ使う方が確実だぞ
2023/08/12(土) 17:42:26.72ID:LEE4+Uqf
終わった記事に関してウダウダと
そんなんだからいつまで経っても独り身なんだぞ
2023/08/12(土) 17:51:13.60ID:yNBhBfdR
>>299
CMOV命令はintelにもamdにもあるから一般的な環境でプロセッサ依存ではないですよね
もしCMOVがない特殊な環境でも条件フラグをレジスタに入れる命令があればそれが使われて大丈夫ですね

gccとclangどちらでも速くなったようだからコンパイラ処理系依存のテクニックではなさそう
C言語だけでなくRustでも同じ生成コードとなったから言語に依存したテクニックでもなさそう
2023/08/12(土) 18:39:13.58ID:mEHRZZZJ
>>298
> if文を無くせる場合があるというのが253の記事
記事にあるif文を無くせる場合はこれ1つだけ
if (num==1) { num=0 } else { num=1 }

num = !(bool)num
他の読者のために書いてあげる
機会が非常に少なくて残念!!
レスの後半部分は間違ってる
2023/08/12(土) 18:45:47.87ID:mEHRZZZJ
if文の高速化が検索したら
ifとswitchで迷ったらswitchを使う
IF K=6 THEN X=X+1→X=X-(K=6)
が出てきてif文の高速化は有名な話だったようだ
補足訂正
2023/08/12(土) 19:08:27.81ID:dqIchbhY
>>302
プログラムも読めないのか
そんなバカが必死に否定してたのか
記事以外にもこのスレで他のコード例やコンパイラによるその生成アセンブラも出ている
さらにベンチマーク比較で大きく速度向上まで結果が出ている
この状況で必死に否定し続けるのはみっともないぜ
2023/08/12(土) 22:28:25.82ID:TiqzNocE
>>301
組み込みの意味がわからない人?w
2023/08/12(土) 23:03:51.71ID:dqIchbhY
記事読んでも組み込みなんて限定はないな
必死に否定してるバカが勝手に組み込みの話と思い込んでいるのか
2023/08/13(日) 00:15:07.75ID:NKbs7DmP
なんでそんなに必死なのか知らんけどここまで言われても記事を書こうとしないのは自分が間違ってることを薄々でもわかってるんだろ?w
無理すんな無職
2023/08/13(日) 01:15:32.46ID:qIH8AICq
>>307
if文を無くす高速化の話は昔から有名かつ実用なので記事なんていくらでもあるよ
自分で検索してごらん
2023/08/13(日) 10:23:41.63ID:427/I8XL
> 記事を書こうとしないのは

日本の技術力の底上げのために
検索結果の健全化のために

クソ記事書くのはもうやめてクレメンス
お願いですから書くのやめてクレメンス
書かないことでみんなが助かる
書かないことでみんなが嬉しい

わかってクレメンス

クソ記事書いてはいけないと
正常な人間ははじめから知っているんです
2023/08/13(日) 10:23:43.05ID:ea9tHaSQ
逃げたw
311デフォルトの名無しさん
垢版 |
2023/08/13(日) 12:06:02.55ID:mxfdwtiA
クソ記事は批判して良いと思うが
クソ記事に対する批判がみんなのためになるのなら賛成
ただ暇でやってるだけならもうちょっと時間を有効に使えと言いたい
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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