문제

내 라이브러리가 특정 파일 (텍스트 파일, 크기 326 kb)을 구문 분석하는 순서대로 내 라이브러리가 더 느리다는 소식을 받았습니다. 사용자는 내가 사용하고 있다고 제안했습니다. std::ifstream (아마도 대신 FILE).

오히려 맹목적으로 다시 쓰지 않을 것이므로, 병목 현상이 다른 곳에있을 것이기 때문에 여기에서 먼저 확인하겠다고 생각했습니다. 나는 캐릭터별로 캐릭터를 읽고 있으므로 내가 사용하는 유일한 기능은 get(), peek(), 그리고 tellg()/seekg().

업데이트:

나는 프로파일 링하고 얻었다 혼란 출력 -GPROF는 너무 오래 걸렸다 고 생각하지 않았습니다. 나는 전체 파일을 먼저 버퍼로 읽기 위해 프로그램을 다시 작성했으며 약 100x가 늘어났습니다. 나는 문제가 그럴 수 있다고 생각한다 tellg()/seekg() 시간이 오래 걸렸지 만 GPROF는 어떤 이유로 든이를 볼 수 없었을 것입니다. 어쨌든 ifstream 하다 ~ 아니다 이 크기에 대해서도 전체 파일을 버퍼링하는 것으로 나타납니다.

도움이 되었습니까?

해결책

나는 그것이 차이를 만들 것이라고 생각하지 않습니다. 특히 Char로 Char를 읽고 있다면 I/O의 오버 헤드가 완전히 지배적 일 수 있습니다. 아무것 또 다른. 한 번에 단일 바이트를 읽는 이유는 무엇입니까? 당신은 그것이 얼마나 비효율적인지 알고 있습니까?

326KB 파일에서 가장 빠른 솔루션은 한 번에 메모리에 읽을 수 있습니다.

STD :: IFSTREAM과 C 등가의 차이는 기본적으로 가상 함수 호출 또는 2입니다. 초당 수천만 번 실행되면 차이가 발생할 수 있습니다. 그렇지 않으면 Reall이 아닙니다. 파일 I/O는 일반적으로 너무 느리기 때문에 API가 액세스하는 데 사용되는 API는 실제로 중요하지 않습니다. 훨씬 더 중요한 것은 읽기/쓰기 패턴입니다. 많은 수집이 나쁘고 순차적 읽기/쓰기가 좋다.

다른 팁

약간 느려야하지만 말한 것과 마찬가지로 병목 현상이 아닐 수도 있습니다. 당신은 왜 당신의 프로그램을 프로필하지 않고 그것이 사실인지 확인하지 않습니까?

FSTREAM에서 FILE*로 전환하여 문제가 해결되지 않을 것이라고 생각합니다. 일반적으로 둘 다 C 라이브러리에 의해 버퍼링됩니다. 또한 OS CAN 캐시 읽기 (Linux는이 측면에서 매우 좋습니다). 액세스하는 파일의 크기가 주어지면 전적으로 RAM에있을 가능성이 높습니다.

Polythinker와 마찬가지로 최선의 방법은 문제가 어디에 있는지 결정하는 프로파일 러를 트로프하는 것입니다.

또한 SeekG/TETG를 사용할 수 있습니다. 디스크가 처음으로 파일을 읽으려면 디스크가 헤드를 올바른 위치로 이동해야하기 때문에 디스크가 심하게 파편화되면 주목할만한 지연이 발생할 수 있습니다.

모든 벤치 마크는 악합니다. 기대하는 데이터에 대한 코드를 프로파일 링하십시오.

루비, 파이썬, Perl, C ++ 간의 I/O 성능 비교를 수행했습니다. 내 데이터의 경우 언어 버전 등 C ++의 변형은 몇 배나 느 렸습니다 (당시에는 크게 놀랐습니다).

나는 당신이 프로필을해야한다는 데 동의합니다. 그러나 한 번에 문자 파일을 읽는 경우 메모리 매핑 된 파일을 만드는 것은 어떻습니까? 이렇게하면 파일을 다양한 문자처럼 취급 할 수 있으며 OS는 모든 저수준 버퍼링을 처리해야합니다. 가장 단순하고 가장 빠른 솔루션은 내 책에서 승리입니다. :)

여기 극한의 조건에서 fstreamS는 실제로 매우 느립니다 ....

  1. 당신은 버퍼링을 사용합니다 (나는 그것을 충분히 강조 할 수 없습니다)
  2. 버퍼를 직접 조작합니다 (즉, 링크 된 질문에서 OP와 같은 성능이 필요한 경우). FILE*.

그래도 조기에 최적화해서는 안됩니다. fstreams 일반적으로 더 좋으며 도로에서 최적화 해야하는 경우 나중에 나중에 비용이 거의 들지 않습니다. 최악의 상황을 미리 준비하기 위해 최소한의 대리를 만드는 것이 좋습니다. fstream 이제 다른 것을 만질 필요없이 나중에 최적화 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top