mirror of https://github.com/xiph/flac
Remove microbench (#736)
This commit removes 'microbench', as it is no longer relevant. For more information on its former purpose, see https://lists.xiph.org/pipermail/flac-dev/2015-September/005608.html
This commit is contained in:
parent
b573a36ed8
commit
e2aef0c275
|
@ -74,7 +74,6 @@ test/metaflac.flac
|
||||||
test/picture.diff
|
test/picture.diff
|
||||||
test/picture.log
|
test/picture.log
|
||||||
.dirstamp
|
.dirstamp
|
||||||
microbench/benchmark_residual
|
|
||||||
/ogg/
|
/ogg/
|
||||||
oss-fuzz/fuzzer_decoder
|
oss-fuzz/fuzzer_decoder
|
||||||
oss-fuzz/fuzzer_seek
|
oss-fuzz/fuzzer_seek
|
||||||
|
|
|
@ -220,7 +220,6 @@ if(ENABLE_MULTITHREADING)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_subdirectory("src")
|
add_subdirectory("src")
|
||||||
add_subdirectory("microbench")
|
|
||||||
if(BUILD_DOCS)
|
if(BUILD_DOCS)
|
||||||
add_subdirectory("doc")
|
add_subdirectory("doc")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
SUBDIRS = doc include m4 man src test microbench oss-fuzz
|
SUBDIRS = doc include m4 man src test oss-fuzz
|
||||||
|
|
||||||
if EXAMPLES
|
if EXAMPLES
|
||||||
SUBDIRS += examples
|
SUBDIRS += examples
|
||||||
|
|
|
@ -587,7 +587,6 @@ AC_CONFIG_FILES([ \
|
||||||
test/flac-to-flac-metadata-test-files/Makefile \
|
test/flac-to-flac-metadata-test-files/Makefile \
|
||||||
test/metaflac-test-files/Makefile \
|
test/metaflac-test-files/Makefile \
|
||||||
test/pictures/Makefile \
|
test/pictures/Makefile \
|
||||||
microbench/Makefile \
|
|
||||||
oss-fuzz/Makefile
|
oss-fuzz/Makefile
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
if(MSVC)
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_REQUIRED_LIBRARIES rt)
|
|
||||||
check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
|
|
||||||
|
|
||||||
if(APPLE)
|
|
||||||
add_definitions(-DFLAC__SYS_DARWIN)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_executable(benchmark_residual benchmark_residual.c util.c)
|
|
||||||
target_include_directories(benchmark_residual PRIVATE
|
|
||||||
"$<TARGET_PROPERTY:FLAC,SOURCE_DIR>/include")
|
|
||||||
target_link_libraries(benchmark_residual
|
|
||||||
FLAC
|
|
||||||
$<$<BOOL:${HAVE_CLOCK_GETTIME}>:rt>)
|
|
|
@ -1,42 +0,0 @@
|
||||||
# FLAC - Free Lossless Audio Codec
|
|
||||||
# Copyright (C) 2015-2024 Xiph.Org Foundation
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions
|
|
||||||
# are met:
|
|
||||||
#
|
|
||||||
# - Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# - Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer in the
|
|
||||||
# documentation and/or other materials provided with the distribution.
|
|
||||||
#
|
|
||||||
# - Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/src/libFLAC/include
|
|
||||||
|
|
||||||
noinst_HEADERS = util.h
|
|
||||||
|
|
||||||
noinst_PROGRAMS = benchmark_residual
|
|
||||||
|
|
||||||
benchmark_residual_SOURCES = benchmark_residual.c util.c
|
|
||||||
|
|
||||||
benchmark_residual_LDADD = @LIB_CLOCK_GETTIME@
|
|
||||||
|
|
||||||
EXTRA_DIST = CMakeLists.txt
|
|
|
@ -1,151 +0,0 @@
|
||||||
/* libFLAC - Free Lossless Audio Codec library
|
|
||||||
* Copyright (C) 2000-2009 Josh Coalson
|
|
||||||
* Copyright (C) 2011-2024 Xiph.Org Foundation
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* - Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "FLAC/ordinals.h"
|
|
||||||
#include "share/compat.h"
|
|
||||||
#include "private/bitmath.h"
|
|
||||||
#include "private/fixed.h"
|
|
||||||
#include "private/macros.h"
|
|
||||||
#include "FLAC/assert.h"
|
|
||||||
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
static void FLAC__fixed_compute_residual_shift(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[])
|
|
||||||
{
|
|
||||||
const int idata_len = (int) data_len;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
switch(order) {
|
|
||||||
case 0:
|
|
||||||
FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0]));
|
|
||||||
memcpy(residual, data, sizeof(residual[0])*data_len);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - data[i-1];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - (data[i-1] << 1) + data[i-2];
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
FLAC__ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void FLAC__fixed_compute_residual_mult(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[])
|
|
||||||
{
|
|
||||||
const int idata_len = (int)data_len;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
switch(order) {
|
|
||||||
case 0:
|
|
||||||
FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0]));
|
|
||||||
memcpy(residual, data, sizeof(residual[0])*data_len);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - data[i-1];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - 2*data[i-1] + data[i-2];
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
for(i = 0; i < idata_len; i++)
|
|
||||||
residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
FLAC__ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static FLAC__int32 data [200000] ;
|
|
||||||
static FLAC__int32 residual [200000] ;
|
|
||||||
|
|
||||||
static unsigned bench_order = 0 ;
|
|
||||||
|
|
||||||
static void
|
|
||||||
bench_shift (void)
|
|
||||||
{ FLAC__fixed_compute_residual_shift (data, ARRAY_LEN (data), bench_order, residual) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
bench_mult (void)
|
|
||||||
{ FLAC__fixed_compute_residual_mult (data, ARRAY_LEN (data), bench_order, residual) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
main (void)
|
|
||||||
{ bench_stats stats ;
|
|
||||||
|
|
||||||
puts ("") ;
|
|
||||||
|
|
||||||
for (bench_order = 2 ; bench_order <= 4 ; bench_order ++) {
|
|
||||||
memset (&stats, 0, sizeof (stats)) ;
|
|
||||||
stats.testfunc = bench_shift ;
|
|
||||||
stats.run_count = 100 ;
|
|
||||||
stats.loop_count = 10 ;
|
|
||||||
|
|
||||||
benchmark_stats (&stats) ;
|
|
||||||
printf ("shift order %u : %f %f %f %f\n", bench_order, stats.min_time, stats.median_time, stats.mean_time, stats.max_time) ;
|
|
||||||
|
|
||||||
memset (&stats, 0, sizeof (stats)) ;
|
|
||||||
stats.testfunc = bench_mult ;
|
|
||||||
stats.run_count = 100 ;
|
|
||||||
stats.loop_count = 10 ;
|
|
||||||
|
|
||||||
benchmark_stats (&stats) ;
|
|
||||||
printf ("mult order %u : %f %f %f %f\n\n", bench_order, stats.min_time, stats.median_time, stats.mean_time, stats.max_time) ;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0 ;
|
|
||||||
}
|
|
|
@ -1,205 +0,0 @@
|
||||||
/* FLAC - Free Lossless Audio Codec
|
|
||||||
* Copyright (C) 2015-2024 Xiph.Org Foundation
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* - Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
#if defined _WIN32
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
static double
|
|
||||||
counter_diff (const LARGE_INTEGER * start, const LARGE_INTEGER * end)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER diff, freq;
|
|
||||||
|
|
||||||
QueryPerformanceFrequency(&freq);
|
|
||||||
diff.QuadPart = end->QuadPart - start->QuadPart;
|
|
||||||
|
|
||||||
return (double)diff.QuadPart/(double)freq.QuadPart;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
benchmark_function (void (*testfunc) (void), unsigned count)
|
|
||||||
{
|
|
||||||
LARGE_INTEGER start, end;
|
|
||||||
unsigned k;
|
|
||||||
|
|
||||||
QueryPerformanceCounter (&start) ;
|
|
||||||
|
|
||||||
for (k = 0 ; k < count ; k++)
|
|
||||||
testfunc();
|
|
||||||
|
|
||||||
QueryPerformanceCounter (&end) ;
|
|
||||||
|
|
||||||
return counter_diff (&start, &end) / count ;
|
|
||||||
} /* benchmark_function */
|
|
||||||
|
|
||||||
#elif defined FLAC__SYS_DARWIN
|
|
||||||
|
|
||||||
#include <mach/mach_time.h>
|
|
||||||
|
|
||||||
static double
|
|
||||||
counter_diff (const uint64_t * start, const uint64_t * end)
|
|
||||||
{
|
|
||||||
mach_timebase_info_data_t t_info;
|
|
||||||
mach_timebase_info(&t_info);
|
|
||||||
uint64_t duration = *end - *start;
|
|
||||||
|
|
||||||
return duration * ((double)t_info.numer/(double)t_info.denom);
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
benchmark_function (void (*testfunc) (void), unsigned count)
|
|
||||||
{
|
|
||||||
uint64_t start, end;
|
|
||||||
unsigned k;
|
|
||||||
|
|
||||||
start = mach_absolute_time();
|
|
||||||
|
|
||||||
for (k = 0 ; k < count ; k++)
|
|
||||||
testfunc();
|
|
||||||
|
|
||||||
end = mach_absolute_time();
|
|
||||||
|
|
||||||
return counter_diff (&start, &end) / count ;
|
|
||||||
} /* benchmark_function */
|
|
||||||
|
|
||||||
#elif defined HAVE_CLOCK_GETTIME
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
static double
|
|
||||||
timespec_diff (const struct timespec * start, const struct timespec * end)
|
|
||||||
{ struct timespec diff;
|
|
||||||
|
|
||||||
if (end->tv_nsec - start->tv_nsec < 0)
|
|
||||||
{ diff.tv_sec = end->tv_sec - start->tv_sec - 1 ;
|
|
||||||
diff.tv_nsec = 1000000000 + end->tv_nsec - start->tv_nsec ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ diff.tv_sec = end->tv_sec - start->tv_sec ;
|
|
||||||
diff.tv_nsec = end->tv_nsec-start->tv_nsec ;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
return diff.tv_sec + 1e-9 * diff.tv_nsec ;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
benchmark_function (void (*testfunc) (void), unsigned count)
|
|
||||||
{ struct timespec start, end;
|
|
||||||
unsigned k ;
|
|
||||||
|
|
||||||
clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &start) ;
|
|
||||||
|
|
||||||
for (k = 0 ; k < count ; k++)
|
|
||||||
testfunc () ;
|
|
||||||
|
|
||||||
clock_gettime (CLOCK_PROCESS_CPUTIME_ID, &end) ;
|
|
||||||
|
|
||||||
return timespec_diff (&start, &end) / count ;
|
|
||||||
} /* benchmark_function */
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
|
|
||||||
static double
|
|
||||||
timeval_diff (const struct timeval * start, const struct timeval * end)
|
|
||||||
{ struct timeval diff;
|
|
||||||
|
|
||||||
if (end->tv_usec - start->tv_usec < 0)
|
|
||||||
{ diff.tv_sec = end->tv_sec - start->tv_sec - 1 ;
|
|
||||||
diff.tv_usec = 1000000 + end->tv_usec - start->tv_usec ;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ diff.tv_sec = end->tv_sec - start->tv_sec ;
|
|
||||||
diff.tv_usec = end->tv_usec-start->tv_usec ;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
return diff.tv_sec + 1e-6 * diff.tv_usec ;
|
|
||||||
}
|
|
||||||
|
|
||||||
double
|
|
||||||
benchmark_function (void (*testfunc) (void), unsigned count)
|
|
||||||
{ struct timeval start, end;
|
|
||||||
unsigned k ;
|
|
||||||
|
|
||||||
gettimeofday(&start, NULL);
|
|
||||||
|
|
||||||
for (k = 0 ; k < count ; k++)
|
|
||||||
testfunc () ;
|
|
||||||
|
|
||||||
gettimeofday(&end, NULL);
|
|
||||||
|
|
||||||
return timeval_diff (&start, &end) / count ;
|
|
||||||
} /* benchmark_function */
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int
|
|
||||||
double_cmp (const void * a, const void * b)
|
|
||||||
{ const double * pa = (double *) a ;
|
|
||||||
const double * pb = (double *) b ;
|
|
||||||
return pa [0] < pb [0] ;
|
|
||||||
} /* double_cmp */
|
|
||||||
|
|
||||||
void
|
|
||||||
benchmark_stats (bench_stats * stats)
|
|
||||||
{ double sum, times [stats->run_count] ;
|
|
||||||
unsigned k ;
|
|
||||||
|
|
||||||
for (k = 0 ; k < stats->run_count ; k++)
|
|
||||||
times [k] = benchmark_function (stats->testfunc, stats->loop_count) ;
|
|
||||||
|
|
||||||
qsort (times, stats->run_count, sizeof (times [0]), double_cmp) ;
|
|
||||||
|
|
||||||
sum = 0.0 ;
|
|
||||||
stats->min_time = stats->max_time = times [0] ;
|
|
||||||
for (k = 0 ; k < stats->run_count ; k++)
|
|
||||||
{ stats->min_time = stats->min_time < times [k] ? stats->min_time : times [k] ;
|
|
||||||
stats->max_time = stats->max_time > times [k] ? stats->max_time : times [k] ;
|
|
||||||
sum += times [k] ;
|
|
||||||
}
|
|
||||||
stats->mean_time = sum / stats->run_count ;
|
|
||||||
if (stats->run_count & 1)
|
|
||||||
stats->median_time = times [(stats->run_count + 1) / 2] ;
|
|
||||||
else
|
|
||||||
stats->median_time = 0.5 * (times [stats->run_count / 2] + times [(stats->run_count / 2) + 1]) ;
|
|
||||||
|
|
||||||
return ;
|
|
||||||
} /* benchmark_stats */
|
|
|
@ -1,43 +0,0 @@
|
||||||
/* FLAC - Free Lossless Audio Codec
|
|
||||||
* Copyright (C) 2015-2024 Xiph.Org Foundation
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms, with or without
|
|
||||||
* modification, are permitted provided that the following conditions
|
|
||||||
* are met:
|
|
||||||
*
|
|
||||||
* - Redistributions of source code must retain the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer.
|
|
||||||
*
|
|
||||||
* - Redistributions in binary form must reproduce the above copyright
|
|
||||||
* notice, this list of conditions and the following disclaimer in the
|
|
||||||
* documentation and/or other materials provided with the distribution.
|
|
||||||
*
|
|
||||||
* - Neither the name of the Xiph.org Foundation nor the names of its
|
|
||||||
* contributors may be used to endorse or promote products derived from
|
|
||||||
* this software without specific prior written permission.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
|
|
||||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
||||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
||||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define ARRAY_LEN(x) ((sizeof (x) / sizeof (x [0])))
|
|
||||||
|
|
||||||
typedef struct bench_stats
|
|
||||||
{ void (*testfunc) (void) ;
|
|
||||||
unsigned run_count ;
|
|
||||||
unsigned loop_count ;
|
|
||||||
double min_time, mean_time, median_time, max_time ;
|
|
||||||
} bench_stats ;
|
|
||||||
|
|
||||||
double benchmark_function (void (*testfunc) (void), unsigned count) ;
|
|
||||||
|
|
||||||
void benchmark_stats (bench_stats * stats) ;
|
|
Loading…
Reference in New Issue