From 19302ef8a344dabe86d46ae0a4fc1b3dd42f4913 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 25 Jun 2020 11:47:31 +0800 Subject: [PATCH] test hash performance --- tests/test/c/CMakeLists.txt | 15 ++-- tests/test/c/hashPerformance.c | 131 +++++++++++++++++++++++++++++++++ 2 files changed, 140 insertions(+), 6 deletions(-) create mode 100644 tests/test/c/hashPerformance.c diff --git a/tests/test/c/CMakeLists.txt b/tests/test/c/CMakeLists.txt index d40db5ee40..3b09342867 100644 --- a/tests/test/c/CMakeLists.txt +++ b/tests/test/c/CMakeLists.txt @@ -7,15 +7,18 @@ INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc) INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc) IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM)) - add_executable(insertPerTable insertPerTable.c) - target_link_libraries(insertPerTable taos_static pthread) + #add_executable(insertPerTable insertPerTable.c) + #target_link_libraries(insertPerTable taos_static pthread) add_executable(insertPerRow insertPerRow.c) target_link_libraries(insertPerRow taos_static pthread) - add_executable(importOneRow importOneRow.c) - target_link_libraries(importOneRow taos_static pthread) + #add_executable(importOneRow importOneRow.c) + #target_link_libraries(importOneRow taos_static pthread) - add_executable(importPerTable importPerTable.c) - target_link_libraries(importPerTable taos_static pthread) + #add_executable(importPerTable importPerTable.c) + #target_link_libraries(importPerTable taos_static pthread) + + add_executable(hashPerformance hashPerformance.c) + target_link_libraries(hashPerformance taos_static tutil common pthread) ENDIF() diff --git a/tests/test/c/hashPerformance.c b/tests/test/c/hashPerformance.c new file mode 100644 index 0000000000..fa3612d6e8 --- /dev/null +++ b/tests/test/c/hashPerformance.c @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define _DEFAULT_SOURCE +#include "os.h" +#include "taos.h" +#include "tulog.h" +#include "ttime.h" +#include "tutil.h" +#include "hash.h" + +#define MAX_RANDOM_POINTS 20000 +#define GREEN "\033[1;32m" +#define NC "\033[0m" + +int32_t capacity = 100000; +int32_t q1Times = 1; +int32_t q2Times = 1; +int32_t keyNum = 100000; +int32_t printInterval = 10000; + +typedef struct HashTestRow { + int32_t size; + void * ptr; +} HashTestRow; + +void shellParseArgument(int argc, char *argv[]); + +void testHashPerformance() { + int64_t initialMs = taosGetTimestampMs(); + _hash_fn_t hashFp = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY); + void * hashHandle = taosHashInit(capacity, hashFp, true); + + int64_t startMs = taosGetTimestampMs(); + float seconds = (startMs - initialMs) / 1000.0; + pPrint("initial time %.2f sec", seconds); + + for (int32_t t = 1; t <= keyNum; ++t) { + HashTestRow row = {0}; + char key[100] = {0}; + int32_t keySize = sprintf(key, "0.db.st%d", t); + + for (int32_t q = 0; q < q1Times; q++) { + taosHashGet(hashHandle, &key, keySize); + } + + taosHashPut(hashHandle, key, keySize, &row, sizeof(HashTestRow)); + + for (int32_t q = 0; q < q2Times; q++) { + taosHashGet(hashHandle, &key, keySize); + } + + if (t % printInterval == 0) { + int64_t endMs = taosGetTimestampMs(); + int64_t hashSize = taosHashGetSize(hashHandle); + float seconds = (endMs - startMs) / 1000.0; + float speed = printInterval / seconds; + pPrint("time:%.2f sec, speed:%.1f rows/second, hashSize:%ld", seconds, speed, hashSize); + startMs = endMs; + } + } + + int64_t endMs = taosGetTimestampMs(); + int64_t hashSize = taosHashGetSize(hashHandle); + seconds = (endMs - initialMs) / 1000.0; + float speed = hashSize / seconds; + + pPrint("total time:%.2f sec, avg speed:%.1f rows/second, hashSize:%ld", seconds, speed, hashSize); + taosHashCleanup(hashHandle); +} + +int main(int argc, char *argv[]) { + shellParseArgument(argc, argv); + testHashPerformance(); +} + +void printHelp() { + char indent[10] = " "; + printf("Used to test the performance of cache\n"); + + printf("%s%s\n", indent, "-k"); + printf("%s%s%s%d\n", indent, indent, "key num, default is ", keyNum); + printf("%s%s\n", indent, "-p"); + printf("%s%s%s%d\n", indent, indent, "print interval while put into hash, default is ", printInterval); + printf("%s%s\n", indent, "-c"); + printf("%s%s%s%d\n", indent, indent, "the initial capacity of hash ", capacity); + printf("%s%s\n", indent, "-q1"); + printf("%s%s%s%d\n", indent, indent, "query times before put into hash", q1Times); + printf("%s%s\n", indent, "-q2"); + printf("%s%s%s%d\n", indent, indent, "query times after put into hash", q2Times); + + exit(EXIT_SUCCESS); +} + +void shellParseArgument(int argc, char *argv[]) { + for (int i = 1; i < argc; i++) { + if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) { + printHelp(); + exit(0); + } else if (strcmp(argv[i], "-k") == 0) { + keyNum = atoi(argv[++i]); + } else if (strcmp(argv[i], "-p") == 0) { + printInterval = atoi(argv[++i]); + } else if (strcmp(argv[i], "-c") == 0) { + capacity = atoi(argv[++i]); + } else if (strcmp(argv[i], "-q1") == 0) { + q1Times = atoi(argv[++i]); + } else if (strcmp(argv[i], "-q2") == 0) { + q2Times = atoi(argv[++i]); + } else { + } + } + + pPrint("%s capacity:%d %s", GREEN, capacity, NC); + pPrint("%s printInterval:%d %s", GREEN, printInterval, NC); + pPrint("%s q1Times:%d %s", GREEN, q1Times, NC); + pPrint("%s q2Times:%d %s", GREEN, q2Times, NC); + pPrint("%s keyNum:%d %s", GREEN, keyNum, NC); +}