annotate src/libsamplerate-0.1.9/tests/throughput_test.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 481f5f8c5634
children
rev   line source
Chris@41 1 /*
Chris@41 2 ** Copyright (c) 2004-2016, Erik de Castro Lopo <erikd@mega-nerd.com>
Chris@41 3 ** All rights reserved.
Chris@41 4 **
Chris@41 5 ** This code is released under 2-clause BSD license. Please see the
Chris@41 6 ** file at : https://github.com/erikd/libsamplerate/blob/master/COPYING
Chris@41 7 */
Chris@41 8
Chris@41 9 #include <stdio.h>
Chris@41 10 #include <stdlib.h>
Chris@41 11 #include <string.h>
Chris@41 12 #include <time.h>
Chris@41 13 #include <unistd.h>
Chris@41 14
Chris@41 15 #include <samplerate.h>
Chris@41 16
Chris@41 17 #include "config.h"
Chris@41 18
Chris@41 19 #include "util.h"
Chris@41 20 #include "float_cast.h"
Chris@41 21
Chris@41 22 #define BUFFER_LEN (1<<16)
Chris@41 23
Chris@41 24 static float input [BUFFER_LEN] ;
Chris@41 25 static float output [BUFFER_LEN] ;
Chris@41 26
Chris@41 27 static long
Chris@41 28 throughput_test (int converter, long best_throughput)
Chris@41 29 { SRC_DATA src_data ;
Chris@41 30 clock_t start_time, clock_time ;
Chris@41 31 double duration ;
Chris@41 32 long total_frames = 0, throughput ;
Chris@41 33 int error ;
Chris@41 34
Chris@41 35 printf (" %-30s ", src_get_name (converter)) ;
Chris@41 36 fflush (stdout) ;
Chris@41 37
Chris@41 38 src_data.data_in = input ;
Chris@41 39 src_data.input_frames = ARRAY_LEN (input) ;
Chris@41 40
Chris@41 41 src_data.data_out = output ;
Chris@41 42 src_data.output_frames = ARRAY_LEN (output) ;
Chris@41 43
Chris@41 44 src_data.src_ratio = 0.99 ;
Chris@41 45
Chris@41 46 sleep (2) ;
Chris@41 47
Chris@41 48 start_time = clock () ;
Chris@41 49
Chris@41 50 do
Chris@41 51 {
Chris@41 52 if ((error = src_simple (&src_data, converter, 1)) != 0)
Chris@41 53 { puts (src_strerror (error)) ;
Chris@41 54 exit (1) ;
Chris@41 55 } ;
Chris@41 56
Chris@41 57 total_frames += src_data.output_frames_gen ;
Chris@41 58
Chris@41 59 clock_time = clock () - start_time ;
Chris@41 60 duration = (1.0 * clock_time) / CLOCKS_PER_SEC ;
Chris@41 61 }
Chris@41 62 while (duration < 3.0) ;
Chris@41 63
Chris@41 64 if (src_data.input_frames_used != ARRAY_LEN (input))
Chris@41 65 { printf ("\n\nLine %d : input frames used %ld should be %d\n", __LINE__, src_data.input_frames_used, ARRAY_LEN (input)) ;
Chris@41 66 exit (1) ;
Chris@41 67 } ;
Chris@41 68
Chris@41 69 if (fabs (src_data.src_ratio * src_data.input_frames_used - src_data.output_frames_gen) > 2)
Chris@41 70 { printf ("\n\nLine %d : input / output length mismatch.\n\n", __LINE__) ;
Chris@41 71 printf (" input len : %d\n", ARRAY_LEN (input)) ;
Chris@41 72 printf (" output len : %ld (should be %g +/- 2)\n\n", src_data.output_frames_gen,
Chris@41 73 floor (0.5 + src_data.src_ratio * src_data.input_frames_used)) ;
Chris@41 74 exit (1) ;
Chris@41 75 } ;
Chris@41 76
Chris@41 77 throughput = lrint (floor (total_frames / duration)) ;
Chris@41 78
Chris@41 79 if (best_throughput == 0)
Chris@41 80 { best_throughput = MAX (throughput, best_throughput) ;
Chris@41 81 printf ("%5.2f %10ld\n", duration, throughput) ;
Chris@41 82 }
Chris@41 83 else
Chris@41 84 { best_throughput = MAX (throughput, best_throughput) ;
Chris@41 85 printf ("%5.2f %10ld %10ld\n", duration, throughput, best_throughput) ;
Chris@41 86 }
Chris@41 87
Chris@41 88
Chris@41 89 return best_throughput ;
Chris@41 90 } /* throughput_test */
Chris@41 91
Chris@41 92 static void
Chris@41 93 single_run (void)
Chris@41 94 {
Chris@41 95
Chris@41 96 printf ("\n CPU name : %s\n", get_cpu_name ()) ;
Chris@41 97
Chris@41 98 puts (
Chris@41 99 "\n"
Chris@41 100 " Converter Duration Throughput\n"
Chris@41 101 " -----------------------------------------------------------"
Chris@41 102 ) ;
Chris@41 103
Chris@41 104 throughput_test (SRC_ZERO_ORDER_HOLD, 0) ;
Chris@41 105 throughput_test (SRC_LINEAR, 0) ;
Chris@41 106 throughput_test (SRC_SINC_FASTEST, 0) ;
Chris@41 107 throughput_test (SRC_SINC_MEDIUM_QUALITY, 0) ;
Chris@41 108 throughput_test (SRC_SINC_BEST_QUALITY, 0) ;
Chris@41 109
Chris@41 110 puts ("") ;
Chris@41 111 return ;
Chris@41 112 } /* single_run */
Chris@41 113
Chris@41 114 static void
Chris@41 115 multi_run (int run_count)
Chris@41 116 { long zero_order_hold = 0, linear = 0 ;
Chris@41 117 long sinc_fastest = 0, sinc_medium = 0, sinc_best = 0 ;
Chris@41 118 int k ;
Chris@41 119
Chris@41 120 puts (
Chris@41 121 "\n"
Chris@41 122 " Converter Duration Throughput Best Throughput\n"
Chris@41 123 " --------------------------------------------------------------------------------"
Chris@41 124 ) ;
Chris@41 125
Chris@41 126 for (k = 0 ; k < run_count ; k++)
Chris@41 127 { zero_order_hold = throughput_test (SRC_ZERO_ORDER_HOLD, zero_order_hold) ;
Chris@41 128 linear = throughput_test (SRC_LINEAR, linear) ;
Chris@41 129 sinc_fastest = throughput_test (SRC_SINC_FASTEST, sinc_fastest) ;
Chris@41 130 sinc_medium = throughput_test (SRC_SINC_MEDIUM_QUALITY, sinc_medium) ;
Chris@41 131 sinc_best = throughput_test (SRC_SINC_BEST_QUALITY, sinc_best) ;
Chris@41 132
Chris@41 133 puts ("") ;
Chris@41 134
Chris@41 135 /* Let the CPU cool down. We might be running on a laptop. */
Chris@41 136 sleep (10) ;
Chris@41 137 } ;
Chris@41 138
Chris@41 139 printf ("\n CPU name : %s\n", get_cpu_name ()) ;
Chris@41 140
Chris@41 141 puts (
Chris@41 142 "\n"
Chris@41 143 " Converter Best Throughput\n"
Chris@41 144 " ------------------------------------------------"
Chris@41 145 ) ;
Chris@41 146 printf (" %-30s %10ld\n", src_get_name (SRC_ZERO_ORDER_HOLD), zero_order_hold) ;
Chris@41 147 printf (" %-30s %10ld\n", src_get_name (SRC_LINEAR), linear) ;
Chris@41 148 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_FASTEST), sinc_fastest) ;
Chris@41 149 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_MEDIUM_QUALITY), sinc_medium) ;
Chris@41 150 printf (" %-30s %10ld\n", src_get_name (SRC_SINC_BEST_QUALITY), sinc_best) ;
Chris@41 151
Chris@41 152 puts ("") ;
Chris@41 153 } /* multi_run */
Chris@41 154
Chris@41 155 static void
Chris@41 156 usage_exit (const char * argv0)
Chris@41 157 { const char * cptr ;
Chris@41 158
Chris@41 159 if ((cptr = strrchr (argv0, '/')) != NULL)
Chris@41 160 argv0 = cptr ;
Chris@41 161
Chris@41 162 printf (
Chris@41 163 "Usage :\n"
Chris@41 164 " %s - Single run of the throughput test.\n"
Chris@41 165 " %s --best-of N - Do N runs of test a print bext result.\n"
Chris@41 166 "\n",
Chris@41 167 argv0, argv0) ;
Chris@41 168
Chris@41 169 exit (0) ;
Chris@41 170 } /* usage_exit */
Chris@41 171
Chris@41 172 int
Chris@41 173 main (int argc, char ** argv)
Chris@41 174 { double freq ;
Chris@41 175
Chris@41 176 memset (input, 0, sizeof (input)) ;
Chris@41 177 freq = 0.01 ;
Chris@41 178 gen_windowed_sines (1, &freq, 1.0, input, BUFFER_LEN) ;
Chris@41 179
Chris@41 180 if (argc == 1)
Chris@41 181 single_run () ;
Chris@41 182 else if (argc == 3 && strcmp (argv [1], "--best-of") == 0)
Chris@41 183 { int run_count = atoi (argv [2]) ;
Chris@41 184
Chris@41 185 if (run_count < 1 || run_count > 20)
Chris@41 186 { printf ("Please be sensible. Run count should be in range (1, 10].\n") ;
Chris@41 187 exit (1) ;
Chris@41 188 } ;
Chris@41 189
Chris@41 190 multi_run (run_count) ;
Chris@41 191 }
Chris@41 192 else
Chris@41 193 usage_exit (argv [0]) ;
Chris@41 194
Chris@41 195 puts (
Chris@41 196 " Duration is in seconds.\n"
Chris@41 197 " Throughput is in samples/sec (more is better).\n"
Chris@41 198 ) ;
Chris@41 199
Chris@41 200 return 0 ;
Chris@41 201 } /* main */
Chris@41 202