쉘 1이 쉘 2보다 작업하기 더 좋은지 알고 싶습니다. ksh, dash, bash 또는 zsh와 같은 쉘 3을 사용하여 테스트할 수 있습니다. 나는 테스트 스크립트를 사용하여 프로젝트를 빌드하고, 시작하고, 표준 입력을 통해 입력을 제공하고, Valgrind를 사용하여 셸의 동작을 분석하여 코드가 수행하는 작업에 대한 유익한 추적을 얻습니다. 이제 2개의 셸과 더 복잡한 파이프라인 사이를 벤치마킹하고 싶은지 궁금합니다. 테스트 사례를 만들기 위해 주로 임의의 중요하지 않은 파이프라인을 사용하므로 테스트를 위한 좋은 셸 명령을 도와주실 수 있나요?
나는 큰 파일을 통해 큰 작업을 수행하는 것을 상상할 수 있습니다. 이것은 값비싼 작업을 수행하여 어떤 쉘이 "더 빠른"지 알 수 있는 좋은 방법입니까, 아니면 큰 쉘 스크립트를 실행하는 문제입니까?
제가 테스트하려는 셸은 이 스크립트와 같은 입력을 받아들일 수 있으며 Valgrind는 비용이 많이 드는 파이프라인을 테스트할 때 데이터 정렬 문제나 기타 오류를 측정할 수 있습니다.
다양한 쉘을 벤치마킹하기 위한 좋은 쉘 스크립트를 알고 계십니까?
#!/bin/sh
echo "-- Testing our implementation of POSIX shell --"
echo ""
echo "- If you have any problem in passing a test read the corresponding"
echo "- source file to understand what the test is checking"
echo ""
printf "********************* PRESS ENTER TO RUN TESTS ... "
#read _
make
valgrind --leak-check=yes ./shell .<< EOF
ls -al|grep open|awk '{print \$9}'
EOF
printf "********************* TEST WILDCARDS \n***** Press any key to listing all files in current directory...\nYou should see filesnames *.* below "
read _
./shell << EOF
ls
EOF
printf "********************* TEST ALGORITHMS ... \n***** Press any key to run the algorithms... .\nYou should see the output from top -b -n1|head -8|tail -1 "
read _
valgrind --leak-check=yes ./shell .<< EOF
top|head -8|tail -1|sort -n|wc -l
EOF
printf "********************* TEST ALGORITHMS Part II. ... .\nYou should see the output from who|awk '{print \$4 ; print \$3}'|sort -n|wc -l. "
read _
valgrind --leak-check=yes ./shell .<< EOF
who|awk '{print \$4 ; print \$3}'|sort -n|wc -l
EOF
printf "********************* TEST CHECKENV. ..... .\nYou should see the output checkenv below "
read _
valgrind --leak-check=yes ./shell .<< EOF
checkenv
EOF
printf "********************* TEST DONE. YOU SHOULD SEE OUTPUT FROM TEST ABOVE ... "
read _
답변1
셸 성능의 핵심은 비용이 많이 드는 시스템 호출, fork()
특히 exec()
.
쉘 루프 내부에는 또는 를 사용하지 마십시오 grep
.sed
안 돼요둘 다 파이프를 사용합니다. 대부분의 경우 또는 로 단순화할 수 sed
있습니다 awk
.
복잡해지면 정규식을 파싱할 수 있는 언어를 사용하고,그리고다음과 같은 루프를 수행하십시오.앗또는진주.
반면에 셸에서 제공하는 간단한 텍스트 처리 기능을 사용할 수 있다면 성능을 크게 높일 수 있습니다.
즉, at&t ksh93은 항상 속도에 최적화되어 있는 반면 bash와 zsh는 더 많은 기능을 제공합니다.
답변2
for shell in $(sed '1d' /etc/shells); do # or use your own list of shells
echo "$shell -"
time $shell /path/to/script
done