2014-09-03 1 views
0

내 프로그램이 바이너리 모드 istream을 사용하여 읽을 파일에서 현재 바이트 스트림을 가져 오려고합니다. 데이터를 사용하려면 나중에 프로그램에서 개별 비트를 사용해야합니다. 현재 내가 확신 할 수없는 세 가지가 있습니다. 파일에서 정보를 읽은 다음 처리하고 나중에 저장합니다. 처리는 내가 가장 확신 할 수없는 부분이며, 나머지 두 가지는 부 조회입니다.바이트의 스트림을 C++의 비트로 나누기

바이너리 istream이 현재 사용중인 데이터를 수신하는 데 데이터를받는 더 빠른 방법이 있습니까? 데이터를 저장하기 위해 크기가 컴파일 타임에 알려지지 않을 것이고 최대 2MB의 데이터까지 확장 할 수있는 bool 벡터를 사용하려고 했으므로 데이터를 저장하는 더 좋은 방법이 있습니까? 이 문제가 스토리지에 중요한 경우 비트가 필요하기 전에 비교적 많은 양의 메모리를 사용할 수있는 또 다른 프로세스가있을 것입니다.

마지막 문제는 가장 귀찮은 원인으로, 바이트를 비트로 분할하는 방법입니다.이 방법은 많은 양의 데이터를 루프에 넣기 때문에 가능한 한 효율적 이길 원합니다. 첫 번째 아이디어와 현재 내가 선호하는 아이디어는 bitwise &을 사용하여 비트가 설정되어 있는지 확인한 다음 bool을 설정하는 것입니다.

bitbool = (byte&128) != 0 

다음 방법 그러나 나는이 생각하고, 최상위 비트를 남겨 두 개의 가장 중요한을 떠나 이동하고 두 번째 가장 중요한을 분리 이전을 사용하는 오른쪽 시프트 및 다음 왼쪽 시프트이다 이전 방법보다 효율성이 떨어집니다.

마지막 방법은 8 개의 와이드 비트셋을 사용하여 바이트를 변환 한 다음 비트를 읽고 bool을 설정하는 것입니다. 나는 비트 맵을 사용하지 않았기 때문에 비트 세트에 대해서는 확신하지 못한다. 비록 나의 연구가이 목적을 위해 그것들을 사용하는 것이 가능할 지 모르지만 나는 그것이 얼마나 효율적인지 확신하지 못한다.

+0

실행 중에 마이크로 세컨드를 면도해야합니까? 그렇다면 컴파일러 옵션을 사용하여 어셈블리 코드를 내보내고 각 변형에 대해 생성 된 내용을 비교할 수 있습니다. 또는 두 옵션을 모두 작성하고 시간을 측정하십시오. CPU 캐시 미스는 최적의 코드가 될 수있는 실행을 심각하게 늦출 수 있습니다. – Jay

답변

1

바이너리 istream이 현재 사용중인 데이터를 수신하는 데 데이터를받는 더 빠른 방법이 있습니까?

파일에서 메모리로 데이터를 가져 오는 더 빠른 방법이 있지만 대부분 플랫폼 별이며 OS 호출 또는 하드웨어 액세스가 필요합니다.

파일에서 데이터를 읽는 열쇠는 하드 드라이브를 계속 회전시키는 것입니다. 이는 최소한의 요청으로 최대한 많은 데이터를 읽는 것을 의미합니다. std::istream::read 메서드와 큰 버퍼를 사용하십시오.

프로그램이 하드 드라이브의 데이터 전송 속도보다 느리게 실행될 수 있습니다. 이 경우 여러 스레드 실행을 사용하는 것이 좋습니다. 하나의 스레드가 데이터를 버퍼로 읽습니다. 다른 스레드는 버퍼에서 데이터를 추출하여 처리합니다. 속도 차이를 조정하려면 추가 버퍼가 필요할 수 있습니다. "이중 버퍼링 기술"연구.

바이트를 비트로 분할하는 방법은 무엇입니까?

대부분의 프로세서에서 테스트하거나 비트를 추출하는 빠른 방법이 없습니다. 일반적으로 비트를 뒤집을 때 실행 속도가 느려집니다.

코드를 작성한 다음 비트 트위 들링 기능을위한 어셈블리 언어를 인쇄하십시오. 이렇게하면 컴파일러가 코드를 생성 한 방법을 알 수 있습니다.

어셈블리 언어 목록을 저장하십시오. 그런 다음 컴파일러 옵션을 size에 대해 high로 설정하십시오.함수의 어셈블리 언어를보십시오. 원래 리스팅과 비교하십시오. 그런 다음 컴파일러 옵션을 고속으로 설정하십시오. 원래 리스팅과 비교하십시오. 가장 잘 맞는 버전을 선택하십시오. 플랫폼 프로세서 용 어셈블리 언어의 마스터 인 경우 컴파일러의 어셈블리 언어를 사용하여 최적화하십시오.

다른 최적화
첫째, PROFILE 코드. 병목 현상이 어디 있는지 확인하십시오. 대부분의 상황에서 병목 현상은 생각하는 곳이 아닙니다. 병목 현상 코드는 최적화를 시작할 수있는 곳입니다.

코드를 다시 디자인 해보십시오. 이것은 대개 최고의 성능 이득을 생성합니다.
예를 들어, 함수 호출, 스위치, if 문 및 루프를 줄이기위한 코드를 설계하십시오. 여기에는 점프 또는 분기가 포함되어있어 처리 속도가 느려집니다. 가장 빠른 실행 아이디어는 점프를 포함하지 않습니다.

더 효율적인 데이터 캐시 사용을위한 코드를 재 설계하십시오.
불량 사용 :

int a[10240], b[10240], c[10240], d[10240]; 

더 나은 사용 : 당신이 4 개 배열이있는 경우 예를 들어, 4 개 변수를 포함하는 구조 중 하나 개 배열로 변경 더 힌트를

struct Items 
    { 
    int a, b, c, d; 
    } 
    Item array[10240]; 

를 검색 "[C++] 최적화"를위한 StackOverflow.

+0

제안 해 주셔서 감사합니다. bool 벡터가 내 코드를 char 벡터로 전환하는 속도를 늦추고 있었기 때문에 비트에 8 배 더 많은 메모리를 먹어도 프로세스가 4 배 빠르게 실행되었습니다. – Oracle