mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-15 17:30:53 +08:00
2cd040b856
add benchmark for token_tree.
154 lines
3.2 KiB
C++
154 lines
3.2 KiB
C++
#include "stdafx.h"
|
|
|
|
static const char *tokens[] = {
|
|
"中华",
|
|
"中华人",
|
|
"中华人民",
|
|
"中华人民共",
|
|
"中华人民共和",
|
|
"中华人民共和国",
|
|
"中华人民共和国万岁",
|
|
"我们中华人民共和国万岁",
|
|
"我们中华人民共和国万岁万万岁",
|
|
NULL
|
|
};
|
|
|
|
static void test_token_tree_c(int max)
|
|
{
|
|
ACL_TOKEN* tree = acl_token_tree_create(NULL);
|
|
|
|
for (int i = 0; tokens[i] != NULL; i++) {
|
|
acl_token_tree_add(tree, tokens[i], ACL_TOKEN_F_STOP, NULL);
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "begin\t");
|
|
|
|
int j = 0;
|
|
for (int i = 0; i < max; i++) {
|
|
ACL_TOKEN* token = acl_token_tree_word_match(tree, tokens[j]);
|
|
if (token == NULL) {
|
|
printf("find error, key=%s\r\n", tokens[j]);
|
|
break;
|
|
}
|
|
if (tokens[++j] == NULL) {
|
|
j = 0;
|
|
}
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "end\t\t");
|
|
|
|
acl_token_tree_destroy(tree);
|
|
}
|
|
|
|
static void test_token_tree_cpp(int max)
|
|
{
|
|
acl::token_tree tree;
|
|
|
|
for (int i = 0; tokens[i] != NULL; i++) {
|
|
tree.insert(tokens[i]);
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "begin\t");
|
|
|
|
int j = 0;
|
|
for (int i = 0; i < max; i++) {
|
|
const acl::token_node* node = tree.find(tokens[j]);
|
|
if (node == NULL) {
|
|
printf("find error, key=%s\r\n", tokens[j]);
|
|
break;
|
|
}
|
|
if (tokens[++j] == NULL) {
|
|
j = 0;
|
|
}
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "end\t");
|
|
}
|
|
|
|
static void test_htable(int max)
|
|
{
|
|
ACL_HTABLE* htable = acl_htable_create(100, 0);
|
|
|
|
for (int i = 0; tokens[i] != NULL; i++) {
|
|
acl_htable_enter(htable, tokens[i], (void*) tokens[i]);
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "begin\t");
|
|
|
|
int j = 0;
|
|
for (int i = 0; i < max; i++) {
|
|
const char* value = (const char*) acl_htable_find(htable, tokens[j]);
|
|
if (value == NULL) {
|
|
printf("find error, key=%s\r\n", tokens[j]);
|
|
break;
|
|
}
|
|
if (tokens[++j] == NULL) {
|
|
j = 0;
|
|
}
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "end\t");
|
|
acl_htable_free(htable, NULL);
|
|
}
|
|
|
|
static void test_stdmap(int max)
|
|
{
|
|
std::map<std::string, bool> map;
|
|
|
|
for (int i = 0; tokens[i] != NULL; i++) {
|
|
map[tokens[i]] = true;
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "begin\t");
|
|
|
|
int j = 0;
|
|
for (int i = 0; i < max; i++) {
|
|
if (map.find(tokens[j]) == map.end()) {
|
|
printf("find error, key=%s\r\n", tokens[j]);
|
|
break;
|
|
}
|
|
if (tokens[++j] == NULL) {
|
|
j = 0;
|
|
}
|
|
}
|
|
|
|
acl::meter_time(__FUNCTION__, __LINE__, "end\t");
|
|
}
|
|
|
|
static void usage(const char* procname)
|
|
{
|
|
printf("usage: %s -h[help] -n max[100]\r\n", procname);
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
int ch, max = 100;
|
|
|
|
while ((ch = getopt(argc, argv, "hn:")) > 0)
|
|
{
|
|
switch (ch)
|
|
{
|
|
case 'h':
|
|
usage(argv[0]);
|
|
return 0;
|
|
case 'n':
|
|
max = atoi(optarg);
|
|
break;
|
|
default:
|
|
usage(argv[0]);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
test_token_tree_cpp(max);
|
|
printf("-------------------------------------------------------\r\n");
|
|
test_token_tree_c(max);
|
|
printf("-------------------------------------------------------\r\n");
|
|
test_htable(max);
|
|
printf("-------------------------------------------------------\r\n");
|
|
test_stdmap(max);
|
|
printf("-------------------------------------------------------\r\n");
|
|
|
|
return 0;
|
|
}
|