app/flow-perf: change clock measurement
authorWisam Jaddo <wisamm@nvidia.com>
Thu, 26 Nov 2020 11:15:42 +0000 (13:15 +0200)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 7 Jan 2021 14:28:06 +0000 (15:28 +0100)
The clock() function is not good practice to use for multiple
cores/threads, since it measures the CPU time used by the process
and not the wall clock time, while when running through multiple
cores/threads simultaneously, we can burn through CPU time much
faster.

As a result this commit will change the way of measurement to use
rd_tsc, and the results will be divided by the processor frequency.

Signed-off-by: Wisam Jaddo <wisamm@nvidia.com>
Reviewed-by: Alexander Kozyrev <akozyrev@nvidia.com>
Reviewed-by: Suanming Mou <suanmingm@nvidia.com>
app/test-flow-perf/main.c

index 663b2e9..3a0e4c1 100644 (file)
@@ -889,7 +889,7 @@ destroy_flows(int port_id, uint8_t core_id, struct rte_flow **flows_list)
 
        rules_count_per_core = rules_count / mc_pool.cores_count;
 
-       start_batch = clock();
+       start_batch = rte_rdtsc();
        for (i = 0; i < (uint32_t) rules_count_per_core; i++) {
                if (flows_list[i] == 0)
                        break;
@@ -907,12 +907,12 @@ destroy_flows(int port_id, uint8_t core_id, struct rte_flow **flows_list)
                 * for this batch.
                 */
                if (!((i + 1) % rules_batch)) {
-                       end_batch = clock();
+                       end_batch = rte_rdtsc();
                        delta = (double) (end_batch - start_batch);
                        rules_batch_idx = ((i + 1) / rules_batch) - 1;
-                       cpu_time_per_batch[rules_batch_idx] = delta / CLOCKS_PER_SEC;
+                       cpu_time_per_batch[rules_batch_idx] = delta / rte_get_tsc_hz();
                        cpu_time_used += cpu_time_per_batch[rules_batch_idx];
-                       start_batch = clock();
+                       start_batch = rte_rdtsc();
                }
        }
 
@@ -985,7 +985,7 @@ insert_flows(int port_id, uint8_t core_id)
                flows_list[flow_index++] = flow;
        }
 
-       start_batch = clock();
+       start_batch = rte_rdtsc();
        for (counter = start_counter; counter < end_counter; counter++) {
                flow = generate_flow(port_id, flow_group,
                        flow_attrs, flow_items, flow_actions,
@@ -1011,12 +1011,12 @@ insert_flows(int port_id, uint8_t core_id)
                 * for this batch.
                 */
                if (!((counter + 1) % rules_batch)) {
-                       end_batch = clock();
+                       end_batch = rte_rdtsc();
                        delta = (double) (end_batch - start_batch);
                        rules_batch_idx = ((counter + 1) / rules_batch) - 1;
-                       cpu_time_per_batch[rules_batch_idx] = delta / CLOCKS_PER_SEC;
+                       cpu_time_per_batch[rules_batch_idx] = delta / rte_get_tsc_hz();
                        cpu_time_used += cpu_time_per_batch[rules_batch_idx];
-                       start_batch = clock();
+                       start_batch = rte_rdtsc();
                }
        }