Clang 在 Windows 上的性能优于 MSVC

Mr.*_*.Ly 5 clang compiler-optimization visual-c++

由 clang 编译的 c++ 代码比由 MSVC 编译的相同代码运行速度要快得多。我检查了 ASM 代码,发现 clang 自动使用 SIMD 指令来提高速度。所以我使用AVX Intrinsics代码重写了主要计算部分。尽管如此,Clang 编译的程序还是获得了 10% 的速度优势。Clang 在 Windows 上的性能比 MSVC 更好,这是常识吗?或者是我漏掉了MSVC的一些重要的优化配置。

我测试过这些代码:

static __inline int RGBToY(unsigned char r, unsigned char g, unsigned char b) {
  return (66 * r + 129 * g + 25 * b + 0x1080) >> 8;
}

void ToYRow_C(const unsigned char* src_argb0, unsigned char* dst_y, int width) {
  int x;
  for (x = 0; x < width; ++x) {
    dst_y[0] = RGBToY(src_argb0[2], src_argb0[1], src_argb0[0]);
    src_argb0 += 3;
    dst_y += 1;
  }
}
Run Code Online (Sandbox Code Playgroud)

Clang 的编译标志:-O2 -mavx2,MSVC 的编译标志:/O2 /arch:AVX2。在 clang 编译的程序上处理 2560x1440 图像需要 1.2 毫秒,在 MSVC 编译的程序上处理 4.2 毫秒。

Ofe*_*lon 1

看来 MSVC 对循环结构的变化和归纳变量增量的预期形式高度敏感。我在这里提出了一个问题,也许有些事情可以改变。

[编辑:] 如果你以某种方式将 src_argb0 分成 3 个输入流,MSVC 会更好地处理它:

static __inline int RGBToY(unsigned char r, 
                           unsigned char g, 
                           unsigned char b) {
  return (66 * r + 129 * g + 25 * b + 0x1080) >> 8;
}

void ToYRow_C(const unsigned char* srcr,
              const unsigned char* srcg,
              const unsigned char* srcb, 
              unsigned char* dst_y, 
              int width) {
  for (int x = 0; x < width; ++x) {
    dst_y[x] = RGBToY(srcr[x], srcg[x], srcb[x]);
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以在此 godbolt中比较 MSVC 和 clang 的生成代码。