You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2021/06/11 12:52:12 UTC
[incubator-nuttx-apps] 01/05: iperf: improve report precision
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git
commit e8ed125fea7f733c2f768c38dcc47183250e30e9
Author: YAMAMOTO Takashi <ya...@midokura.com>
AuthorDate: Thu Jun 10 13:23:14 2021 +0900
iperf: improve report precision
---
netutils/iperf/Kconfig | 1 +
netutils/iperf/iperf.c | 78 +++++++++++++++++++++++++++++++++++++++++---------
2 files changed, 66 insertions(+), 13 deletions(-)
diff --git a/netutils/iperf/Kconfig b/netutils/iperf/Kconfig
index 3cebb9c..0954ef7 100644
--- a/netutils/iperf/Kconfig
+++ b/netutils/iperf/Kconfig
@@ -10,6 +10,7 @@ config NETUTILS_IPERF
select NETUTILS_NETLIB
select LIBC_FLOATINGPOINT
select SYSTEM_ARGTABLE3
+ select CLOCK_MONOTONIC
---help---
Enable the \"iperf example\"
diff --git a/netutils/iperf/iperf.c b/netutils/iperf/iperf.c
index e56a0d2..de22995 100644
--- a/netutils/iperf/iperf.c
+++ b/netutils/iperf/iperf.c
@@ -57,7 +57,7 @@ struct iperf_ctrl_t
{
struct iperf_cfg_t cfg;
bool finish;
- uint32_t total_len;
+ uintmax_t total_len;
uint32_t buffer_len;
uint8_t *buffer;
uint32_t sockfd;
@@ -190,6 +190,32 @@ static int iperf_show_socket_error_reason(const char *str, int sockfd)
}
/****************************************************************************
+ * Name: ts_sec
+ *
+ * Description:
+ * Convert a timespec to a double.
+ *
+ ****************************************************************************/
+
+static double ts_sec(const struct timespec *ts)
+{
+ return (double)ts->tv_sec + (double)ts->tv_nsec / 1e9;
+}
+
+/****************************************************************************
+ * Name: ts_diff
+ *
+ * Description:
+ * Return the diff of two timespecs in second.
+ *
+ ****************************************************************************/
+
+static double ts_diff(const struct timespec *a, const struct timespec *b)
+{
+ return ts_sec(a) - ts_sec(b);
+}
+
+/****************************************************************************
* Name: iperf_report_task
*
* Description:
@@ -201,29 +227,55 @@ static void iperf_report_task(void *arg)
{
uint32_t interval = s_iperf_ctrl.cfg.interval;
uint32_t time = s_iperf_ctrl.cfg.time;
- uint32_t last_len = 0;
- uint32_t cur = 0;
+ struct timespec now;
+ struct timespec start;
+ uintmax_t now_len;
+ int ret;
+ now_len = s_iperf_ctrl.total_len;
+ ret = clock_gettime(CLOCK_MONOTONIC, &now);
+ if (ret != 0)
+ {
+ fprintf(stderr, "clock_gettime failed\n");
+ exit(EXIT_FAILURE);
+ }
+
+ start = now;
printf("\n%16s %s\n", "Interval", "Bandwidth\n");
while (!s_iperf_ctrl.finish)
{
+ uintmax_t last_len;
+ struct timespec last;
+
sleep(interval);
- printf("%4" PRId32 "-%4" PRId32 " sec, %.2f Mbits/sec\n",
- cur, cur + interval,
- (double)((s_iperf_ctrl.total_len - last_len) * 8) /
- interval / 1e6);
- cur += interval;
- last_len = s_iperf_ctrl.total_len;
- if (cur >= time)
+ last_len = now_len;
+ last = now;
+ now_len = s_iperf_ctrl.total_len;
+ ret = clock_gettime(CLOCK_MONOTONIC, &now);
+ if (ret != 0)
+ {
+ fprintf(stderr, "clock_gettime failed\n");
+ exit(EXIT_FAILURE);
+ }
+
+ printf("%4.2lf-%4.2lf sec, %.2f Mbits/sec\n",
+ ts_diff(&last, &start),
+ ts_diff(&now, &start),
+ (((double)(now_len - last_len) * 8) /
+ ts_diff(&now, &last) / 1e6));
+ if (ts_diff(&now, &start) >= time)
{
break;
}
}
- if (cur != 0)
+ if (ts_diff(&now, &start) > 0)
{
- printf("%4d-%4" PRId32 " sec, %.2f Mbits/sec\n", 0, time,
- (double)(s_iperf_ctrl.total_len * 8) / cur / 1e6);
+ printf("%4.2lf-%4.2lf sec, %.2f Mbits/sec\n",
+ ts_diff(&start, &start),
+ ts_diff(&now, &start),
+ (((double)now_len * 8) /
+ ts_diff(&now, &start) / 1e6));
}
s_iperf_ctrl.finish = true;