Abseil Common Libraries (C++) (grcp 依赖)
https://abseil.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.4 KiB
77 lines
2.4 KiB
// Copyright 2017 Google Inc. All Rights Reserved. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// https://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
|
|
#include "absl/random/internal/nanobenchmark.h" |
|
|
|
#include "absl/base/internal/raw_logging.h" |
|
#include "absl/strings/numbers.h" |
|
|
|
namespace absl { |
|
ABSL_NAMESPACE_BEGIN |
|
namespace random_internal_nanobenchmark { |
|
namespace { |
|
|
|
uint64_t Div(const void*, FuncInput in) { |
|
// Here we're measuring the throughput because benchmark invocations are |
|
// independent. |
|
const int64_t d1 = 0xFFFFFFFFFFll / int64_t(in); // IDIV |
|
return d1; |
|
} |
|
|
|
template <size_t N> |
|
void MeasureDiv(const FuncInput (&inputs)[N]) { |
|
Result results[N]; |
|
Params params; |
|
params.max_evals = 6; // avoid test timeout |
|
const size_t num_results = Measure(&Div, nullptr, inputs, N, results, params); |
|
if (num_results == 0) { |
|
ABSL_RAW_LOG( |
|
WARNING, |
|
"WARNING: Measurement failed, should not happen when using " |
|
"PinThreadToCPU unless the region to measure takes > 1 second.\n"); |
|
return; |
|
} |
|
for (size_t i = 0; i < num_results; ++i) { |
|
ABSL_RAW_LOG(INFO, "%5zu: %6.2f ticks; MAD=%4.2f%%\n", results[i].input, |
|
results[i].ticks, results[i].variability * 100.0); |
|
ABSL_RAW_CHECK(results[i].ticks != 0.0f, "Zero duration"); |
|
} |
|
} |
|
|
|
void RunAll(const int argc, char* argv[]) { |
|
// Avoid migrating between cores - important on multi-socket systems. |
|
int cpu = -1; |
|
if (argc == 2) { |
|
if (!absl::SimpleAtoi(argv[1], &cpu)) { |
|
ABSL_RAW_LOG(FATAL, "The optional argument must be a CPU number >= 0.\n"); |
|
} |
|
} |
|
PinThreadToCPU(cpu); |
|
|
|
// unpredictable == 1 but the compiler doesn't know that. |
|
const FuncInput unpredictable = argc != 999; |
|
static const FuncInput inputs[] = {unpredictable * 10, unpredictable * 100}; |
|
|
|
MeasureDiv(inputs); |
|
} |
|
|
|
} // namespace |
|
} // namespace random_internal_nanobenchmark |
|
ABSL_NAMESPACE_END |
|
} // namespace absl |
|
|
|
int main(int argc, char* argv[]) { |
|
absl::random_internal_nanobenchmark::RunAll(argc, argv); |
|
return 0; |
|
}
|
|
|