如何在MSVC中保留未使用的微基准测试结果,如gcc的asm volatile(“”::“g”(ptr):“memory”)?

时间:2016-06-03 21:10:22

标签: c++ visual-c++ optimization benchmarking microbenchmark

我想在一个简单的案例测试中使用google benchmark函数如何对数据数组执行(为简单起见,假设它是一个正弦函数):

#include <vector>
#include <algorithm>
#include <random>
#include <cmath>
#include <functional>
#include <iostream>

static void escape(void * p) {
    asm volatile("" : : "g"(p) : "memory"); 
}

static void BM_sin_default(benchmark::State& state) {
  while (state.KeepRunning()) {
    state.PauseTiming();
    int data_size = state.range_x()
    double lower_bound = 0;
    double upper_bound = 1;
    std::random_device device;
    std::mt19937 engine(device());
    std::uniform_real_distribution<double> distribution(lower_bound,upper_bound);
    auto generator = std::bind(distribution, engine);
    std::vector<double> data(data_size);
    generate(begin(data), end(data), generator);
    state.ResumeTiming();
    for(auto & e : data) {    
        e = sin(e);
    }
    escape(&data);
}
BENCHMARK(BM_sin_default)->RangeMultiplier(2)->Range(8, 8<<20);

BENCHMARK_MAIN();

escape函数将阻止编译器优化掉写入它的代码,如here中所示。

MSVC不支持x64的内联汇编,即使它确实如此,也不支持如何移植它。

GNU C asm volatile("" : : "g"(p) : "memory");的MSVC x64模拟是什么?

我正在使用Visual Studio 2012。

0 个答案:

没有答案