(コメントからインスピレーションを得ました。この問題)
なぜls
これよりはるかに遅いのですかecho *
?
$ time bash -c 'for i in {1..10000}; do ls -f > /dev/null; done'
bash -c 'for i in {1..10000}; do ls -f > /dev/null; done' 7.49s user 5.39s system 108% cpu 11.883 total
$ time bash -c 'for i in {1..10000}; do echo * > /dev/null; done'
bash -c 'for i in {1..10000}; do echo * > /dev/null; done' 0.16s user 0.25s system 98% cpu 0.415 total
もちろん、ls
もう少しゆっくりするのが合理的ではありますecho *
が、言葉にならないことのようです。
なぜls
ほとんどそうですか?
これがスピードを必要としないことに関連している場合、ls
理由はありません。yes
早すぎる。
ls
正確に何がこんなに遅くなるのでしょうか?
(私はノートブックのArch Linuxでzshを使用しています。bashの時間は似ています。(Linux Mint)デスクトップコンピュータでも同様の結果をテストしました。(約7秒、まだ約0.4秒で高速ls -f
ですecho *
。 Arch Linuxでもls
エイリアスはありませんが、Mintは気にしませんでしたが、とにかく違いはありません。)
答え1
を使用すると、以下と比較してカーネルへのシステムコールがはるかに少ないことがstrace
わかります。echo
ls
root@4a21b0630cba:/# strace -c ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 7 read
0.00 0.000000 0 1 write
0.00 0.000000 0 10 close
0.00 0.000000 0 9 fstat
0.00 0.000000 0 26 mmap
0.00 0.000000 0 9 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 8 pread64
0.00 0.000000 0 2 2 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 2 1 arch_prctl
0.00 0.000000 0 2 getdents64
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 8 openat
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 99 5 total
root@4a21b0630cba:/#
root@4a21b0630cba:/#
root@4a21b0630cba:/#
root@4a21b0630cba:/# strace -c echo *
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 1 read
0.00 0.000000 0 1 write
0.00 0.000000 0 4 close
0.00 0.000000 0 3 fstat
0.00 0.000000 0 7 mmap
0.00 0.000000 0 4 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 6 pread64
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 1 arch_prctl
0.00 0.000000 0 2 openat
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 36 2 total
root@4a21b0630cba:/#