긴 줄에서 xargs -n 1이 왜 그렇게 느린가요?

긴 줄에서 xargs -n 1이 왜 그렇게 느린가요?

명령을 사용하여 생성된 줄에는 echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}8191개의 단어 또는 114687개의 문자(106497개의 점과 8190개의 공백)가 포함됩니다.

| xargs -n 1분할하는 데 계산 시간이 필요한 이유는 무엇입니까 ? 내 컴퓨터에서는 8초입니다.

배경 이야기.

bash 버팀대 확장을 가지고 놀다가 이상한 문제를 발견했습니다. 예제 질문에서 bash 중괄호 확장 타이밍을 확인하고 있습니다. 명시적인 루프와 변수를 피하면서 새 줄에 문자열의 최대 "n"(=13) 도트를 인쇄합니다. 나는 다소 느린 해결책을 생각해 냈습니다.

$ time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 | sort -u
·
··
···
····
·····
······
·······
········
·········
··········
···········
············
·············

real    0m8.800s
user    0m0.188s
sys     0m0.748s

나는 이것이 성능 때문에 발생한 것이라고 생각했기 sort때문에 정렬하지 않고 솔루션을 확인했습니다.

$ time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 | awk '{if (!a[$0]) {print $0} ; a[$0]=$0}'
·
··
···
····
·····
······
·······
········
·········
··········
···········
············
·············

real    0m8.250s
user    0m0.152s
sys     0m0.784s

이건 좀 빠르네요. 확장 자체는 엄청나게 빠릅니다.

time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} > /dev/null

real    0m0.024s
user    0m0.020s
sys     0m0.004s

콘솔에 포인트 벽을 인쇄할 때 0m0.250s이지만 해당 출력은 일반적으로 계산에 비해 느립니다. 그래서 구분선에 걸리는 시간을 확인했습니다.

time echo {,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·}{,·} | xargs -n 1 > /dev/null 

real    0m8.551s
user    0m0.096s
sys     0m0.724s

xargs그동안 무엇을 하고 있었나요?

답변1

/bin/echoxargs는 8191번 실행되기 때문에 느립니다 .

대신 사용하십시오 | tr -s " " "\n".

관련 정보