|
阅读:18回复:0
阻止过于激进的死代码消除
你写了一段C++代码,希望测试CPU的能耐:
int Main() { clock_t start, end; long long N = 1 << 20; int repeat_time = 100; float_type *data = new float_type[N]; double max_duration = 0.0; double sum_duration = 0.0; std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<float_type> dis(0.0, 300000.0); for (int time = 0; time < repeat_time; time++) { for (size_t i = 0; i < N; ++i) { data = dis(gen); } float_type max_element = -INFINITY; float_type sum = 0.0; start = clock(); for (int i = 0; i < N; i++) if (max_element < data) { max_element = data; } end = clock(); max_duration += (double) (end - start) / CLOCKS_PER_SEC; start = clock(); for (int i = 0; i < N; i++) sum += data; end = clock(); sum_duration += (double) (end - start) / CLOCKS_PER_SEC; if (sum < max_element) std::cout << "This is to prevent dead code.\n"; } std::cout << "N = " << N << "\n"; std::cout << "Avg Time Cost Of VecSum: " << sum_duration / repeat_time << " s\n"; std::cout << "Avg Time Cost Of VecMax: " << max_duration / repeat_time << " s\n"; return 0; } 那段标红的 If 语句看起来很奇怪,但如果把它注释掉, 版本稍高的 g++ 在开启 O3 后就会认为 max_element 和 sum 从未使用, 进而把两个 for 循环也忽略,计时结果也就一直都是0了。 优雅一些的做法是使用 volatile 关键字标记 sum 和 max_element, 也可以避免过于激进的死代码消除,得到你想要的计时结果。 关于 volatile 关键字,可以阅读下面的文档: volatile type qualifier - cppreference.com |
|