• KAMEZAWA Hiroyuki's avatar
    procfs: add num_to_str() to speed up /proc/stat · 1ac101a5
    KAMEZAWA Hiroyuki authored
    == stat_check.py
    num = 0
    with open("/proc/stat") as f:
            while num < 1000 :
                    data = f.read()
                    f.seek(0, 0)
                    num = num + 1
    ==
    
    perf shows
    
        20.39%  stat_check.py  [kernel.kallsyms]    [k] format_decode
        13.41%  stat_check.py  [kernel.kallsyms]    [k] number
        12.61%  stat_check.py  [kernel.kallsyms]    [k] vsnprintf
        10.85%  stat_check.py  [kernel.kallsyms]    [k] memcpy
         4.85%  stat_check.py  [kernel.kallsyms]    [k] radix_tree_lookup
         4.43%  stat_check.py  [kernel.kallsyms]    [k] seq_printf
    
    This patch removes most of calls to vsnprintf() by adding num_to_str()
    and seq_print_decimal_ull(), which prints decimal numbers without rich
    functions provided by printf().
    
    On my 8cpu box.
    == Before patch ==
    [root@bluextal test]# time ./stat_check.py
    
    real    0m0.150s
    user    0m0.026s
    sys     0m0.121s
    
    == After patch ==
    [root@bluextal test]# time ./stat_check.py
    
    real    0m0.055s
    user    0m0.022s
    sys     0m0.030s
    
    [akpm@linux-foundation.org: remove incorrect comment, use less statck in num_to_str(), move comment from .h to .c, simplify seq_put_decimal_ull()]
    [andrea@betterlinux.com: avoid breaking the ABI in /proc/stat]
    Signed-off-by: default avatarKAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    Signed-off-by: default avatarAndrea Righi <andrea@betterlinux.com>
    Cc: Eric Dumazet <eric.dumazet@gmail.com>
    Cc: Glauber Costa <glommer@parallels.com>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Ingo Molnar <mingo@elte.hu>
    Cc: Paul Turner <pjt@google.com>
    Cc: Russell King <rmk@arm.linux.org.uk>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    1ac101a5
seq_file.c 18.7 KB