From 854193071498f330b71083d7e06a7cd18e02a4cc Mon Sep 17 00:00:00 2001
From: Abseil Team <absl-team@google.com>
Date: Fri, 12 Apr 2024 05:50:16 -0700
Subject: log_benchmark: Add VLOG_IS_ON benchmark

PiperOrigin-RevId: 624149255
Change-Id: I74815463226adaf183af531b8d373782d20b2ef2
---
 absl/log/BUILD.bazel      |  1 +
 absl/log/log_benchmark.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/absl/log/BUILD.bazel b/absl/log/BUILD.bazel
index 0f172398..dd192a10 100644
--- a/absl/log/BUILD.bazel
+++ b/absl/log/BUILD.bazel
@@ -664,6 +664,7 @@ cc_test(
         ":log_entry",
         ":log_sink",
         ":log_sink_registry",
+        ":vlog_is_on",
         "//absl/base:core_headers",
         "//absl/base:log_severity",
         "//absl/flags:flag",
diff --git a/absl/log/log_benchmark.cc b/absl/log/log_benchmark.cc
index 45d9a5d6..60c0fd63 100644
--- a/absl/log/log_benchmark.cc
+++ b/absl/log/log_benchmark.cc
@@ -17,10 +17,12 @@
 #include "absl/flags/flag.h"
 #include "absl/log/check.h"
 #include "absl/log/globals.h"
+#include "absl/log/internal/flags.h"
 #include "absl/log/log.h"
 #include "absl/log/log_entry.h"
 #include "absl/log/log_sink.h"
 #include "absl/log/log_sink_registry.h"
+#include "absl/log/vlog_is_on.h"
 #include "benchmark/benchmark.h"
 
 namespace {
@@ -93,5 +95,70 @@ static void BM_EnabledLogOverhead(benchmark::State& state) {
 }
 BENCHMARK(BM_EnabledLogOverhead);
 
+static void BM_VlogIsOnOverhead(benchmark::State& state) {
+  // It would make sense to do this only when state.thread_index == 0,
+  // but thread_index is an int on some platforms (e.g. Android) and a
+  // function returning an int on others. So we just do it on all threads.
+  // TODO(b/152609127): set only if thread_index == 0.
+  absl::SetFlag(&FLAGS_v, 0);
+
+  while (state.KeepRunningBatch(10)) {
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 1
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 2
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 3
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 4
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 5
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 6
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 7
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 8
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 9
+    benchmark::DoNotOptimize(VLOG_IS_ON(0));  // 10
+  }
+}
+BENCHMARK(BM_VlogIsOnOverhead)->ThreadRange(1, 64);
+
+static void BM_VlogIsNotOnOverhead(benchmark::State& state) {
+  // It would make sense to do this only when state.thread_index == 0,
+  // but thread_index is an int on some platforms (e.g. Android) and a
+  // function returning an int on others. So we just do it on all threads.
+  // TODO(b/152609127): set only if thread_index == 0.
+  absl::SetFlag(&FLAGS_v, 0);
+
+  while (state.KeepRunningBatch(10)) {
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 1
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 2
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 3
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 4
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 5
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 6
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 7
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 8
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 9
+    benchmark::DoNotOptimize(VLOG_IS_ON(1));  // 10
+  }
+}
+BENCHMARK(BM_VlogIsNotOnOverhead)->ThreadRange(1, 64);
+
+static void BM_LogEveryNOverhead(benchmark::State& state) {
+  absl::ScopedStderrThreshold disable_stderr_logging(
+      absl::LogSeverityAtLeast::kInfinity);
+  absl::SetMinLogLevel(absl::LogSeverityAtLeast::kInfinity);
+  ABSL_ATTRIBUTE_UNUSED NullLogSink null_sink;
+
+  while (state.KeepRunningBatch(10)) {
+    LOG_EVERY_N_SEC(INFO, 10);
+    LOG_EVERY_N_SEC(INFO, 20);
+    LOG_EVERY_N_SEC(INFO, 30);
+    LOG_EVERY_N_SEC(INFO, 40);
+    LOG_EVERY_N_SEC(INFO, 50);
+    LOG_EVERY_N_SEC(INFO, 60);
+    LOG_EVERY_N_SEC(INFO, 70);
+    LOG_EVERY_N_SEC(INFO, 80);
+    LOG_EVERY_N_SEC(INFO, 90);
+    LOG_EVERY_N_SEC(INFO, 100);
+  }
+}
+BENCHMARK(BM_LogEveryNOverhead)->ThreadRange(1, 64);
+
 }  // namespace
 
-- 
cgit v1.2.3