Messages in this thread | | | From | Namhyung Kim <> | Date | Sun, 5 Nov 2023 19:53:00 -0800 | Subject | Re: [PATCH v4 06/53] tools api fs: Switch filename__read_str to use io.h |
| |
On Thu, Nov 2, 2023 at 10:58 AM Ian Rogers <irogers@google.com> wrote: > > filename__read_str has its own string reading code that allocates > memory before reading into it. The memory allocated is sized at BUFSIZ > that is 8kb. Most strings are short and so most of this 8kb is > wasted. > > Refactor io__getline so that the newline character can be configurable > and ignored in the case of filename__read_str. > > Code like build_caches_for_cpu in perf's header.c will read many > strings and hold them in a data structure, in this case multiple > strings per cache level per CPU. Using io.h's io__getline avoids the > wasted memory as strings are temporarily read into a buffer on the > stack before being copied to a buffer that grows 128 bytes at a time > and is never sized larger than the string. > > For a 16 hyperthread system the memory consumption of "perf record > true" is reduced by 180kb, primarily through saving memory when > reading the cache information. > > Signed-off-by: Ian Rogers <irogers@google.com> > ---
[SNIP] > diff --git a/tools/lib/api/io.h b/tools/lib/api/io.h > index a77b74c5fb65..50d33e14fb56 100644 > --- a/tools/lib/api/io.h > +++ b/tools/lib/api/io.h > @@ -141,7 +141,7 @@ static inline int io__get_dec(struct io *io, __u64 *dec) > } > > /* Read up to and including the first newline following the pattern of getline. */
You may want to update the comment as well.
> -static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_len_out) > +static inline ssize_t io__getline_nl(struct io *io, char **line_out, size_t *line_len_out, int nl)
How about io__getdelim() similar to POSIX?
Thanks, Namhyung
> { > char buf[128]; > int buf_pos = 0; > @@ -151,7 +151,7 @@ static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_l > > /* TODO: reuse previously allocated memory. */ > free(*line_out); > - while (ch != '\n') { > + while (ch != nl) { > ch = io__get_char(io); > > if (ch < 0) > @@ -184,4 +184,9 @@ static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_l > return -ENOMEM; > } > > +static inline ssize_t io__getline(struct io *io, char **line_out, size_t *line_len_out) > +{ > + return io__getline_nl(io, line_out, line_len_out, /*nl=*/'\n'); > +} > + > #endif /* __API_IO__ */ > -- > 2.42.0.869.gea05f2083d-goog >
| |