hashPerformance.c 4.1 KB
Newer Older
S
Shengliang Guan 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * 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 <http://www.gnu.org/licenses/>.
 */

#define _DEFAULT_SOURCE
#include "os.h"
#include "taos.h"
#include "tulog.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);
}