我想在一个简单的案例测试中使用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。