2013-06-17 1 views
14

stat() 시스템 호출이 실제로 비용이 많이 듭니까? 나는 어딘가에 값 비싼 시스템 호출을 사용하는 것을 읽었다. 진짜야? 그렇다면 다른 대안이 있습니까?stat()는 값 비싼 시스템 호출입니까?

+5

'expensive()'? 그것은 또 다른 시스템 호출인가? – devnull

+4

프로파일 링을 시도하여 실제로 비용을 확인 했습니까? – ssube

+7

짧은 대답은 아니오입니다. 값 비싼 유일한 부분은 디스크에서 파일의 inode를 읽는 것입니다. linux가 inode를 매우 효율적으로 캐시하기 때문에, 부팅 후 어떤 방식 으로든 보았던 파일은 이미 inode를 캐시에 저장했을 것입니다. access()와 같은 다른 호출이 있지만 stat()를 호출합니다. fopen() 또는 그냥 일반 열기 더 많은 리소스를 사용합니다. –

답변

19

일반적인 설정에서 파일 정보를 가져 오는 유일한 정상적인 기술은 stat(2), fstat(2)lstat(2)입니다. 성능 문제가있는 경우 응용 프로그램의 프로필을 작성하고 결과를 확인하는 것이 좋습니다.

프로필하려면 gcc -pg으로 컴파일하고 gprof(1)으로 실행 파일을 실행하십시오.

잠재적으로 Qt와 같은 더 큰 라이브러리를 사용할 수 있지만 성능 문제는 해결되지 않을 가능성이 높습니다. 어쨌든 stat(2)을 사용하게 될 것입니다.

그래서 비싸 든 그렇지 않든 합당한 대안이 없습니다.

짐 맥 말라라 (Jim McMaraara)의 의견에서와 같이 이러한 이유 때문에 정확하게 비용이 들지는 않습니다. 다른 대안이 없기 때문에, glibc와 리눅스 프로그래머는 가능한 한 실행 가능하게 만들었습니다.

+2

또한 한 번 이상 실행하는 프로필 결과에 매우주의하십시오. 터치 한 모든 파일을 캐싱하므로 재실행 할 때 두 번째 실행이 동일한 파일 세트에서 훨씬 더 빠르게 오류를 발생시킵니다. –

+1

심장 마비로 열린 심장 수술과 비슷합니다 ... 그렇습니다. 비용이 많이 들지만 대안은 무엇입니까 ...? – Jonathan

+0

그리고 외과 팀은 전 세계적으로 C 프로그래머로 구성된 재능있는 팀입니다. –

3

질문은 "비싼 v/s 필수"로 발생합니다.

유닉스의 모든 프로세스는 "사용자 공간"과 "커널 공간"의 두 가지 모드로 실행되며 open(), write(), stat()와 같은 시스템 호출이 발행 될 때 프로세스는 사용자 공간에서 비싸지 만 우리가이 시스템 콜에 의미있는 일을하지 않는 경우에만 커널 모드를 사용하십시오. stat()를 사용하여 파일의 마지막으로 액세스 한 시간을 인쇄하고 더 이상 아무것도하지 않으면 아마도 피할 수 있습니다. .

그래서 먼저 stat()를 호출해야합니다. 두 번째로 코드의 서로 다른 부분의 상대적 실행 시간을 비교하려면 프로파일 링 도구를 사용하십시오.이 도구는 어떤 함수 호출이 비싸고 어떤 함수 호출이 아닌지를 증명하는 정확한 통계를 제공합니다.

+3

내가하는 일을 다른 방법으로 제안 하시겠습니까? 합계를 피하는 것은 말이되지 않습니다. 과거에 디렉토리에 ls 명령을했다면 파일은 이미 캐시되어있을 것입니다. 어쨌든 - 다른 방법은 없습니까? stat를 호출하거나 stat를 호출하는 ls를 사용하는 것 이외에. –

4

항상 실행 파일에 strace을 사용할 수 있습니다. 다시 컴파일 할 필요가 없습니다. 이 기능을 사용하면 각 시스템 호출에 대한 실제 실행 시간을 얻을 수 있습니다.

관련 문제