stat()
시스템 호출이 실제로 비용이 많이 듭니까? 나는 어딘가에 값 비싼 시스템 호출을 사용하는 것을 읽었다. 진짜야? 그렇다면 다른 대안이 있습니까?stat()는 값 비싼 시스템 호출입니까?
답변
일반적인 설정에서 파일 정보를 가져 오는 유일한 정상적인 기술은 stat(2)
, fstat(2)
및 lstat(2)
입니다. 성능 문제가있는 경우 응용 프로그램의 프로필을 작성하고 결과를 확인하는 것이 좋습니다.
프로필하려면 gcc -pg
으로 컴파일하고 gprof(1)
으로 실행 파일을 실행하십시오.
잠재적으로 Qt와 같은 더 큰 라이브러리를 사용할 수 있지만 성능 문제는 해결되지 않을 가능성이 높습니다. 어쨌든 stat(2)
을 사용하게 될 것입니다.
그래서 비싸 든 그렇지 않든 합당한 대안이 없습니다.
짐 맥 말라라 (Jim McMaraara)의 의견에서와 같이 이러한 이유 때문에 정확하게 비용이 들지는 않습니다. 다른 대안이 없기 때문에, glibc와 리눅스 프로그래머는 가능한 한 실행 가능하게 만들었습니다.
또한 한 번 이상 실행하는 프로필 결과에 매우주의하십시오. 터치 한 모든 파일을 캐싱하므로 재실행 할 때 두 번째 실행이 동일한 파일 세트에서 훨씬 더 빠르게 오류를 발생시킵니다. –
심장 마비로 열린 심장 수술과 비슷합니다 ... 그렇습니다. 비용이 많이 들지만 대안은 무엇입니까 ...? – Jonathan
그리고 외과 팀은 전 세계적으로 C 프로그래머로 구성된 재능있는 팀입니다. –
질문은 "비싼 v/s 필수"로 발생합니다.
유닉스의 모든 프로세스는 "사용자 공간"과 "커널 공간"의 두 가지 모드로 실행되며 open(), write(), stat()와 같은 시스템 호출이 발행 될 때 프로세스는 사용자 공간에서 비싸지 만 우리가이 시스템 콜에 의미있는 일을하지 않는 경우에만 커널 모드를 사용하십시오. stat()를 사용하여 파일의 마지막으로 액세스 한 시간을 인쇄하고 더 이상 아무것도하지 않으면 아마도 피할 수 있습니다. .
그래서 먼저 stat()를 호출해야합니다. 두 번째로 코드의 서로 다른 부분의 상대적 실행 시간을 비교하려면 프로파일 링 도구를 사용하십시오.이 도구는 어떤 함수 호출이 비싸고 어떤 함수 호출이 아닌지를 증명하는 정확한 통계를 제공합니다.
내가하는 일을 다른 방법으로 제안 하시겠습니까? 합계를 피하는 것은 말이되지 않습니다. 과거에 디렉토리에 ls 명령을했다면 파일은 이미 캐시되어있을 것입니다. 어쨌든 - 다른 방법은 없습니까? stat를 호출하거나 stat를 호출하는 ls를 사용하는 것 이외에. –
항상 실행 파일에 strace
을 사용할 수 있습니다. 다시 컴파일 할 필요가 없습니다. 이 기능을 사용하면 각 시스템 호출에 대한 실제 실행 시간을 얻을 수 있습니다.
- 1. POSIX 스레드 : pthreads_cond_wait() 및 다른 시스템 호출입니까?
- 2. 값 비싼 연산을 R
- 3. 비싼 백엔드 시스템 호출 및 SEO 제거
- 4. ObservableCollection.CollectionChanged에서 값 비싼 작업 실행
- 5. 값 비싼 속성이있는 RESTful 리소스
- 6. 값 비싼 패딩 작업 수행
- 7. 값 비싼 작업을 전송 중입니까?
- 8. 잠재적으로 값 비싼 작업 실행
- 9. 값 비싼 UserControls 다시 사용
- 10. C++ 11 값 비싼 임시 값
- 11. Java (JavaSound) : "clip.play()"는 값 비싼 전화입니까?
- 12. RoR에서 값 비싼 쿼리 결과 캐쉬
- 13. 값 비싼 작업으로 인한 콜렉션에서의 Java 동기화
- 14. Jabber와 값 비싼 데이터 (XML 쓰레기)
- 15. WebAPI에서 값 비싼 리소스를 공유하는 방법
- 16. Python IRC bot에서 값 비싼 계산 피하기
- 17. 예약 된 스프링 메소드의 값 비싼 연산
- 18. 파이썬에서 값 비싼 객체의 스마트 캐싱
- 19. 중첩 된 선택 내부의 값 비싼 함수
- 20. timeit.repeat() 벤치 마크에서 값 비싼 설정을 피하십시오
- 21. 각 요청에 값 비싼 오브젝트 생성을 방지합니다.
- 22. 다각형에서 가장 값 비싼 경로 찾기
- 23. curl_multi_exec()가 차단 호출입니까?
- 24. 어떤 종류의 함수 호출입니까?
- 25. 스레드 안전하지 않은 호출입니까?
- 26. midiOutPrepareHeader는 빠른 호출입니까?
- 27. 비싼 적응력을위한 IAdapterFactory?
- 28. 비싼 connection.createStatement
- 29. 입력 상자 값 시스템
- 30. Google App Engine - 엄청나게 느리고 값 비싼 백업 및 복원?
'expensive()'? 그것은 또 다른 시스템 호출인가? – devnull
프로파일 링을 시도하여 실제로 비용을 확인 했습니까? – ssube
짧은 대답은 아니오입니다. 값 비싼 유일한 부분은 디스크에서 파일의 inode를 읽는 것입니다. linux가 inode를 매우 효율적으로 캐시하기 때문에, 부팅 후 어떤 방식 으로든 보았던 파일은 이미 inode를 캐시에 저장했을 것입니다. access()와 같은 다른 호출이 있지만 stat()를 호출합니다. fopen() 또는 그냥 일반 열기 더 많은 리소스를 사용합니다. –