namespace kyky
{
bool is_pangram(const char* str)
{
int ret = 0;
while (*str) { // 포인터 간접 어드레싱, compare, 탈출점프
ret |= 1 << ((*str++ & '_') - 65); // 포인터 간접 어드레싱, AND연산, 빼기연산, 쉬프트연산, OR 연산, 증가연산,
} // 반복점프 ( 총 10개 )
ret &= ((1 << 26) - 1);
return ret == ((1 << 26) - 1);
}
void run(void* dst)
{
bool* b = (bool*)dst;
b[0] = is_pangram(src1);
b[1] = is_pangram(src2);
}
}
//------------------------------+---------------------------------------------------------------
namespace kyk2
{
bool is_pangram(const char* str)
{
bool alpha[128] = {}; // stack 초기화 비용 발생 하지만 최대 최적화될 경우 128비트 즉 16바이트 단위로 8번 이터레이션
int i = 0;
while (str[i]) { // 배열 간접 어드레싱, compare, 탈출점프
alpha[(str[i++] & '_')] = 1; // 배열 간접 어드레싱, AND연산, 배열 간접 어드레싱, 대입연산, 증가연산
// 반복점프 ( 총 9개 )
}
for (i = 65; i <= 90; ++i) // 26회 순회 * 5.5 ( 비교, 점프, 배열 간접 어드레싱, 비교( 탈출 ), 증가, 반복 점프 )
if (!alpha[i])return 0; // 하지만 빠른 기각 가능
return 1;
}
void run(void* dst)
{
bool* b = (bool*)dst;
b[0] = is_pangram(src1);
b[1] = is_pangram(src2);
}
}
for 루프는 보통 기본요건만 갖춰도 4클럭 정도를 소요. 하지만 최근 프로세서들에선 3.5 클럭 정도로 대강 계산됨.
그래서 메인 루프 비교는 10 : 9 이 아닌 9.5 : 8.5 정도가 됨.
알고리즘은 앞의 것이 낫지만,
뒤의 코드는 불리한 가운데 캐시라인과 빠른 기각의 이점을 보게 됨.
아마도 예제 문자열이 많이 길어서 캐시가 불리해지고, 빠른 기각이 불리한 ( z 가 비어있는 ) 형식이었다면 전자가 이겼을 것으로 판단됨.
다만, ideone 에서 성능 비교시 서버 상태에 따라 100만번 수행 최소값을 구해도 +-50 클럭 정도는 놀기 땜에 크게 유의미하진 않음.
주석 일부러안보이게 달은건가
응? 주석 안보여?
넹 모바일에서는 옅은 회색으로 보임
컴은잘보이는데
ㄴㄴ 메모장에 복붙해서 읽음 잘 배웠습니다
복붙 오타 하나 수정 ㅋ
미안 숫자 보기 어려워서 전체 다시 세서 적음.