procfs: optimize seq_pad() to speed up /proc/pid/maps
seq_printf() is slow and it can be replaced by memset() in this case. == test.py num = 0 with open("/proc/1/maps") as f: while num < 10000 : data = f.read() f.seek(0, 0) num = num + 1 == == Before patch == $ time python test.py real 0m0.986s user 0m0.279s sys 0m0.707s == After patch == $ time python test.py real 0m0.932s user 0m0.261s sys 0m0.669s $ perf record -g python test.py == Before patch == - 47.35% 3.38% python [kernel.kallsyms] [k] show_map_vma.isra.23 - 43.97% show_map_vma.isra.23 + 20.84% seq_path - 15.73% show_vma_header_prefix + 6.96% seq_pad + 2.94% __GI___libc_read == After patch == - 44.01% 0.34% python [kernel.kallsyms] [k] show_pid_map - 43.67% show_pid_map - 42.91% show_map_vma.isra.23 + 21.55% seq_path - 15.68% show_vma_header_prefix + 2.08% seq_pad 0.55% seq_putc Link: http://lkml.kernel.org/r/20180112185812.7710-2-avagin@openvz.org Signed-off-by: Andrei Vagin <avagin@openvz.org> Cc: Alexey Dobriyan <adobriyan@gmail.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
0e3dc01914
commit
8cfa67b4d9
|
@ -828,8 +828,14 @@ EXPORT_SYMBOL(seq_write);
|
|||
void seq_pad(struct seq_file *m, char c)
|
||||
{
|
||||
int size = m->pad_until - m->count;
|
||||
if (size > 0)
|
||||
seq_printf(m, "%*s", size, "");
|
||||
if (size > 0) {
|
||||
if (size + m->count > m->size) {
|
||||
seq_set_overflow(m);
|
||||
return;
|
||||
}
|
||||
memset(m->buf + m->count, ' ', size);
|
||||
m->count += size;
|
||||
}
|
||||
if (c)
|
||||
seq_putc(m, c);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue