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

관련 정보