cpp/bench_mark/bench_mark_src/bench_mark.cc (138 lines of code) (raw):

/* * 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 <chrono> #include <cmath> #include <iostream> #include <numeric> #include <string> #include "bench_conf.h" #include "common/db_common.h" #include "common/global.h" #include "common/path.h" #include "writer/tsfile_writer.h" std::vector<int> register_timeseries(storage::TsFileWriter& writer, int timeseries_num, std::vector<int> type_list) { auto start = std::chrono::high_resolution_clock::now(); int sum = std::accumulate(type_list.begin(), type_list.end(), 0); std::vector<float> ratio_list; for (int i = 0; i < type_list.size(); i++) { ratio_list.push_back((float)type_list[i] / sum); } std::vector<int> type_num; for (int i = 0; i < common::TSDataType::TEXT - 1; i++) { type_num.push_back((int)std::ceil(timeseries_num * ratio_list[i])); } type_num.push_back(timeseries_num - std::accumulate(type_num.begin(), type_num.end(), 0)); writer.open("/tmp/tsfile_test.tsfile", O_CREAT | O_RDWR, 0644); int ind = 0; int ret = 0; int type = 0; for (auto num : type_num) { for (int i = 0; i < num; i++) { std::string device_name = "root.db001.dev" + std::to_string(ind); std::string measurement_name = "m" + std::to_string(ind); ret = writer.register_timeseries( device_name, measurement_name, (common::TSDataType)type, common::TSEncoding::PLAIN, common::CompressionType::UNCOMPRESSED); ind++; } std::cout << "register finished for TsDataType" << common::s_data_type_names[type] << " timeseries num: " << num << std::endl; type++; } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed = end - start; std::cout << "register " << timeseries_num << "timeseries in file" << "./test_data/tsfile_test.tsfile" << std::endl; std::cout << "register timeseries cost time: " << elapsed.count() << "s" << std::endl; return type_num; } void test_writer_benchmark(storage::TsFileWriter& writer, int loop_num, std::vector<int> type_num) { std::cout << "start writing data" << std::endl; auto start = std::chrono::high_resolution_clock::now(); int type = 0; for (int i = 0; i < loop_num; i++) { int ind = 0; for (auto num : type_num) { for (int j = 0; j < num; j++) { std::string device_name = "root.db001.dev" + std::to_string(ind); std::string measurement_name = "m" + std::to_string(ind); long long currentTimeStamp = i; storage::TsRecord record(currentTimeStamp, device_name, 1); switch (type) { case common::INT32: { storage::DataPoint point(measurement_name, 10000 + i); record.points_.push_back(point); break; } case common::INT64: { storage::DataPoint point(measurement_name, int64_t(10000 + i)); record.points_.push_back(point); break; } case common::BOOLEAN: { storage::DataPoint point(measurement_name, i / 2 == 0); record.points_.push_back(point); break; } case common::FLOAT: { storage::DataPoint point(measurement_name, (float)i); record.points_.push_back(point); break; } case common::DOUBLE: { storage::DataPoint point(measurement_name, (double)i); record.points_.push_back(point); break; } } int ret = writer.write_record(record); ASSERT(ret == 0); ind++; } type++; } } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed = end - start; int timeseries_num = std::accumulate(type_num.begin(), type_num.end(), 0); std::cout << "writer loop: " << loop_num << " timeseries num: " << timeseries_num << " records in file" << "./test_data/tsfile_test.tsfile" << std::endl; std::cout << "total num of points: " << loop_num * timeseries_num << std::endl; std::cout << "writer data cost time: " << elapsed.count() << "s" << std::endl; std::cout << "writer data speed:" << loop_num * timeseries_num / elapsed.count() << " points/s" << std::endl; writer.flush(); writer.close(); auto end_flush = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed_flush = end_flush - end; std::cout << "flush data cost time: " << elapsed_flush.count() << "s" << std::endl; } int main() { std::cout << "LibTsFile benchmark" << std::endl; std::cout << "LOOP_NUM:" << bench::LOOP_NUM << std::endl; std::cout << "THREAD_NUM:" << bench::THREAD_NUM << std::endl; std::cout << "TIMESERIES_NUM:" << bench::TIMESERIES_NUM << std::endl; std::cout << "TYPE_LIST: " << bench::TYPE_LIST[0] << ":" << bench::TYPE_LIST[1] << ":" << bench::TYPE_LIST[2] << ":" << bench::TYPE_LIST[3] << ":" << bench::TYPE_LIST[4] << ":" << bench::TYPE_LIST[5] << std::endl; std::cout << "init tsfile config value" << std::endl; common::init_config_value(); storage::TsFileWriter writer; auto type_num = register_timeseries(writer, bench::TIMESERIES_NUM, bench::TYPE_LIST); test_writer_benchmark(writer, bench::LOOP_NUM, type_num); return 0; }