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 毫秒。
看来 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 的生成代码。
| 归档时间: |
|
| 查看次数: |
2767 次 |
| 最近记录: |