(댓글에서 영감을 얻었습니다.이 문제)
왜 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:/#