On Wed, Mar 25, 2020 at 12:11 PM Karel Zak <kzak@xxxxxxxxxx> wrote: > > On Tue, Mar 24, 2020 at 10:26:25PM +0100, Aurelien LAJOIE wrote: > > 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 > > I'm not sure, but are you sure that whole UUID is in big-endian order? > I think that last part (aka "node", 6 bytes) is not subject to swapping. > It seems uuid_unpack() does nothing with the last part of the UUID. > > But your patch works on LE as well as on BE, so I probably miss > something :-) The RFC is quite clear on this "with each field encoded with the Most Significant Byte first" https://tools.ietf.org/html/rfc4122#section-4.1.2 I agree this is not clear for the node part >From the RFC node should be an unsigned 48 bit integer The parsing is done byte per byte for (i=0; i < 6; i++) { buf[0] = *cp++; buf[1] = *cp++; uuid.node[i] = strtoul(buf, NULL, 16); } Then the sprintf is also done byte per byte. So Big Endian and the swapping are hidden by the manipulation byte per byte I cannot find any usage of the node field to set specific value only random. As long the node is handled byte per byte it will work. > > > before took 382623 us > > after took 36740 us > > > > Big Endian OpenBSD: > > before took 3138172 us > > after took 180116 us > > I guess all this is about sprintf(), another way would be to use > uuid_unpack() but avoid sprintf(). Using uuid_unpack to fill a struct uuid, will trigger to handle the endianness to print it whereas uuid_t is matching the order needed to print it. > > Karel > > -- > Karel Zak <kzak@xxxxxxxxxx> > http://karelzak.blogspot.com >