lsがecho *よりはるかに遅いのはなぜですか? [コピー]

lsがecho *よりはるかに遅いのはなぜですか? [コピー]

(コメントからインスピレーションを得ました。この問題)

なぜ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わかります。echols

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:/# 

関連情報