[FFmpeg-devel] [PATCH 06/11] tests/swscale: print performance stats on exit

Niklas Haas ffmpeg at haasn.xyz
Mon Mar 17 12:43:52 EET 2025


From: Niklas Haas <git at haasn.dev>

---
 libswscale/tests/swscale.c | 47 ++++++++++++++++++++++++++++++--------
 1 file changed, 38 insertions(+), 9 deletions(-)

diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c
index ea6c57ff2a..a2b960faa3 100644
--- a/libswscale/tests/swscale.c
+++ b/libswscale/tests/swscale.c
@@ -24,6 +24,7 @@
 #include <string.h>
 #include <inttypes.h>
 #include <stdarg.h>
+#include <signal.h>
 
 #undef HAVE_AV_CONFIG_H
 #include "libavutil/cpu.h"
@@ -71,6 +72,33 @@ const SwsFlags flags[] = {
 static FFSFC64 prng_state;
 static SwsContext *sws[3]; /* reused between tests for efficiency */
 
+static double speedup_logavg;
+static double speedup_min = 1e10;
+static double speedup_max = 0;
+static int speedup_count;
+
+static const char *speedup_color(double ratio)
+{
+    return ratio > 1.10 ? "\033[1;32m" : /* bold green */
+           ratio > 1.02 ? "\033[32m"   : /* green */
+           ratio > 0.98 ? ""           : /* default */
+           ratio > 0.95 ? "\033[33m"   : /* yellow */
+           ratio > 0.90 ? "\033[31m"   : /* red */
+            "\033[1;31m";  /* bold red */
+}
+
+static void exit_handler(int sig)
+{
+    if (speedup_count) {
+        double ratio = exp(speedup_logavg / speedup_count);
+        printf("Overall speedup=%.3fx %s%s\033[0m, min=%.3fx max=%.3fx\n", ratio,
+               speedup_color(ratio), ratio >= 1.0 ? "faster" : "slower",
+               speedup_min, speedup_max);
+    }
+
+    exit(sig);
+}
+
 static int fmt_comps(enum AVPixelFormat fmt)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt);
@@ -261,16 +289,16 @@ static int run_test(enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt,
 
     if (opts.bench && time_ref) {
         double ratio = (double) time_ref / time;
-        const char *color = ratio > 1.10 ? "\033[1;32m" : /* bold green */
-                            ratio > 1.02 ? "\033[32m"   : /* green */
-                            ratio > 0.98 ? ""           : /* default */
-                            ratio > 0.95 ? "\033[33m"   : /* yellow */
-                            ratio > 0.90 ? "\033[31m"   : /* red */
-                                           "\033[1;31m";  /* bold red */
+        if (FFMIN(time, time_ref) > 100 /* don't pollute stats with low precision */) {
+            speedup_min = FFMIN(speedup_min, ratio);
+            speedup_max = FFMAX(speedup_max, ratio);
+            speedup_logavg += log(ratio);
+            speedup_count++;
+        }
 
         printf("  time=%"PRId64" us, ref=%"PRId64" us, speedup=%.3fx %s%s\033[0m\n",
-               time / opts.iters, time_ref / opts.iters, ratio, color,
-               ratio >= 1.0 ? "faster" : "slower");
+               time / opts.iters, time_ref / opts.iters, ratio,
+               speedup_color(ratio), ratio >= 1.0 ? "faster" : "slower");
     } else if (opts.bench) {
         printf("  time=%"PRId64" us\n", time / opts.iters);
     }
@@ -492,6 +520,7 @@ bad_option:
 
     ff_sfc64_init(&prng_state, 0, 0, 0, 12);
     av_lfg_init(&rand, 1);
+    signal(SIGINT, exit_handler);
 
     for (int i = 0; i < 3; i++) {
         sws[i] = sws_alloc_context();
@@ -537,5 +566,5 @@ error:
     av_frame_free(&ref);
     if (fp)
         fclose(fp);
-    return ret;
+    exit_handler(ret);
 }
-- 
2.48.1



More information about the ffmpeg-devel mailing list