[ovs-dev] [Scalability 04/10] dynamic-string: Optimize ds_put_char().
Ben Pfaff
blp at nicira.com
Mon May 3 22:50:56 UTC 2010
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 c333818..79a7d8e 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 eebbdbf..db033c9 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 */
--
1.6.6.1
More information about the dev
mailing list