| 34 | #endif |
| 35 | |
| 36 | static int |
| 37 | test_timer_perf(void) |
| 38 | { |
| 39 | unsigned iterations = 100; |
| 40 | unsigned i; |
| 41 | struct rte_timer *tms; |
| 42 | uint64_t start_tsc, end_tsc, delay_start; |
| 43 | unsigned lcore_id = rte_lcore_id(); |
| 44 | |
| 45 | tms = rte_malloc(NULL, sizeof(*tms) * MAX_ITERATIONS, 0); |
| 46 | |
| 47 | for (i = 0; i < MAX_ITERATIONS; i++) |
| 48 | rte_timer_init(&tms[i]); |
| 49 | |
| 50 | const uint64_t ticks = rte_get_timer_hz() * DELAY_SECONDS; |
| 51 | const uint64_t ticks_per_ms = rte_get_tsc_hz()/1000; |
| 52 | const uint64_t ticks_per_us = ticks_per_ms/1000; |
| 53 | |
| 54 | while (iterations <= MAX_ITERATIONS) { |
| 55 | |
| 56 | printf("Appending %u timers\n", iterations); |
| 57 | start_tsc = rte_rdtsc(); |
| 58 | for (i = 0; i < iterations; i++) |
| 59 | rte_timer_reset(&tms[i], ticks, SINGLE, lcore_id, |
| 60 | timer_cb, NULL); |
| 61 | end_tsc = rte_rdtsc(); |
| 62 | printf("Time for %u timers: %"PRIu64" (%"PRIu64"ms), ", iterations, |
| 63 | end_tsc-start_tsc, (end_tsc-start_tsc+ticks_per_ms/2)/(ticks_per_ms)); |
| 64 | printf("Time per timer: %"PRIu64" (%"PRIu64"us)\n", |
| 65 | (end_tsc-start_tsc)/iterations, |
| 66 | ((end_tsc-start_tsc)/iterations+ticks_per_us/2)/(ticks_per_us)); |
| 67 | outstanding_count = iterations; |
| 68 | delay_start = rte_get_timer_cycles(); |
| 69 | while (rte_get_timer_cycles() < delay_start + ticks) |
| 70 | do_delay(); |
| 71 | |
| 72 | start_tsc = rte_rdtsc(); |
| 73 | while (outstanding_count) |
| 74 | rte_timer_manage(); |
| 75 | end_tsc = rte_rdtsc(); |
| 76 | printf("Time for %u callbacks: %"PRIu64" (%"PRIu64"ms), ", iterations, |
| 77 | end_tsc-start_tsc, (end_tsc-start_tsc+ticks_per_ms/2)/(ticks_per_ms)); |
| 78 | printf("Time per callback: %"PRIu64" (%"PRIu64"us)\n", |
| 79 | (end_tsc-start_tsc)/iterations, |
| 80 | ((end_tsc-start_tsc)/iterations+ticks_per_us/2)/(ticks_per_us)); |
| 81 | |
| 82 | printf("Resetting %u timers\n", iterations); |
| 83 | start_tsc = rte_rdtsc(); |
| 84 | for (i = 0; i < iterations; i++) |
| 85 | rte_timer_reset(&tms[i], rte_rand() % ticks, SINGLE, lcore_id, |
| 86 | timer_cb, NULL); |
| 87 | end_tsc = rte_rdtsc(); |
| 88 | printf("Time for %u timers: %"PRIu64" (%"PRIu64"ms), ", iterations, |
| 89 | end_tsc-start_tsc, (end_tsc-start_tsc+ticks_per_ms/2)/(ticks_per_ms)); |
| 90 | printf("Time per timer: %"PRIu64" (%"PRIu64"us)\n", |
| 91 | (end_tsc-start_tsc)/iterations, |
| 92 | ((end_tsc-start_tsc)/iterations+ticks_per_us/2)/(ticks_per_us)); |
| 93 | outstanding_count = iterations; |
nothing calls this directly
no test coverage detected