From 36c501fe7888bce761b5527dbd2ac7234543aef1 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 3 May 2010 12:30:37 -0700 Subject: [PATCH] dynamic-string: Optimize ds_put_char(). A qprof profile showed ds_put_char() and ds_put_uninit() as 4% of total runtime. This commit inlines the common case, which reduces them to 1% total. --- lib/dynamic-string.c | 2 +- lib/dynamic-string.h | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/lib/dynamic-string.c b/lib/dynamic-string.c index c3338180..79a7d8ee 100644 --- a/lib/dynamic-string.c +++ b/lib/dynamic-string.c @@ -66,7 +66,7 @@ ds_put_uninit(struct ds *ds, size_t n) } void -ds_put_char(struct ds *ds, char c) +ds_put_char__(struct ds *ds, char c) { *ds_put_uninit(ds, 1) = c; } diff --git a/lib/dynamic-string.h b/lib/dynamic-string.h index eebbdbfe..db033c98 100644 --- a/lib/dynamic-string.h +++ b/lib/dynamic-string.h @@ -39,7 +39,7 @@ void ds_clear(struct ds *); void ds_truncate(struct ds *, size_t new_length); void ds_reserve(struct ds *, size_t min_length); char *ds_put_uninit(struct ds *, size_t n); -void ds_put_char(struct ds *, char); +static inline void ds_put_char(struct ds *, char); void ds_put_utf8(struct ds *, int uc); void ds_put_char_multiple(struct ds *, char, size_t n); void ds_put_buffer(struct ds *, const char *, size_t n); @@ -63,5 +63,20 @@ void ds_swap(struct ds *, struct ds *); int ds_last(const struct ds *); void ds_chomp(struct ds *, int c); + +/* Inline functions. */ + +void ds_put_char__(struct ds *, char); + +static inline void +ds_put_char(struct ds *ds, char c) +{ + if (ds->length < ds->allocated) { + ds->string[ds->length++] = c; + ds->string[ds->length] = '\0'; + } else { + ds_put_char__(ds, c); + } +} #endif /* dynamic-string.h */ -- 2.30.2