[OPTIMIZE]reduce calling utarray_sort

This commit is contained in:
liuwentan
2023-09-20 11:08:46 +08:00
parent 2e1a14eca3
commit 521dafe887
3 changed files with 27 additions and 55 deletions

View File

@@ -2089,7 +2089,8 @@ void maat_compile_state_update(int vtable_id, struct maat_item *hit_items,
hit_items[i].group_id, vtable_id, state->scan_cnt);
}
maat_compile_state_update_indirect_group(state->compile_state, super_group_ids, super_group_cnt, vtable_id);
maat_compile_state_update_indirect_group(state->compile_state, super_group_ids,
super_group_cnt, vtable_id);
/* update hit clause */
int compile_table_id = table_manager_get_default_compile_table_id(maat_inst->tbl_mgr);

View File

@@ -807,15 +807,9 @@ static void get_candidate_super_group_ids(struct maat_group_topology *group_topo
continue;
}
long long *tmp = NULL;
for (tmp = (long long *)utarray_front(group->incl_super_group_ids); tmp != NULL;
tmp = (long long *)utarray_next(group->incl_super_group_ids, tmp)) {
if (utarray_find(super_group_ids, tmp, compare_group_id)) {
continue;
}
for (int i = 0; i < utarray_len(group->incl_super_group_ids); i++) {
long long *tmp = (long long *)utarray_eltptr(group->incl_super_group_ids, i);
utarray_push_back(super_group_ids, tmp);
utarray_sort(super_group_ids, compare_group_id);
}
}
}
@@ -912,13 +906,21 @@ static void verify_candidate_super_group_ids(struct maat_group_topology *group_t
p = (long long *)utarray_next(all_hit_group_ids, p)) {
utarray_push_back(candidate_group_ids, p);
}
utarray_sort(candidate_group_ids, compare_group_id);
/**
* verify sub exclude for candidate_super_group_ids
*/
long long prev_group_id = -1;
for (p = (long long *)utarray_front(candidate_super_group_ids); p != NULL;
p = (long long *)utarray_next(candidate_super_group_ids, p)) {
//filter duplicated group id
if (*p == prev_group_id) {
continue;
}
prev_group_id = *p;
struct maat_group *group = group_topology_find_group(group_topo, *p);
assert(group != NULL);
@@ -939,12 +941,10 @@ static void verify_candidate_super_group_ids(struct maat_group_topology *group_t
}
utarray_push_back(kept_super_group_ids, p);
if (!utarray_find(all_hit_group_ids, p, compare_group_id)) {
utarray_push_back(all_hit_group_ids, p);
}
utarray_sort(all_hit_group_ids, compare_group_id);
}
}
utarray_sort(kept_super_group_ids, compare_group_id);
/**
@@ -1062,11 +1062,9 @@ static size_t group_topology_get_super_groups(struct maat_group_topology *group_
utarray_new(candidate_group_ids, &ut_group_id_icd);
for (i = 0; i < n_group_ids; i++) {
utarray_push_back(candidate_group_ids, &(group_ids[i]));
utarray_push_back(all_hit_group_ids, &(group_ids[i]));
utarray_push_back(candidate_group_ids, &(group_ids[i]));
}
utarray_sort(candidate_group_ids, compare_group_id);
utarray_sort(all_hit_group_ids, compare_group_id);
get_super_group_ids(group_topo, candidate_group_ids, all_hit_group_ids, 0);

View File

@@ -2,6 +2,7 @@
#include "log/log.h"
#include "cJSON/cJSON.h"
#include "maat_rule.h"
#include "uthash/utarray.h"
#include "maat_utils.h"
#include "maat_command.h"
#include "maat_group.h"
@@ -246,17 +247,13 @@ TEST_F(MaatGroupExclude, level_3_perf) {
long long hit_group_ids[2] = {11, 13};
long long super_group_ids[MAX_ITEM_NUM];
size_t super_group_cnt = 0;
struct timespec start, end;
struct log_handle *logger = MaatGroupExclude::logger;
clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
super_group_ids, MAX_ITEM_NUM);
EXPECT_EQ(super_group_cnt, 2);
EXPECT_EQ(super_group_ids[0], 2);
EXPECT_EQ(super_group_ids[1], 7);
}
clock_gettime(CLOCK_MONOTONIC, &end);
long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
@@ -272,12 +269,8 @@ TEST_F(MaatGroupExclude, level_3_perf) {
clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
super_group_ids, MAX_ITEM_NUM);
EXPECT_EQ(super_group_cnt, 3);
EXPECT_EQ(super_group_ids[0], 1);
EXPECT_EQ(super_group_ids[1], 6);
EXPECT_EQ(super_group_ids[2], 7);
}
clock_gettime(CLOCK_MONOTONIC, &end);
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
@@ -293,13 +286,8 @@ TEST_F(MaatGroupExclude, level_3_perf) {
clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
super_group_ids, MAX_ITEM_NUM);
EXPECT_EQ(super_group_cnt, 4);
EXPECT_EQ(super_group_ids[0], 1);
EXPECT_EQ(super_group_ids[1], 4);
EXPECT_EQ(super_group_ids[2], 6);
EXPECT_EQ(super_group_ids[3], 7);
}
clock_gettime(CLOCK_MONOTONIC, &end);
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
@@ -391,20 +379,13 @@ TEST_F(MaatGroupExclude, level_4_perf) {
long long hit_group_ids[2] = {14, 16};
long long super_group_ids[MAX_ITEM_NUM];
size_t super_group_cnt = 0;
struct timespec start, end;
struct log_handle *logger = MaatGroupExclude::logger;
clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
super_group_ids, MAX_ITEM_NUM);
EXPECT_EQ(super_group_cnt, 5);
EXPECT_EQ(super_group_ids[0], 4);
EXPECT_EQ(super_group_ids[1], 7);
EXPECT_EQ(super_group_ids[2], 8);
EXPECT_EQ(super_group_ids[3], 9);
EXPECT_EQ(super_group_ids[4], 10);
}
clock_gettime(CLOCK_MONOTONIC, &end);
long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
@@ -420,16 +401,8 @@ TEST_F(MaatGroupExclude, level_4_perf) {
clock_gettime(CLOCK_MONOTONIC, &start);
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
super_group_cnt = group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
group2group_runtime_get_super_groups(g2g_runtime, hit_group_ids, 2,
super_group_ids, MAX_ITEM_NUM);
EXPECT_EQ(super_group_cnt, 7);
EXPECT_EQ(super_group_ids[0], 1);
EXPECT_EQ(super_group_ids[1], 4);
EXPECT_EQ(super_group_ids[2], 6);
EXPECT_EQ(super_group_ids[3], 7);
EXPECT_EQ(super_group_ids[4], 8);
EXPECT_EQ(super_group_ids[5], 9);
EXPECT_EQ(super_group_ids[6], 10);
}
clock_gettime(CLOCK_MONOTONIC, &end);
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;