2012-03-05 2 views
2

내 C++ 프로그램 중 하나의 프로파일 링 방금 파일을 만들 때 std :: ofstream()을 호출하면 시스템 "touch"를 사용하는 것보다 훨씬 적은 시간이 걸리는 것을 발견했습니다.std :: ofstream 및 system touch

그래서 지금 리눅스에서 std :: ofstream이 어떤 OS 기능에 매핑되어 있는지 궁금합니다.

std :: ofstream()이 파일을 생성하기 위해 호출하는 것을 알고 있습니까?

감사

+1

함수 호출'system ("touch ...");로'명령'또는 프로그램 내에서'시스템 터치 "를 실행하고 있습니까? – hmjd

+1

C++ 함수 (std :: ofstream 생성자)와 실행 파일 (/ bin/touch)의 성능을 어떻게 비교합니까? – bobah

+0

예, 저는 system() 또는 더 나은 것을 사용합니다 : sprintf (temp, "touch % s", qPrintable (fileName)). 그러나 대답을 통해 나는 왜 나는 왜 그런 오버 헤드를 얻었는지 이해했다. – rmbianchi

답변

5

system("touch filename"); 일을하는 경우 오해의 소지가 있으며 느려집니다 (및 보안 위험, 및 ...). 시스템을 그렇게 부르지는 않지만 쉘을 생성 한 다음 프로그램을 실행합니다 (이 경우 터치). 스트림을 열면 파일 시스템에 직접 액세스 할 수있는 실제 시스템 호출이 사용됩니다. Linux의 경우 http://linux.die.net/man/2/open 일 수 있습니다. 터미널에서 strace touch을 실행하여 어떤 시스템 호출이 이루어지는 지 확인하십시오. 파일을 여는 것만으로 간단한 C++ 프로그램을 만들 수도 있습니다. 또는 오픈 소스 구현 (gcc)을 사용하는 경우 소스를 확인할 수 있습니다.

+0

주제를 조금 벗어나지 만 나 같은 사람을 도울 수 있습니다. Mac 응용 프로그램 내에서 파일을 만들고 싶었습니다. 시스템 ("touch filename")은 디스크 루트에서 생성 된 것을 제외하고는 작업을 수행했습니다. 어째서? 상대 경로를 선호하고 동일한 경로의 파일을 터치한다고 생각했습니다. – StinkyCat

+0

@StinkyCat 당신은 다소 요점을 놓치고 있습니다. ** system()은 사악합니다. 사용하지 마십시오! **하지만 그것은 단지 프로세스 반환 값으로 무언가를 테스트하려고 시도한 것입니다. 비슷한 문제가 있었다! 일부 플랫폼에서는 로컬 프로그램을 찾을 수 있지만 일부에서는 불가능합니다. 'system'은 새로운 쉘을 시작합니다. 리눅스에서 보이는 것처럼 보이지만 새로운 쉘이 프로그램이 실행되는 디렉토리에서 시작될 것이라고는 말할 수 없습니다. 어쨌든 posix 표준은 그것이 "구현 정의 된 방식으로 실행"될 것이라고 말하고 있습니다 (http://goo.gl/65q46). – BoBTFish

+1

네, 답을 읽지 못했습니다. :) 그러나 나는 작은 테스트를하고 있었고, 그것을 놓아 버리는 큰 질문으로 저를 때렸습니다. 그러나 당신은 분명히했습니다, 고마워요! – StinkyCat

4

또한 이진 touch의 실행 오버 헤드를 고려해야합니다. 성능 향상은 대부분 ofstream을 측정 할 때 메모리에 영구 바이너리가있는 것이 원인이라고 생각합니다.

+0

좋은 점은 터치를 실행할 때 운영 체제 프로세스가 생성된다고 생각합니다. – 01100110

1

system()을 생각해보십시오. 그것은 터치 바이너리, 공유 libs 등을 디스크에서로드하고, 실행하고, 프로세스를 정리하고 리턴 할 쉘을 fork/exec 할 것입니다.

터치를 사용하여 존재하지 않는 파일을 만드는 경우 일부 함수 호출을 실행하고 궁극적으로 시스템 호출 open() 및 최종적으로는 close()으로 해결할 std :: ofstream.open()과 동일합니다. . 훨씬 빠릅니다. 그러나 실제로는 touch의 기능을 모방하는 경우 더 복잡합니다. E.G. 파일이 이미 존재하면 시간 소인 등만 변경되며 더 많은 내용이 포함됩니다.

실제 사용 코딩에 관계없이 C++에서의 코딩은 system()을 통해 외부 프로그램을 실행하는 것보다 빠릅니다.