From: Jamie Lokier <jamie@shareable.org>
To: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Anthony Liguori <aliguori@us.ibm.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 01/11] Add append method to qstring and empty constructor
Date: Fri, 23 Oct 2009 20:33:43 +0100 [thread overview]
Message-ID: <20091023193343.GD12559@shareable.org> (raw)
In-Reply-To: <20091018193652.3d1eb6f1@doriath>
Luiz Capitulino wrote:
> > qstring = qemu_malloc(sizeof(*qstring));
> > - qstring->string = qemu_strdup(str);
> > +
> > + qstring->length = strlen(str);
> > + qstring->capacity = qstring->length;
> > +
> > + qstring->string = qemu_malloc(qstring->capacity + 1);
> > + memcpy(qstring->string, str, qstring->length);
> > + qstring->string[qstring->length] = 0;
>
> Couldn't this be:
>
> qstring->string = qemu_strdup(str);
> qstring->length = qstring->capacity = strlen(str);
Probably to have one call to strlen() instead of two (one inside
qemu_strdup()).
> > +void qstring_append(QString *qstring, const char *str)
> > +{
> > + size_t len = strlen(str);
> > +
> > + if (qstring->capacity < (qstring->length + len)) {
> > + qstring->capacity += len;
> > + qstring->capacity *= 2; /* use exponential growth */
> > +
> > + qstring->string = qemu_realloc(qstring->string, qstring->capacity + 1);
> > + }
>
> Why do we need to double it? Wouldn't be enough to only keep track
> of the current string length and add 'len' to it? We could drop
> 'capacity' then.
You need exponential growth if large stringes are to be grown in O(n)
time where n is the number of characters, appended in small pieces.
Think about the time spent copying bytes every time qemu_realloc() is called.
If you just add 'len' each time, think about appending 1 byte 10^4
times. It will copy approximately 10^8/2 bytes, which is a lot just to
make a string 10^4 bytes long.
But += len; *= 2 is not necessary. *= 2 is enough, provided the
result is large enough.
> > + memcpy(qstring->string + qstring->length, str, len);
> > + qstring->length += len;
> > + qstring->string[qstring->length] = 0;
>
> I would use strcat().
Again, that's an extra call to strlen(), traversing the string twice instead of once.
Doesn't make much different for small strings, only large ones.
-- Jamie
next prev parent reply other threads:[~2009-10-23 19:34 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-10-17 13:36 [Qemu-devel] [PATCH 0/11] json parser (v2) Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 01/11] Add append method to qstring and empty constructor Anthony Liguori
2009-10-18 21:36 ` Luiz Capitulino
2009-10-23 19:33 ` Jamie Lokier [this message]
2009-10-17 13:36 ` [Qemu-devel] [PATCH 02/11] Add support for qfloat Anthony Liguori
2009-10-18 22:21 ` Luiz Capitulino
2009-10-19 14:18 ` Anthony Liguori
2009-10-22 8:49 ` Amit Shah
2009-10-22 14:01 ` Anthony Liguori
2009-10-22 14:05 ` Amit Shah
2009-10-23 19:25 ` Jamie Lokier
2009-10-23 19:36 ` Daniel P. Berrange
2009-10-17 13:36 ` [Qemu-devel] [PATCH 03/11] Add a test case " Anthony Liguori
2009-10-17 14:00 ` Edgar E. Iglesias
2009-10-17 16:21 ` Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 04/11] Add json->qobject parser Anthony Liguori
2009-10-23 17:45 ` Luiz Capitulino
2009-10-17 13:36 ` [Qemu-devel] [PATCH 05/11] Add unit test for json parser Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 06/11] qobject: add QBool type Anthony Liguori
2009-10-18 21:50 ` Luiz Capitulino
2009-10-19 14:17 ` Anthony Liguori
2009-10-19 14:21 ` Luiz Capitulino
2009-10-17 13:36 ` [Qemu-devel] [PATCH 07/11] qjson: Use QBool for true/false keywords Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 08/11] qjson: add %i for parsing bools Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 09/11] qjson: add unit test for varargs bool parsing Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 10/11] qjson: add vararg format for embedded qobjects Anthony Liguori
2009-10-17 13:36 ` [Qemu-devel] [PATCH 11/11] qjson: add unit test to check %p format Anthony Liguori
2009-10-18 21:34 ` [Qemu-devel] [PATCH 0/11] json parser (v2) Luiz Capitulino
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20091023193343.GD12559@shareable.org \
--to=jamie@shareable.org \
--cc=aliguori@us.ibm.com \
--cc=lcapitulino@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.