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 클럭 정도는 놀기 땜에 크게 유의미하진 않음.