GEODE-6957: Add simple logging benchmarks (#502)
* Log strings of various lengths and measure
* Measure file logging as well as console logging
This will be used to establish a baseline measurement we can compare against any future logging changes
Co-authored-by: Matthew Reddington <mreddington@pivotal.io>
diff --git a/cppcache/benchmark/CMakeLists.txt b/cppcache/benchmark/CMakeLists.txt
index 5461abe..146424e 100644
--- a/cppcache/benchmark/CMakeLists.txt
+++ b/cppcache/benchmark/CMakeLists.txt
@@ -16,6 +16,7 @@
add_executable(cpp-benchmark
main.cpp
GeodeHashBM.cpp
+ GeodeLoggingBM.cpp
)
target_link_libraries(cpp-benchmark
diff --git a/cppcache/benchmark/GeodeLoggingBM.cpp b/cppcache/benchmark/GeodeLoggingBM.cpp
new file mode 100644
index 0000000..ac49e31
--- /dev/null
+++ b/cppcache/benchmark/GeodeLoggingBM.cpp
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * http://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 <benchmark/benchmark.h>
+
+#include <array>
+
+#include <boost/filesystem.hpp>
+
+#include <geode/CacheableString.hpp>
+
+#include "geode/util/LogLevel.hpp"
+#include "util/Log.hpp"
+#include "util/string.hpp"
+
+using apache::geode::client::Log;
+using apache::geode::client::LogLevel;
+using apache::geode::client::to_utf16;
+using apache::geode::client::to_utf8;
+using apache::geode::client::internal::geode_hash;
+
+const int STRING_ARRAY_LENGTH = 3;
+
+int g_iteration = 0;
+
+std::array<const char*, STRING_ARRAY_LENGTH> logStrings{
+ "Short test string", "Slightly longer test string",
+ "Very long string: "
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+ "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"};
+
+void GeodeLogStrings(benchmark::State& state) {
+ int index = g_iteration++ % STRING_ARRAY_LENGTH;
+
+ for (auto _ : state) {
+ Log::debug(logStrings[index]);
+ }
+}
+
+void GeodeLogInts(benchmark::State& state) {
+ std::string intString(std::to_string(g_iteration++));
+ for (auto _ : state) {
+ Log::debug(intString.c_str());
+ }
+}
+
+void GeodeLogCombo(benchmark::State& state) {
+ g_iteration++;
+ std::string comboString = std::string(logStrings[g_iteration % 3]) + " " +
+ std::to_string(g_iteration);
+ for (auto _ : state) {
+ Log::debug(comboString.c_str());
+ }
+}
+
+template <void T(benchmark::State&)>
+void GeodeLogToConsole(benchmark::State& state) {
+ Log::setLogLevel(LogLevel::All);
+
+ T(state);
+
+ Log::close();
+}
+
+template <void T(benchmark::State&)>
+void GeodeLogToFile(benchmark::State& state) {
+ boost::filesystem::path sourcePath(__FILE__);
+ auto filename = std::string("geode_native_") + sourcePath.stem().string() +
+ std::to_string(__LINE__) + ".log";
+ boost::filesystem::path logPath(filename);
+
+ Log::init(LogLevel::All, filename.c_str());
+
+ T(state);
+
+ Log::close();
+
+ if (boost::filesystem::exists(logPath)) {
+ boost::filesystem::remove(logPath);
+ }
+}
+
+auto LogStringsToConsole = GeodeLogToConsole<GeodeLogStrings>;
+auto LogIntsToConsole = GeodeLogToConsole<GeodeLogInts>;
+auto LogComboToConsole = GeodeLogToConsole<GeodeLogCombo>;
+
+auto LogStringsToFile = GeodeLogToFile<GeodeLogStrings>;
+auto LogIntsToFile = GeodeLogToFile<GeodeLogInts>;
+auto LogComboToFile = GeodeLogToFile<GeodeLogCombo>;
+
+BENCHMARK(LogStringsToConsole)->Range(8, 8 << 10);
+BENCHMARK(LogIntsToConsole)->Range(8, 8 << 10);
+BENCHMARK(LogComboToConsole)->Range(8, 8 << 10);
+BENCHMARK(LogStringsToFile)->Range(8, 8 << 10);
+BENCHMARK(LogIntsToFile)->Range(8, 8 << 10);
+BENCHMARK(LogComboToFile)->Range(8, 8 << 10);
diff --git a/cppcache/src/CacheXmlParser.cpp b/cppcache/src/CacheXmlParser.cpp
index 8320171..ac9892d 100644
--- a/cppcache/src/CacheXmlParser.cpp
+++ b/cppcache/src/CacheXmlParser.cpp
@@ -361,12 +361,11 @@
}
void CacheXmlParser::fatalError(const xercesc::SAXParseException &exception) {
- using namespace xercesc;
- char *message = XMLString::transcode(exception.getMessage());
+ char *message = xercesc::XMLString::transcode(exception.getMessage());
LOGDEBUG("Fatal Error: \"%s\" at line: %ulld", message,
exception.getLineNumber());
auto ex = CacheXmlException(message);
- XMLString::release(&message);
+ xercesc::XMLString::release(&message);
throw ex;
}