You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tsfile.apache.org by co...@apache.org on 2025/04/09 18:37:21 UTC
(tsfile) 05/06: add write bench mark.
This is an automated email from the ASF dual-hosted git repository.
colinlee pushed a commit to branch bench_mark
in repository https://gitbox.apache.org/repos/asf/tsfile.git
commit 84abd93af537a92134dabecee392f7a4037a4dad
Author: ColinLee <sh...@163.com>
AuthorDate: Wed Apr 9 19:45:59 2025 +0800
add write bench mark.
---
cpp/bench_mark/CMakeLists.txt | 10 +-
cpp/bench_mark/build.sh | 17 +--
cpp/bench_mark/src/bench_mark.cc | 25 ++++
cpp/bench_mark/src/bench_mark.h | 48 --------
cpp/bench_mark/src/bench_mark_c.cc | 203 ++++++++++++++++++++++++++++++++-
cpp/bench_mark/src/bench_mark_c_cpp.h | 25 ++++
cpp/bench_mark/src/bench_mark_cpp.cc | 171 +++++++++++++--------------
cpp/bench_mark/src/bench_mark_utils.cc | 66 +++++++++++
cpp/bench_mark/src/bench_mark_utils.h | 32 ++++++
9 files changed, 436 insertions(+), 161 deletions(-)
diff --git a/cpp/bench_mark/CMakeLists.txt b/cpp/bench_mark/CMakeLists.txt
index ddb1b333..36f8dac9 100644
--- a/cpp/bench_mark/CMakeLists.txt
+++ b/cpp/bench_mark/CMakeLists.txt
@@ -17,7 +17,7 @@ specific language governing permissions and limitations
under the License.
]]
message("Running in bench_mark directory")
-cmake_minimum_required(VERSION 3.1)
+cmake_minimum_required(VERSION 3.11)
project(tsfile_bench_mark_project)
if(DEFINED ENV{CXX})
@@ -32,6 +32,8 @@ include_directories(
${CMAKE_SOURCE_DIR}/third_party/zlib-1.2.13
${CMAKE_SOURCE_DIR}/third_party/google_snappy
${CMAKE_SOURCE_DIR}/third_party/antlr4-cpp-runtime-4/runtime/src
+ ${CMAKE_SOURCE_DIR}/src
+
)
link_directories(${LIBRARY_OUTPUT_PATH})
@@ -43,5 +45,9 @@ else()
endif()
message("CMAKE DEBUG: CMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}")
-add_executable(bench_mark src/bench_mark_cpp.cc src/bench_mark_c.cc)
+add_executable(bench_mark
+ src/bench_mark_cpp.cc
+ src/bench_mark_c.cc
+ src/bench_mark.cc
+ src/bench_mark_utils.cc)
target_link_libraries(bench_mark tsfile)
diff --git a/cpp/bench_mark/build.sh b/cpp/bench_mark/build.sh
index c8c534f7..2f40dee3 100644
--- a/cpp/bench_mark/build.sh
+++ b/cpp/bench_mark/build.sh
@@ -20,19 +20,8 @@
build_type=Debug
use_cpp11=1
-if [ ${build_type} = "Debug" ]
-then
- mkdir -p build/Debug
- cd build/Debug
- use_sdk_debug=1
-else
- mkdir -p build/Release
- cd build/Release
- use_sdk_debug=0
-fi
+mkdir -p build/Release
+cd build/Release
-echo "use_sdk_debug=${use_sdk_debug}"
-cmake ../../ \
- -DUSE_SDK_DEBUG=$use_sdk_debug \
- -DUSE_CPP11=$use_cpp11
+cmake ../../
make
diff --git a/cpp/bench_mark/src/bench_mark.cc b/cpp/bench_mark/src/bench_mark.cc
new file mode 100644
index 00000000..be38d5bb
--- /dev/null
+++ b/cpp/bench_mark/src/bench_mark.cc
@@ -0,0 +1,25 @@
+/*
+* 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 "bench_mark_c_cpp.h"
+
+int main() {
+ bench_mark_cpp_write();
+ bench_mark_c_write();
+}
diff --git a/cpp/bench_mark/src/bench_mark.h b/cpp/bench_mark/src/bench_mark.h
deleted file mode 100644
index 6fcb64ea..00000000
--- a/cpp/bench_mark/src/bench_mark.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//
-// Created by colin on 4/2/25.
-//
-
-#ifndef TSFILE_BENCH_MARK_BENCH_MARK_H
-#define TSFILE_BENCH_MARK_BENCH_MARK_H
-#include <iostream>
-#include "bench_conf.h"
-namespace bench {
-
-static const char* data_types_name[5] = {
- "BOOLEAN", "INT32", "INT64", "FLOAT", "DOUBLE"
-};
-
-static const int data_type[5] = {
- 0, 1, 2, 3, 4
-};
-
-static int column_num = 0;
-
-inline void print_config () {
- std::cout << "TsFile CPP benchmark" << std::endl;
- std::cout << "Schema Configuration:" << std::endl;
- std::cout << "Tag Column num: " << bench::tag_num << std::endl;
- std::cout << "Diversity rate of tag :" << std::endl;
- std::cout << bench::diversity_rate[0];
- for (int i = 1; i < bench::tag_num; i++) {
- std::cout << ":"<< bench::diversity_rate[i];
- }
-
- std::cout<<std::endl;
- std::cout << "Filed Column and types: " << std::endl;
- column_num = 0;
- column_num += diversity_rate.size();
- for (int i = 0; i < 5; i++) {
- std::cout << bench::data_types_name[i] << "x" << bench::field_type_vector[i] << " ";
- column_num += field_type_vector[i];
- }
- std::cout << std::endl;
- std::cout << "Tablet num:" << bench::tablet_num << std::endl;
- std::cout << "Tablet row num:" << bench::tablet_row_num << std::endl;
- std::cout << "Total points is " << tablet_num * tablet_row_num * column_num<< std::endl;
-}
-
-}
-
-
-#endif // TSFILE_BENCH_MARK_BENCH_MARK_H
diff --git a/cpp/bench_mark/src/bench_mark_c.cc b/cpp/bench_mark/src/bench_mark_c.cc
index b9988fb0..a2da409f 100644
--- a/cpp/bench_mark/src/bench_mark_c.cc
+++ b/cpp/bench_mark/src/bench_mark_c.cc
@@ -1,5 +1,200 @@
-//
-// Created by colin on 4/2/25.
-//
+/*
+ * 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 "bench_mark.h"
+#include <chrono>
+#include <iostream>
+#include <string>
+
+#include "bench_conf.h"
+#include "bench_mark_c_cpp.h"
+#include "bench_mark_utils.h"
+#include "cwrapper/tsfile_cwrapper.h"
+#define HANDLE_ERROR(err_no) \
+ do { \
+ if (err_no != 0) { \
+ printf("get err no: %d", err_no); \
+ return err_no; \
+ } \
+ } while (0)
+
+char** column_list;
+TSDataType* data_types_c;
+
+int bench_mark_c_write() {
+ ERRNO code = 0;
+ char* table_name = "TestTable";
+ print_config();
+ TableSchema table_schema;
+
+ table_schema.table_name = strdup(table_name);
+ int column = 0;
+ for (auto data_type : bench::field_type_vector) {
+ column += data_type;
+ }
+ column_list = new char*[column + 2];
+ data_types_c = new TSDataType[column + 2];
+
+ table_schema.column_schemas =
+ (ColumnSchema*)malloc(sizeof(ColumnSchema) * column);
+ table_schema.column_num = column + 2;
+ table_schema.column_schemas[0] =
+ (ColumnSchema){.column_name = strdup("TAG1"),
+ .data_type = TS_DATATYPE_STRING,
+ .column_category = TAG};
+ column_list[0] = strdup("TAG1");
+ data_types_c[0] = TS_DATATYPE_STRING;
+ table_schema.column_schemas[1] =
+ (ColumnSchema){.column_name = strdup("TAG2"),
+ .data_type = TS_DATATYPE_STRING,
+ .column_category = TAG};
+ column_list[1] = strdup("TAG2");
+ data_types_c[1] = TS_DATATYPE_STRING;
+
+ int col = 2;
+ for (int i = 0; i < bench::field_type_vector.size();i++) {
+ int column_num = bench::field_type_vector[i];
+ for (int j = 0; j < column_num; j++) {
+ column_list[col] =
+ strdup(std::string("FIELD" + std::to_string(i)).c_str());
+ data_types_c[col] = static_cast<TSDataType>(data_type[i]);
+ table_schema.column_schemas[col++] = (ColumnSchema){
+ .column_name =
+ strdup(std::string("FIELD" + std::to_string(i)).c_str()),
+ .data_type = static_cast<TSDataType>(data_type[i]),
+ .column_category = FIELD};
+ }
+ }
+
+ remove("bench_mark_c.tsfile");
+ WriteFile file = write_file_new("bench_mark_c.tsfile", &code);
+ HANDLE_ERROR(code);
+ TsFileWriter writer = tsfile_writer_new(file, &table_schema, &code);
+ HANDLE_ERROR(code);
+ int64_t prepare_time = 0;
+ int64_t writing_time = 0;
+ int64_t timestamp = 0;
+ int64_t row_num =
+ bench::tag1_num * bench::tag2_num * bench::timestamp_per_tag;
+ auto start = std::chrono::high_resolution_clock::now();
+
+ for (int i = 0; i < bench::tablet_num; i++) {
+ print_progress_bar(i, bench::tablet_num);
+ auto prepare_start = std::chrono::high_resolution_clock::now();
+ auto tablet =
+ tablet_new(column_list, data_types_c, column + 2, row_num);
+ for (int tag1 = 0; tag1 < bench::tag1_num; tag1++) {
+ for (int tag2 = 0; tag2 < bench::tag2_num; tag2++) {
+ for (int row = 0; row < bench::timestamp_per_tag; row++) {
+ tablet_add_timestamp(tablet, row, timestamp + row);
+ tablet_add_value_by_index_string(
+ tablet, row, 0,
+ std::string("TAG1_" + std::to_string(tag1)).c_str());
+ tablet_add_value_by_index_string(
+ tablet, row, 1,
+ std::string("TAG2_" + std::to_string(tag2)).c_str());
+ for (int col = 2; col < column + 2; col++) {
+ switch (data_types_c[col]) {
+ case TS_DATATYPE_INT32:
+ tablet_add_value_by_index_int32_t(
+ tablet, row, col,
+ static_cast<int32_t>(timestamp));
+ break;
+ case TS_DATATYPE_INT64:
+ tablet_add_value_by_index_int64_t(
+ tablet, row, col,
+ static_cast<int64_t>(timestamp));
+ break;
+ case TS_DATATYPE_FLOAT:
+ tablet_add_value_by_index_float(
+ tablet, row, col,
+ static_cast<float>(timestamp));
+ break;
+ case TS_DATATYPE_DOUBLE:
+ tablet_add_value_by_index_double(
+ tablet, row, col,
+ static_cast<double>(timestamp));
+ break;
+ case TS_DATATYPE_BOOLEAN:
+ tablet_add_value_by_index_bool(
+ tablet, row, col,
+ static_cast<bool>(timestamp % 2));
+ break;
+ default:
+ //
+ }
+ }
+ }
+ }
+ }
+ auto prepare_end = std::chrono::high_resolution_clock::now();
+ prepare_time += std::chrono::duration_cast<std::chrono::microseconds>(
+ prepare_end - prepare_start)
+ .count();
+
+ auto writing_start = std::chrono::high_resolution_clock::now();
+ tsfile_writer_write(writer, tablet);
+ auto writing_end = std::chrono::high_resolution_clock::now();
+ writing_time += std::chrono::duration_cast<std::chrono::microseconds>(
+ writing_end - writing_start)
+ .count();
+ free_tablet(&tablet);
+ timestamp += bench::timestamp_per_tag;
+ }
+
+ auto close_start = std::chrono::high_resolution_clock::now();
+ tsfile_writer_close(writer);
+ auto close_end = std::chrono::high_resolution_clock::now();
+
+ writing_time += std::chrono::duration_cast<std::chrono::microseconds>(
+ close_end - close_start)
+ .count();
+ free_write_file(&file);
+ auto end = std::chrono::high_resolution_clock::now();
+
+ FILE* file_to_size = fopen("bench_mark_c.tsfile", "rb");
+ if (!file_to_size) {
+ std::cout << "unable to open file" << std::endl;
+ return -1;
+ }
+ fseeko(file_to_size, 0, SEEK_END);
+ off_t size = ftello(file_to_size);
+ fclose(file_to_size);
+
+ std::cout << "finish bench mark for c" << std::endl;
+ std::cout << "tsfile size is " << size << " bytes " << " ~ " << size / 1024
+ << "KB" << std::endl;
+
+ double pre_time = prepare_time / 1000.0 / 1000.0;
+ double write_time = writing_time / 1000.0 / 1000.0;
+ std::cout << "prepare data time is " << pre_time << " s" << std::endl;
+ std::cout << "writing data time is " << write_time << " s" << std::endl;
+ std::cout << "writing speed is "
+ << static_cast<long long>(bench::tablet_num * bench::tag1_num *
+ bench::tag2_num *
+ bench::timestamp_per_tag *
+ (column + 2) / (pre_time + write_time))
+ << " points/s" << std::endl;
+ std::cout << "total time is "
+ << std::chrono::duration_cast<std::chrono::microseconds>(end -
+ start)
+ .count() /
+ 1000.0 / 1000.0
+ << " s" << std::endl;
+ return 0;
+}
\ No newline at end of file
diff --git a/cpp/bench_mark/src/bench_mark_c_cpp.h b/cpp/bench_mark/src/bench_mark_c_cpp.h
new file mode 100644
index 00000000..9f5cb4ac
--- /dev/null
+++ b/cpp/bench_mark/src/bench_mark_c_cpp.h
@@ -0,0 +1,25 @@
+/*
+* 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.
+ */
+#ifndef TSFILE_BENCH_MARK_BENCH_MARK_C_CPP_H
+#define TSFILE_BENCH_MARK_BENCH_MARK_C_CPP_H
+
+int bench_mark_c_write();
+int bench_mark_cpp_write();
+
+#endif // TSFILE_BENCH_MARK_BENCH_MARK_C_CPP_H
\ No newline at end of file
diff --git a/cpp/bench_mark/src/bench_mark_cpp.cc b/cpp/bench_mark/src/bench_mark_cpp.cc
index 819d40ac..56d886fa 100644
--- a/cpp/bench_mark/src/bench_mark_cpp.cc
+++ b/cpp/bench_mark/src/bench_mark_cpp.cc
@@ -16,17 +16,16 @@
* specific language governing permissions and limitations
* under the License.
*/
-#include <sys/types.h>
+
+#include "bench_mark_c_cpp.h"
#include <chrono>
-#include <cmath>
#include <iostream>
-#include <numeric>
#include <string>
#include <vector>
#include "bench_conf.h"
-#include "bench_mark.h"
+#include "bench_mark_utils.h"
#include "common/db_common.h"
#include "common/path.h"
#include "common/tablet.h"
@@ -40,23 +39,6 @@ using namespace common;
std::vector<std::string> columns_name;
std::vector<TSDataType> data_types;
-void printProgressBar(int current, int total, int barWidth = 50) {
- float progress = static_cast<float>(current) / total;
- int pos = barWidth * progress;
-
- std::cout << "[";
- for (int i = 0; i < barWidth; ++i) {
- if (i < pos)
- std::cout << "=";
- else if (i == pos)
- std::cout << ">";
- else
- std::cout << " ";
- }
- std::cout << "] " << int(progress * 100.0) << " %\r";
- std::cout.flush();
-}
-
TableSchema* gen_table_schema(const std::vector<int>& field_type_vector) {
std::vector<common::ColumnSchema> schemas;
// 2 TAG Columns default
@@ -70,23 +52,25 @@ TableSchema* gen_table_schema(const std::vector<int>& field_type_vector) {
for (int i = 0; i < field_type_vector.size(); i++) {
int column_num = field_type_vector[i];
for (int j = 0; j < column_num; j++) {
- std::string column_name =
+ auto column_name =
std::string("FIELD" + std::to_string(i) + std::to_string(j));
- TSDataType data_type = static_cast<TSDataType>(bench::data_type[i]);
- data_types.push_back(data_type);
+ auto type = static_cast<TSDataType>(data_type[i]);
+ data_types.push_back(type);
columns_name.push_back(column_name);
- schemas.emplace_back(column_name, data_type, ColumnCategory::FIELD);
+ schemas.emplace_back(column_name, type, ColumnCategory::FIELD);
}
}
return new TableSchema("TestTable", schemas);
}
-int main() {
+int bench_mark_cpp_write() {
int code = common::E_OK;
- bench::print_config();
+ print_config();
+ remove("bench_mark_cpp.tsfile");
common::init_config_value();
// benchmark for write
- storage::WriteFile file = storage::WriteFile();
+ WriteFile file = WriteFile();
+
int flags = O_WRONLY | O_CREAT | O_TRUNC;
#ifdef _WIN32
flags |= O_BINARY;
@@ -97,85 +81,79 @@ int main() {
return -1;
}
- TableSchema* table_schema =
- gen_table_schema(bench::field_type_vector);
+ TableSchema* table_schema = gen_table_schema(bench::field_type_vector);
auto writer = new TsFileTableWriter(&file, table_schema);
delete (table_schema);
+
int64_t timestamp = 0;
- auto start = std::chrono::high_resolution_clock::now();
int64_t prepare_time = 0;
int64_t writing_time = 0;
- int batch_num = bench::tablet_row_num * bench::diversity_rate[0];
- int batch_num2 = batch_num * bench::diversity_rate[1];
- for (int i = 0; i < bench::tablet_num; i++) {
- printProgressBar(i, bench::tablet_num);
- auto tablet_start = std::chrono::high_resolution_clock::now();
- auto* tablet =
- new Tablet(columns_name, data_types, bench::tablet_row_num);
- int tag1_num = 0;
- int tag2_num = 0;
- int tag1_row_num = 0;
- int tag2_row_num = 0;
- for (int j = 0; j < bench::tablet_row_num; j++) {
- if (tag1_row_num > batch_num) {
- tag1_row_num = 0;
- tag1_num++;
- tag2_row_num = 0;
- tag2_num = 0;
- }
- tablet->add_timestamp(j, timestamp++);
- tablet->add_value(
- j, 0, std::string("tag1_" + std::to_string(tag1_num)).c_str());
- tag1_row_num++;
- if (tag2_row_num > batch_num2) {
- tag2_row_num = 0;
- tag2_num++;
- }
- tablet->add_value(
- j, 1, std::string("tag2_" + std::to_string(tag2_num)).c_str());
- tag2_row_num++;
- for (int col = 2; col < data_types.size(); col++) {
- switch (data_types[col]) {
- case TSDataType::INT64:
- tablet->add_value(j, col,
- static_cast<int64_t>(timestamp));
- break;
- case TSDataType::FLOAT:
- tablet->add_value(j, col,
- static_cast<float>(timestamp * 1.1));
- break;
- case TSDataType::DOUBLE:
- tablet->add_value(j, col,
- static_cast<double>(timestamp * 1.1));
- break;
- case TSDataType::INT32:
- tablet->add_value(j, col,
- static_cast<int32_t>(timestamp));
- break;
- case TSDataType::BOOLEAN:
- tablet->add_value(j, col,
- static_cast<bool>(timestamp % 2));
- break;
- default:
- //
+
+ auto start = std::chrono::high_resolution_clock::now();
+
+ for (int tablet_i = 0; tablet_i < bench::tablet_num; tablet_i++) {
+ print_progress_bar(tablet_i, bench::tablet_num);
+ auto prepare_start = std::chrono::high_resolution_clock::now();
+ auto tablet = Tablet(
+ columns_name, data_types,
+ bench::tag1_num * bench::tag2_num * bench::timestamp_per_tag);
+ for (int tag1 = 0; tag1 < bench::tag1_num; tag1++) {
+ for (int tag2 = 0; tag2 < bench::tag2_num; tag2++) {
+ for (int row = 0; row < bench::timestamp_per_tag; row++) {
+ tablet.add_timestamp(row, timestamp + row);
+ tablet.add_value(row, 0, std::string("tag1_" + std::to_string(tag1)).c_str());
+ tablet.add_value(row, 1, std::string("tag2_" + std::to_string(tag2)).c_str());
+ for (int col = 0; col < data_types.size(); col++) {
+ switch (data_types[col]) {
+ case TSDataType::INT32:
+ tablet.add_value(
+ row, col, static_cast<int32_t>(timestamp));
+ break;
+ case TSDataType::INT64:
+ tablet.add_value(
+ row, col, static_cast<int64_t>(timestamp));
+ break;
+ case TSDataType::FLOAT:
+ tablet.add_value(
+ row, col,
+ static_cast<float>(timestamp * 1.1));
+ break;
+ case TSDataType::DOUBLE:
+ tablet.add_value(
+ row, col,
+ static_cast<double>(timestamp * 1.1));
+ break;
+
+ case TSDataType::BOOLEAN:
+ tablet.add_value(
+ row, col, static_cast<bool>(timestamp % 2));
+ break;
+ default:
+ //
+ }
+ }
}
}
}
- auto tablet_end = std::chrono::high_resolution_clock::now();
- auto duration = std::chrono::duration_cast<std::chrono::microseconds>(
- tablet_end - tablet_start);
- prepare_time += duration.count();
+ auto prepare_end = std::chrono::high_resolution_clock::now();
+
+ prepare_time += std::chrono::duration_cast<std::chrono::microseconds>(
+ prepare_end - prepare_start)
+ .count();
+
auto write_start = std::chrono::high_resolution_clock::now();
- writer->write_table(*tablet);
+ writer->write_table(tablet);
auto write_end = std::chrono::high_resolution_clock::now();
writing_time += std::chrono::duration_cast<std::chrono::microseconds>(
write_end - write_start)
.count();
- delete tablet;
+ timestamp += bench::timestamp_per_tag;
}
+
auto close_start = std::chrono::high_resolution_clock::now();
writer->close();
auto close_end = std::chrono::high_resolution_clock::now();
+
writing_time += std::chrono::duration_cast<std::chrono::microseconds>(
close_end - close_start)
.count();
@@ -190,15 +168,20 @@ int main() {
fseeko(file_to_size, 0, SEEK_END);
off_t size = ftello(file_to_size);
fclose(file_to_size);
+
+ std::cout << "====================" << std::endl;
std::cout << "finish bench mark for cpp" << std::endl;
std::cout << "tsfile size is " << size << " bytes " << " ~ " << size / 1024
<< "KB" << std::endl;
- float pre_time = prepare_time / 1000.0 / 1000.0;
- float write_time = writing_time / 1000.0 / 1000.0;
+
+ double pre_time = prepare_time / 1000.0 / 1000.0;
+ double write_time = writing_time / 1000.0 / 1000.0;
std::cout << "prepare data time is " << pre_time << " s" << std::endl;
std::cout << "writing data time is " << write_time << " s" << std::endl;
std::cout << "writing speed is "
- << static_cast<long long>(bench::tablet_num * bench::tablet_row_num * bench::column_num /
+ << static_cast<long long>(
+ bench::tablet_num * bench::tag1_num * bench::tag2_num *
+ bench::timestamp_per_tag * data_types.size() /
(pre_time + write_time))
<< " points/s" << std::endl;
std::cout << "total time is "
@@ -207,4 +190,6 @@ int main() {
.count() /
1000.0 / 1000.0
<< " s" << std::endl;
+ std::cout << "====================" << std::endl;
+ return 0;
}
diff --git a/cpp/bench_mark/src/bench_mark_utils.cc b/cpp/bench_mark/src/bench_mark_utils.cc
new file mode 100644
index 00000000..842aa88e
--- /dev/null
+++ b/cpp/bench_mark/src/bench_mark_utils.cc
@@ -0,0 +1,66 @@
+/*
+* 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 "bench_mark_utils.h"
+
+#include <iostream>
+
+#include "bench_conf.h"
+using namespace bench;
+
+void print_config() {
+ std::cout << "TsFile benchmark" << std::endl;
+ std::cout << "Schema Configuration:" << std::endl;
+ std::cout << "Tag Column num: " << 2 << std::endl;
+ std::cout << "TAG1 num: " << tag1_num << " TAG2 num: " << tag2_num
+ << std::endl;
+
+ std::cout << std::endl;
+ std::cout << "Filed Column and types: " << std::endl;
+ int column_num = 0;
+ for (int i = 0; i < 5; i++) {
+ std::cout << data_types_name[i] << "x" << field_type_vector[i] << " ";
+ column_num += field_type_vector[i];
+ }
+ std::cout << std::endl;
+ std::cout << "Tablet num:" << tablet_num << std::endl;
+ std::cout << "Tablet row num per tag:" << timestamp_per_tag << std::endl;
+ std::cout << "Total points is "
+ << tablet_num * tag1_num * tag2_num * timestamp_per_tag *
+ (column_num + 2)
+ << std::endl;
+ std::cout << "====================" << std::endl;
+}
+
+void print_progress_bar(int current, int total, int barWidth) {
+ float progress = static_cast<float>(current) / total;
+ int pos = barWidth * progress;
+
+ std::cout << "[";
+ for (int i = 0; i < barWidth; ++i) {
+ if (i < pos)
+ std::cout << "=";
+ else if (i == pos)
+ std::cout << ">";
+ else
+ std::cout << " ";
+ }
+ std::cout << "] " << int(progress * 100.0) << " %\r";
+ std::cout.flush();
+}
diff --git a/cpp/bench_mark/src/bench_mark_utils.h b/cpp/bench_mark/src/bench_mark_utils.h
new file mode 100644
index 00000000..a46a67ff
--- /dev/null
+++ b/cpp/bench_mark/src/bench_mark_utils.h
@@ -0,0 +1,32 @@
+/*
+* 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.
+ */
+
+#ifndef TSFILE_BENCH_MARK_BENCH_MARK_UTILS_H
+#define TSFILE_BENCH_MARK_BENCH_MARK_UTILS_H
+
+
+static const char* data_types_name[5] = {"BOOLEAN", "INT32", "INT64", "FLOAT",
+ "DOUBLE"};
+static const int data_type[5] = {0, 1, 2, 3, 4};
+
+void print_config();
+void print_progress_bar(int current, int total, int barWidth = 50);
+
+
+#endif // TSFILE_BENCH_MARK_BENCH_MARK_UTILS_H
\ No newline at end of file