There is 2 improvements: * remove useless uuid_unpack, * directly print the hexa format from memory without using printf we can do this as the bytes order is the network byte order The improvement is important, some results for 1000000 uuid_unparse calls: Little Endian Ubuntu: before took 382623 us after took 36740 us Big Endian OpenBSD: before took 3138172 us after took 180116 us Signed-off-by: Aurelien LAJOIE <orel@xxxxxxxxx> --- libuuid/src/unparse.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/libuuid/src/unparse.c b/libuuid/src/unparse.c index a95bbb042..62bb3ef26 100644 --- a/libuuid/src/unparse.c +++ b/libuuid/src/unparse.c @@ -36,41 +36,40 @@ #include "uuidP.h" -static const char *fmt_lower = - "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x"; - -static const char *fmt_upper = - "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"; +char const __str_digits_lower[36] = "0123456789abcdefghijklmnopqrstuvwxyz"; +char const __str_digits_upper[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; #ifdef UUID_UNPARSE_DEFAULT_UPPER -#define FMT_DEFAULT fmt_upper +#define STR_DIGIT_DEFAULT __str_digits_upper #else -#define FMT_DEFAULT fmt_lower +#define STR_DIGIT_DEFAULT __str_digits_lower #endif -static void uuid_unparse_x(const uuid_t uu, char *out, const char *fmt) +static void uuid_fmt(char *buf, const uuid_t uuid, char const fmt[36]) { - struct uuid uuid; + char *p = buf; - uuid_unpack(uu, &uuid); - sprintf(out, fmt, - uuid.time_low, uuid.time_mid, uuid.time_hi_and_version, - uuid.clock_seq >> 8, uuid.clock_seq & 0xFF, - uuid.node[0], uuid.node[1], uuid.node[2], - uuid.node[3], uuid.node[4], uuid.node[5]); + for (int i = 0; i < 16; i++) { + if (i == 4 || i == 6 || i == 8 || i == 10) { + *p++ = '-'; + } + *p++ = fmt[uuid[i] >> 4]; + *p++ = fmt[uuid[i] & 15]; + } + *p = '\0'; } void uuid_unparse_lower(const uuid_t uu, char *out) { - uuid_unparse_x(uu, out, fmt_lower); + uuid_fmt(out, uu, __str_digits_lower); } void uuid_unparse_upper(const uuid_t uu, char *out) { - uuid_unparse_x(uu, out, fmt_upper); + uuid_fmt(out, uu, __str_digits_upper); } void uuid_unparse(const uuid_t uu, char *out) { - uuid_unparse_x(uu, out, FMT_DEFAULT); + uuid_fmt(out, uu, STR_DIGIT_DEFAULT); } -- 2.20.1