[OPTIMIZE]reduce calling utarray_sort
This commit is contained in:
@@ -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);
|
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 */
|
/* update hit clause */
|
||||||
int compile_table_id = table_manager_get_default_compile_table_id(maat_inst->tbl_mgr);
|
int compile_table_id = table_manager_get_default_compile_table_id(maat_inst->tbl_mgr);
|
||||||
|
|||||||
@@ -807,15 +807,9 @@ static void get_candidate_super_group_ids(struct maat_group_topology *group_topo
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
long long *tmp = NULL;
|
for (int i = 0; i < utarray_len(group->incl_super_group_ids); i++) {
|
||||||
for (tmp = (long long *)utarray_front(group->incl_super_group_ids); tmp != NULL;
|
long long *tmp = (long long *)utarray_eltptr(group->incl_super_group_ids, i);
|
||||||
tmp = (long long *)utarray_next(group->incl_super_group_ids, tmp)) {
|
|
||||||
if (utarray_find(super_group_ids, tmp, compare_group_id)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
utarray_push_back(super_group_ids, tmp);
|
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)) {
|
p = (long long *)utarray_next(all_hit_group_ids, p)) {
|
||||||
utarray_push_back(candidate_group_ids, p);
|
utarray_push_back(candidate_group_ids, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
utarray_sort(candidate_group_ids, compare_group_id);
|
utarray_sort(candidate_group_ids, compare_group_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* verify sub exclude for candidate_super_group_ids
|
* 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;
|
for (p = (long long *)utarray_front(candidate_super_group_ids); p != NULL;
|
||||||
p = (long long *)utarray_next(candidate_super_group_ids, p)) {
|
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);
|
struct maat_group *group = group_topology_find_group(group_topo, *p);
|
||||||
assert(group != NULL);
|
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);
|
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_push_back(all_hit_group_ids, p);
|
||||||
|
}
|
||||||
|
|
||||||
utarray_sort(all_hit_group_ids, compare_group_id);
|
utarray_sort(all_hit_group_ids, compare_group_id);
|
||||||
}
|
|
||||||
}
|
|
||||||
utarray_sort(kept_super_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);
|
utarray_new(candidate_group_ids, &ut_group_id_icd);
|
||||||
|
|
||||||
for (i = 0; i < n_group_ids; i++) {
|
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(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);
|
get_super_group_ids(group_topo, candidate_group_ids, all_hit_group_ids, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
#include "log/log.h"
|
#include "log/log.h"
|
||||||
#include "cJSON/cJSON.h"
|
#include "cJSON/cJSON.h"
|
||||||
#include "maat_rule.h"
|
#include "maat_rule.h"
|
||||||
|
#include "uthash/utarray.h"
|
||||||
#include "maat_utils.h"
|
#include "maat_utils.h"
|
||||||
#include "maat_command.h"
|
#include "maat_command.h"
|
||||||
#include "maat_group.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 hit_group_ids[2] = {11, 13};
|
||||||
long long super_group_ids[MAX_ITEM_NUM];
|
long long super_group_ids[MAX_ITEM_NUM];
|
||||||
size_t super_group_cnt = 0;
|
|
||||||
struct timespec start, end;
|
struct timespec start, end;
|
||||||
struct log_handle *logger = MaatGroupExclude::logger;
|
struct log_handle *logger = MaatGroupExclude::logger;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
|
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);
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
|
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);
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
|
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);
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
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 hit_group_ids[2] = {14, 16};
|
||||||
long long super_group_ids[MAX_ITEM_NUM];
|
long long super_group_ids[MAX_ITEM_NUM];
|
||||||
size_t super_group_cnt = 0;
|
|
||||||
struct timespec start, end;
|
struct timespec start, end;
|
||||||
struct log_handle *logger = MaatGroupExclude::logger;
|
struct log_handle *logger = MaatGroupExclude::logger;
|
||||||
|
|
||||||
clock_gettime(CLOCK_MONOTONIC, &start);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
|
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);
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
long long time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &start);
|
||||||
for (int i = 0; i < MAX_G2G_SCAN_TIMES; i++) {
|
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);
|
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);
|
clock_gettime(CLOCK_MONOTONIC, &end);
|
||||||
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
time_elapse_ms = (end.tv_sec - start.tv_sec) * 1000 + (end.tv_nsec - start.tv_nsec) / 1000000;
|
||||||
|
|||||||
Reference in New Issue
Block a user