From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg0-f66.google.com ([74.125.83.66]:42212 "EHLO mail-pg0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751394AbeA2IAy (ORCPT ); Mon, 29 Jan 2018 03:00:54 -0500 Received: by mail-pg0-f66.google.com with SMTP id j16so2427310pgn.9 for ; Mon, 29 Jan 2018 00:00:54 -0800 (PST) From: Andrei Vagin To: linux-fsdevel@vger.kernel.org, Andrew Morton Cc: Alexey Dobriyan , Andrei Vagin Subject: [PATCH 3/4] proc: optimize single-symbol delimiters to spead up seq_put_decimal_ull Date: Mon, 29 Jan 2018 00:00:42 -0800 Message-Id: <20180129080043.14191-3-avagin@openvz.org> In-Reply-To: <20180129080043.14191-1-avagin@openvz.org> References: <20180129080043.14191-1-avagin@openvz.org> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: A delimiter is a string which is printed before a number. A syngle-symbol delimiters can be printed by set_putc() and this works faster than printing by set_puts(). == test_proc.c int main(int argc, char **argv) { int n, i, fd; char buf[16384]; n = atoi(argv[1]); for (i = 0; i < n; i++) { fd = open(argv[2], O_RDONLY); if (fd < 0) return 1; if (read(fd, buf, sizeof(buf)) <= 0) return 1; close(fd); } return 0; } == $ time ./test_proc 1000000 /proc/1/stat == Before patch == real 0m3.820s user 0m0.337s sys 0m3.394s == After patch == real 0m3.110s user 0m0.324s sys 0m2.700s Signed-off-by: Andrei Vagin --- fs/seq_file.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index 55c89eb95a90..d14b023bc0f8 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -685,12 +685,12 @@ void seq_put_decimal_ull_aligned(struct seq_file *m, const char *delimiter, if (m->count + 2 >= m->size) /* we'll write 2 bytes at least */ goto overflow; - len = strlen(delimiter); - if (m->count + len >= m->size) - goto overflow; - - memcpy(m->buf + m->count, delimiter, len); - m->count += len; + if (delimiter && delimiter[0]) { + if (delimiter[1] == 0) + seq_putc(m, delimiter[0]); + else + seq_puts(m, delimiter); + } if (!width) width = 1; @@ -778,12 +778,12 @@ void seq_put_decimal_ll(struct seq_file *m, const char *delimiter, long long num if (m->count + 3 >= m->size) /* we'll write 2 bytes at least */ goto overflow; - len = strlen(delimiter); - if (m->count + len >= m->size) - goto overflow; - - memcpy(m->buf + m->count, delimiter, len); - m->count += len; + if (delimiter && delimiter[0]) { + if (delimiter[1] == 0) + seq_putc(m, delimiter[0]); + else + seq_puts(m, delimiter); + } if (m->count + 2 >= m->size) goto overflow; -- 2.13.6