mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 08:16:06 +00:00

This patch fixes warnings and errors that come up when running the benchmarks as part of the test suite. It also adds the necessary Lit annotations to make it pass in various configurations and increases the portability of the benchmarks.
98 lines
2.6 KiB
C++
98 lines
2.6 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// UNSUPPORTED: c++03, c++11, c++14
|
|
|
|
#include "benchmark/benchmark.h"
|
|
#include "test_macros.h"
|
|
|
|
#include <mutex>
|
|
#include <sstream>
|
|
|
|
TEST_NOINLINE double istream_numbers();
|
|
|
|
double istream_numbers(std::locale* loc) {
|
|
const char* a[] = {"-6 69 -71 2.4882e-02 -100 101 -2.00005 5000000 -50000000",
|
|
"-25 71 7 -9.3262e+01 -100 101 -2.00005 5000000 -50000000",
|
|
"-14 53 46 -6.7026e-02 -100 101 -2.00005 5000000 -50000000"};
|
|
|
|
int a1, a2, a3, a4, a5, a6, a7;
|
|
double f1 = 0.0, f2 = 0.0, q = 0.0;
|
|
for (int i = 0; i < 3; i++) {
|
|
std::istringstream s(a[i]);
|
|
if (loc)
|
|
s.imbue(*loc);
|
|
s >> a1 >> a2 >> a3 >> f1 >> a4 >> a5 >> f2 >> a6 >> a7;
|
|
q += (a1 + a2 + a3 + a4 + a5 + a6 + a7 + f1 + f2) / 1000000;
|
|
}
|
|
return q;
|
|
}
|
|
|
|
struct LocaleSelector {
|
|
std::locale* imbue;
|
|
std::locale old;
|
|
static std::mutex mutex;
|
|
|
|
LocaleSelector(benchmark::State& state) {
|
|
std::lock_guard guard(mutex);
|
|
switch (state.range(0)) {
|
|
case 0: {
|
|
old = std::locale::global(std::locale::classic());
|
|
imbue = nullptr;
|
|
break;
|
|
}
|
|
case 1: {
|
|
old = std::locale::global(std::locale::classic());
|
|
thread_local std::locale loc("en_US.UTF-8");
|
|
imbue = &loc;
|
|
break;
|
|
}
|
|
case 2: {
|
|
old = std::locale::global(std::locale::classic());
|
|
static std::locale loc("en_US.UTF-8");
|
|
imbue = &loc;
|
|
break;
|
|
}
|
|
case 3: {
|
|
old = std::locale::global(std::locale("en_US.UTF-8"));
|
|
imbue = nullptr;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
~LocaleSelector() {
|
|
std::lock_guard guard(mutex);
|
|
std::locale::global(old);
|
|
}
|
|
};
|
|
|
|
std::mutex LocaleSelector::mutex;
|
|
|
|
static void BM_Istream_numbers(benchmark::State& state) {
|
|
LocaleSelector sel(state);
|
|
double i = 0;
|
|
while (state.KeepRunning())
|
|
benchmark::DoNotOptimize(i += istream_numbers(sel.imbue));
|
|
}
|
|
BENCHMARK(BM_Istream_numbers)->DenseRange(0, 3)->UseRealTime()->Threads(1)->ThreadPerCpu();
|
|
|
|
static void BM_Ostream_number(benchmark::State& state) {
|
|
LocaleSelector sel(state);
|
|
while (state.KeepRunning()) {
|
|
std::ostringstream ss;
|
|
if (sel.imbue)
|
|
ss.imbue(*sel.imbue);
|
|
ss << 0;
|
|
benchmark::DoNotOptimize(ss.str().c_str());
|
|
}
|
|
}
|
|
BENCHMARK(BM_Ostream_number)->DenseRange(0, 3)->UseRealTime()->Threads(1)->ThreadPerCpu();
|
|
|
|
BENCHMARK_MAIN();
|