[過去ログ] Qiita 3 - キータぞ、来たぞ、キータだぞー (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
284: デフォルトの名無しさん [sage] 2023/08/11(金) 15:23:23.45 ID:Dz1zKJwc(1/4) AAS
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で指定した要素を消す
  }
}

↑を
285: デフォルトの名無しさん [sage] 2023/08/11(金) 15:24:31.74 ID:Dz1zKJwc(2/4) AAS
#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);
}

↑で測定した。
286
(3): デフォルトの名無しさん [sage] 2023/08/11(金) 15:29:01.99 ID:Dz1zKJwc(3/4) AAS
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
287: デフォルトの名無しさん [sage] 2023/08/11(金) 15:40:51.42 ID:Dz1zKJwc(4/4) AAS
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

変わらない結果となった。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.288s