| // SPDX-License-Identifier: GPL-2.0 | |
| #include <malloc.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <time.h> | |
| #include "utils.h" | |
| #define SIZE 256 | |
| #define ITERATIONS 1000 | |
| #define ITERATIONS_BENCH 100000 | |
| int test_strlen(const void *s); | |
| /* test all offsets and lengths */ | |
| static void test_one(char *s) | |
| { | |
| unsigned long offset; | |
| for (offset = 0; offset < SIZE; offset++) { | |
| int x, y; | |
| unsigned long i; | |
| y = strlen(s + offset); | |
| x = test_strlen(s + offset); | |
| if (x != y) { | |
| printf("strlen() returned %d, should have returned %d (%p offset %ld)\n", x, y, s, offset); | |
| for (i = offset; i < SIZE; i++) | |
| printf("%02x ", s[i]); | |
| printf("\n"); | |
| } | |
| } | |
| } | |
| static void bench_test(char *s) | |
| { | |
| struct timespec ts_start, ts_end; | |
| int i; | |
| clock_gettime(CLOCK_MONOTONIC, &ts_start); | |
| for (i = 0; i < ITERATIONS_BENCH; i++) | |
| test_strlen(s); | |
| clock_gettime(CLOCK_MONOTONIC, &ts_end); | |
| printf("len %3.3d : time = %.6f\n", test_strlen(s), ts_end.tv_sec - ts_start.tv_sec + (ts_end.tv_nsec - ts_start.tv_nsec) / 1e9); | |
| } | |
| static int testcase(void) | |
| { | |
| char *s; | |
| unsigned long i; | |
| s = memalign(128, SIZE); | |
| if (!s) { | |
| perror("memalign"); | |
| exit(1); | |
| } | |
| srandom(1); | |
| memset(s, 0, SIZE); | |
| for (i = 0; i < SIZE; i++) { | |
| char c; | |
| do { | |
| c = random() & 0x7f; | |
| } while (!c); | |
| s[i] = c; | |
| test_one(s); | |
| } | |
| for (i = 0; i < ITERATIONS; i++) { | |
| unsigned long j; | |
| for (j = 0; j < SIZE; j++) { | |
| char c; | |
| do { | |
| c = random() & 0x7f; | |
| } while (!c); | |
| s[j] = c; | |
| } | |
| for (j = 0; j < sizeof(long); j++) { | |
| s[SIZE - 1 - j] = 0; | |
| test_one(s); | |
| } | |
| } | |
| for (i = 0; i < SIZE; i++) { | |
| char c; | |
| do { | |
| c = random() & 0x7f; | |
| } while (!c); | |
| s[i] = c; | |
| } | |
| bench_test(s); | |
| s[16] = 0; | |
| bench_test(s); | |
| s[8] = 0; | |
| bench_test(s); | |
| s[4] = 0; | |
| bench_test(s); | |
| s[3] = 0; | |
| bench_test(s); | |
| s[2] = 0; | |
| bench_test(s); | |
| s[1] = 0; | |
| bench_test(s); | |
| return 0; | |
| } | |
| int main(void) | |
| { | |
| return test_harness(testcase, "strlen"); | |
| } |