#include #include typedef _Bool bool; #define true 1 #define false 0 #define unlikely(x) (x) typedef unsigned int u32; typedef unsigned long long u64; #define HASH_LEN_DECLARE u32 hash; u32 len struct qstr { union { struct { HASH_LEN_DECLARE; }; u64 hash_len; }; const char *name; }; bool is_dot_dotdot_1(const struct qstr *str) { if (str->len == 1 && str->name[0] == '.') return true; if (str->len == 2 && str->name[0] == '.' && str->name[1] == '.') return true; return false; } bool is_dot_dotdot_2(const struct qstr *str) { if (unlikely(str->name[0] == '.')) { if (str->len < 2 || (str->len == 2 && str->name[1] == '.')) return false; } return true; } double time_sub(struct timespec *before, struct timespec *after) { struct timespec diff = { .tv_sec = after->tv_sec - before->tv_sec, .tv_nsec = after->tv_nsec - before->tv_nsec }; if (diff.tv_nsec < 0) { diff.tv_nsec += 1000 * 1000 * 1000; diff.tv_sec -= 1; } return diff.tv_sec + diff.tv_nsec * 0.0000000001d; } bool res; void mytime(const struct qstr *qstr) { unsigned int i; struct timespec start, middle, end; clock_gettime(CLOCK_THREAD_CPUTIME_ID, &start); for (i = 0; i < 100000000; i++) res = is_dot_dotdot_1(qstr); clock_gettime(CLOCK_THREAD_CPUTIME_ID, &middle); for (i = 0; i < 100000000; i++) res = is_dot_dotdot_2(qstr); clock_gettime(CLOCK_THREAD_CPUTIME_ID, &end); printf("qstr %s time_1 %f time_2 %f\n", qstr->name, time_sub(&start, &middle), time_sub(&middle, &end)); } int main(int argc, char **argv) { struct qstr dot = { .len = 1, .name = "." }; struct qstr dotdot = { .len = 2, .name = ".." }; struct qstr a = { .len = 1, .name = "a" }; struct qstr matthew = { .len = 7, .name = "matthew" }; struct qstr dota = { .len = 2, .name = ".a" }; struct qstr comma = { .len = 1, .name = "," }; mytime(&dot); mytime(&dotdot); mytime(&a); mytime(&matthew); mytime(&dota); mytime(&comma); return 0; }