2013-07-16 4 views
1

프로젝트의 일환으로 큰 루프 (약 10^6에서 10^7 반복) 내에서 마스크 계산을 수행해야합니다. 나는 최소 수의 비트 (1-8) 또는 특정 위치 (7-0, 여기서 7은 가장 중요한 비트)의 비트를 유지해야한다. 주 코드에서 마스크를 계산하지 않기 위해 성능을 위해 다음과 같은 아이디어를 제안했습니다. 각 경우 매개 변수는 0에서 7까지의 부호없는 문자입니다.성능을 위해 마스크를 미리 계산하십시오.

1) 두 개의 전역 배열 헤더 파일 (bitops.h)에 정의되어 있습니다 :

char mask[8] = {1, 3, 7, 15, 31, 63, 127, 255}; 
char position[8] = {1, 2, 4, 8, 16, 32, 64, 128}; 

여기서 메모리 대기 시간 때문에 기다려야 할 수도 있습니다.

2)() 매크로 통해 간단한 연산을 이용하여 마스크를 계산한다

#define mask(x) ((1 << (x + 1)) - 1) 
#define position(x) (1 << x) 

우리가 3 클록 사이클 마스크 위치에만 1 필요한 곳.

무엇을 제안합니까? 두 번째 옵션이 실제로 더 빠릅니까? 또는 처음으로 갈 경우 사전에 프로세서가 상수를 캐시합니까?

시간 내 주셔서 감사합니다.

+1

실제 성능에 문제가 있습니까? –

+0

언제나 마스크를 레지스터에 넣고 초고속으로 사용할 수 있습니다. –

+0

인덱스를 사용하여 마스크에 액세스해야하기 때문에 마스크를 레지스터에 넣을 수 없습니다. 인덱스는 매크로에서 x와 동일한 역할을합니다. – someone

답변

1

큰 차이점이 있는지 실제로 벤치마킹해야하지만 일반적으로 간단한 계산 (예 : 몇주기)에서는 온 - 더 - 플라이 (on-the-fly)로 계산하는 것이 더 좋습니다. 복잡한 계산 (10s 사이클 이상)은 룩업 테이블이 더 효율적일 수 있습니다. 직접 계산이이 경우에 들어갈 수있는 방법 인 것처럼 보이지만, 벤치마킹하지 않는 한 확실하게 알 수 없을 정도로 고려해야 할 다른 많은 요소가 있습니다.

+0

실제로 코드는 스테 가노 그래퍼 알고리즘의 일부입니다. 데이터는 이미지 내부에 숨겨져 있습니다. 따라서 더 빠를수록 좋습니다!귀하의 답변에 – someone

+0

감사합니다! – someone

1

배열이 항상 캐시에 있어야하기 때문에 첫 번째 것이 더 나을 것이라고 기대합니다. 확신하고 싶다면 벤치마킹해야합니다.

하지만이 루프가 병목 현상이라고 판단하지 않는 한 걱정할 필요가 없습니다. 먼저 가장 명확한 방법으로 수행하십시오. 성능이 문제라면 다시 설계해야 할 필요가 없습니다.

+0

답변 해 주셔서 감사합니다! – someone

관련 문제