flac/Limit-the-number-of-clock-calls.patch
2024-12-10 09:48:20 +08:00

104 lines
3.7 KiB
Diff

From 32b73cbced65208758d0d610327c600828db45ae Mon Sep 17 00:00:00 2001
From: Martijn van Beurden <mvanb1@gmail.com>
Date: Tue, 27 Jun 2023 10:39:09 +0200
Subject: [PATCH] Limit the number of clock() calls
The overhead of calling clock() when encoding/decoding very small
frames turned out to be very large, for framesize 16 these syscalls
took over half the execution time. This commit only calls clock()
when at least 10.000 samples have been encoded or 25.000 samples
have been decoded since the last call to clock()
---
src/flac/decode.c | 19 ++++++++++++++-----
src/flac/encode.c | 19 ++++++++++++++-----
2 files changed, 28 insertions(+), 10 deletions(-)
diff --git a/src/flac/decode.c b/src/flac/decode.c
index 90f7a6c860..e832d70731 100644
--- a/src/flac/decode.c
+++ b/src/flac/decode.c
@@ -94,7 +94,8 @@ typedef struct {
foreign_metadata_t *foreign_metadata; /* NULL unless --keep-foreign-metadata requested */
FLAC__off_t fm_offset1, fm_offset2, fm_offset3;
- clock_t old_clock_t;
+ clock_t old_clock;
+ FLAC__uint64 old_samples_processed;
} DecoderSession;
@@ -253,7 +254,8 @@ FLAC__bool DecoderSession_construct(DecoderSession *d, FLAC__bool is_ogg, FLAC__
d->foreign_metadata = foreign_metadata;
- d->old_clock_t = 0;
+ d->old_clock = 0;
+ d->old_samples_processed = 0;
FLAC__ASSERT(!(d->test_only && d->analysis_mode));
@@ -1239,9 +1241,16 @@ FLAC__StreamDecoderWriteStatus write_callback(const FLAC__StreamDecoder *decoder
if(!(decoder_session->frame_counter & 0x1ff))
print_stats(decoder_session);
#else
- if((clock() - decoder_session->old_clock_t) > (CLOCKS_PER_SEC/4)) {
- print_stats(decoder_session);
- decoder_session->old_clock_t = clock();
+ if(decoder_session->samples_processed - decoder_session->old_samples_processed > 25000) {
+ /* We're assuming that even on old hardware libFLAC can easily process
+ * 100.000 samples per second, even on old hardware. To limit the number
+ * of (expensive) syscalls, we only check clock every 25.000 samples */
+ clock_t cur_clock = clock();
+ decoder_session->old_samples_processed = decoder_session->samples_processed;
+ if((cur_clock - decoder_session->old_clock) > (CLOCKS_PER_SEC/4)) {
+ print_stats(decoder_session);
+ decoder_session->old_clock = cur_clock;
+ }
}
#endif
diff --git a/src/flac/encode.c b/src/flac/encode.c
index a945b356a5..0eb9a172f2 100644
--- a/src/flac/encode.c
+++ b/src/flac/encode.c
@@ -94,7 +94,8 @@ typedef struct {
uint32_t stats_frames_interval;
uint32_t old_frames_written;
#else
- clock_t old_clock_t;
+ uint32_t old_samples_written;
+ clock_t old_clock;
#endif
SampleInfo info;
@@ -1407,7 +1408,8 @@ FLAC__bool EncoderSession_construct(EncoderSession *e, encode_options_t options,
e->stats_frames_interval = 0;
e->old_frames_written = 0;
#else
- e->old_clock_t = 0;
+ e->old_clock = 0;
+ e->old_samples_written = 0;
#endif
e->compression_ratio = 0.0;
@@ -2422,9 +2424,16 @@ void encoder_progress_callback(const FLAC__StreamEncoder *encoder, FLAC__uint64
e->old_frames_written = frames_written;
}
#else
- if(e->total_samples_to_encode > 0 && (clock() - e->old_clock_t) > (CLOCKS_PER_SEC/4)) {
- print_stats(e);
- e->old_clock_t = clock();
+ if(e->total_samples_to_encode > 0 && samples_written - e->old_samples_written > 10000) {
+ /* We're assuming that except for extremely slow settings, libFLAC can easily
+ * process 40.000 samples per second, even on old hardware. To limit the number
+ * of (expensive) syscalls, we only check clock every 10.000 samples */
+ clock_t cur_clock = clock();
+ e->old_samples_written = samples_written;
+ if((cur_clock - e->old_clock) > (CLOCKS_PER_SEC/4)) {
+ print_stats(e);
+ e->old_clock = cur_clock;
+ }
}
#endif