104 lines
3.7 KiB
Diff
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
|