#include #include #include #include #include #define NOF_ELEM 100000LU #define STR_LEN 8LU typedef char fixed_string[STR_LEN]; #define BEGIN_MEASURE { \ struct timespec beg; \ clock_gettime(CLOCK_PROF, &beg); #define END_MEASURE(title) \ struct timespec end; \ clock_gettime(CLOCK_PROF, &end); \ printf("%17s: %lu\n", title, ((end.tv_sec * 1000000000L + end.tv_nsec) - \ (beg.tv_sec * 1000000000L + beg.tv_nsec)) / 1000); \ } const char * gen_str(void); const char * gen_str() { static fixed_string s; for (size_t i = 0; i < sizeof(fixed_string); ++i) { s[i] = rand() % 25 + 65; } return s; } int c_memcmp(const void *s1, const void *s2, size_t n); int main() { fixed_string * arr1 = malloc(NOF_ELEM * sizeof(*arr1)); fixed_string * arr2 = malloc(NOF_ELEM * sizeof(*arr2)); int * r1 = malloc(NOF_ELEM * sizeof(*r1)); int * r2 = malloc(NOF_ELEM * sizeof(*r2)); for (size_t i = 0; i < NOF_ELEM; ++i) { const char * s = gen_str(); memcpy(arr1[i], s, sizeof(*arr1)); memcpy(arr2[i], s, sizeof(*arr2)); } printf("%17s: %zu\n", "String length", STR_LEN); printf("%17s: %zu\n", "# elements", NOF_ELEM); /* * Compare different strings */ printf("%12s\n", "Different strings:"); /* memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r1[i] = memcmp(arr1[i], arr2[i + 1], sizeof(*arr1)); } END_MEASURE("asm memcmp") /* c memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r2[i] = c_memcmp(arr1[i], arr2[i + 1], sizeof(*arr1)); } END_MEASURE("c memcmp") /* check the results */ for (size_t i = 0; i < NOF_ELEM-1; ++i) { assert ((r1[i] == 0 && r2[i] == 0) || (r1[i] < 0 && r2[i] < 0) || (r1[i] > 0 && r2[i] > 0)); } /* * Compare equal strings */ printf("%17s\n", "Equal strings:"); /* memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r1[i] = memcmp(arr1[i], arr2[i], sizeof(*arr1)); } END_MEASURE("asm memcmp") /* c memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r2[i] = c_memcmp(arr1[i], arr2[i], sizeof(*arr1)); } END_MEASURE("c memcmp") /* check the results */ for (size_t i = 0; i < NOF_ELEM-1; ++i) { assert ((r1[i] == 0 && r2[i] == 0) || (r1[i] < 0 && r2[i] < 0) || (r1[i] > 0 && r2[i] > 0)); } /* * Compare equal pointers */ printf("%17s\n", "Equal pointers:"); /* memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r1[i] = memcmp(arr1[i], arr1[i], sizeof(*arr1)); } END_MEASURE("asm memcmp") /* c memcmp */ BEGIN_MEASURE for (size_t i = 0; i < NOF_ELEM - 1; ++i) { r2[i] = c_memcmp(arr1[i], arr1[i], sizeof(*arr1)); } END_MEASURE("c memcmp") /* check the results */ for (size_t i = 0; i < NOF_ELEM-1; ++i) { assert ((r1[i] == 0 && r2[i] == 0) || (r1[i] < 0 && r2[i] < 0) || (r1[i] > 0 && r2[i] > 0)); } }