summaryrefslogtreecommitdiff
path: root/libs/tdlib/td/benchmark/bench_log.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/tdlib/td/benchmark/bench_log.cpp')
-rw-r--r--libs/tdlib/td/benchmark/bench_log.cpp163
1 files changed, 163 insertions, 0 deletions
diff --git a/libs/tdlib/td/benchmark/bench_log.cpp b/libs/tdlib/td/benchmark/bench_log.cpp
new file mode 100644
index 0000000000..a57b1b9b42
--- /dev/null
+++ b/libs/tdlib/td/benchmark/bench_log.cpp
@@ -0,0 +1,163 @@
+//
+// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+#include "td/utils/benchmark.h"
+#include "td/utils/logging.h"
+
+#include <cstdio>
+#include <fstream>
+#include <iostream>
+#include <mutex>
+#include <ostream>
+#include <streambuf>
+#include <string>
+
+#include <unistd.h>
+
+std::string create_tmp_file() {
+#if TD_ANDROID
+ std::string name = "/data/local/tmp/large_file.txt";
+ unlink(name.c_str());
+ return name;
+#else
+ char file_name[] = "largefileXXXXXX";
+ int fd = mkstemp(file_name);
+ if (fd == -1) {
+ perror("Can't cretate temporary file");
+ }
+ CHECK(fd != -1);
+
+ close(fd);
+ return file_name;
+#endif
+}
+
+class IostreamWriteBench : public td::Benchmark {
+ protected:
+ std::string file_name_;
+ std::ofstream stream;
+ enum { buffer_size = 1 << 20 };
+ char buffer[buffer_size];
+
+ public:
+ std::string get_description() const override {
+ return "ostream (to file, no buf, no flush)";
+ }
+
+ void start_up() override {
+ file_name_ = create_tmp_file();
+ stream.open(file_name_.c_str());
+ CHECK(stream.is_open());
+ // stream.rdbuf()->pubsetbuf(buffer, buffer_size);
+ }
+
+ void run(int n) override {
+ for (int i = 0; i < n; i++) {
+ stream << "This is just for test" << 987654321 << '\n';
+ }
+ }
+
+ void tear_down() override {
+ stream.close();
+ unlink(file_name_.c_str());
+ }
+};
+
+class FILEWriteBench : public td::Benchmark {
+ protected:
+ std::string file_name_;
+ FILE *file;
+ enum { buffer_size = 1 << 20 };
+ char buffer[buffer_size];
+
+ public:
+ std::string get_description() const override {
+ return "std::fprintf (to file, no buf, no flush)";
+ }
+
+ void start_up() override {
+ file_name_ = create_tmp_file();
+ file = fopen(file_name_.c_str(), "w");
+ // setvbuf(file, buffer, _IOFBF, buffer_size);
+ }
+
+ void run(int n) override {
+ for (int i = 0; i < n; i++) {
+ std::fprintf(file, "This is just for test%d\n", 987654321);
+ // std::fflush(file);
+ }
+ }
+
+ void tear_down() override {
+ std::fclose(file);
+ unlink(file_name_.c_str());
+ }
+};
+
+#if TD_ANDROID
+#include <android/log.h>
+#define ALOG(...) __android_log_print(ANDROID_LOG_VERBOSE, "XXX", __VA_ARGS__)
+class ALogWriteBench : public td::Benchmark {
+ public:
+ std::string get_description() const override {
+ return "android_log";
+ }
+ void start_up() override {
+ }
+ void run(int n) override {
+ for (int i = 0; i < n; i++) {
+ ALOG("This is just for test%d\n", 987654321);
+ }
+ }
+ void tear_down() override {
+ }
+};
+#endif
+
+class LogWriteBench : public td::Benchmark {
+ protected:
+ std::string file_name_;
+ std::ofstream stream;
+ std::streambuf *old_buf;
+ enum { buffer_size = 1 << 20 };
+ char buffer[buffer_size];
+
+ public:
+ std::string get_description() const override {
+ return "td_log (slow in debug mode)";
+ }
+
+ void start_up() override {
+ file_name_ = create_tmp_file();
+ stream.open(file_name_.c_str());
+ CHECK(stream.is_open());
+ old_buf = std::cerr.rdbuf(stream.rdbuf());
+ }
+
+ void run(int n) override {
+ for (int i = 0; i < n; i++) {
+ LOG(DEBUG) << "This is just for test" << 987654321;
+ }
+ }
+
+ void tear_down() override {
+ stream.close();
+ unlink(file_name_.c_str());
+ std::cerr.rdbuf(old_buf);
+ }
+};
+
+std::mutex mutex;
+
+int main() {
+ td::bench(LogWriteBench());
+#if TD_ANDROID
+ td::bench(ALogWriteBench());
+#endif
+ td::bench(IostreamWriteBench());
+ td::bench(FILEWriteBench());
+ return 0;
+}