《컴퓨터 시스템을 깊이 이해하라》--(一)

1. 조건 데이터 전송과 조건 제어 이동


우선 우리는 코드 차원에서 이 두 가지의 차이점을 보고 먼저 결론을 내렸다. 조건 데이터 전송 성능 > 조건 제어 전이 성능
public class IfTest {
    private static int absDiff(int x, int y) {
        int result;
        if (x < y) {
            result = y - x;
        } else {
            result = x - y;
        }
        return result;
    }


    private static int cmovDiff(int x, int y) {
        int rval = y - x;
        int eval = x - y;
        boolean nTest = x >= y;
        if (nTest) {
            rval = eval;
        }
        return rval;
    }

    public static void main(String[] args) {
        int x = 998, y = 999;
        System.out.println("absDiff start");
        long startTime = System.currentTimeMillis();
        System.out.println(absDiff(x, y));
        long endTime = System.currentTimeMillis();
        System.out.println("absDiff start time=" + (endTime - startTime));

        System.out.println("cmovDiff start");
        startTime = System.currentTimeMillis();
        System.out.println(cmovDiff(x, y));
        endTime = System.currentTimeMillis();
        System.out.println("cmovDiff start time=" + (endTime - startTime));
    }
}

자신이 사용한 시간과 시간을 비교해 보고 그 원인을 구체적으로 분석할 수 있다.
프로세서는 유수선을 사용하여 고성능을 얻는다. 유수선에서 하나의 명령 처리는 일련의 단계를 거쳐 각 단계에서 필요한 조작의 일부분을 실행해야 한다. 예를 들어 메모리에서 명령을 취하고 명령 유형을 확정하며 메모리에서 데이터를 읽고 산수 운산을 실행하며 메모리에 데이터를 쓰고 프로그램 계수기를 업데이트하는 등이다.이런 방법은 연속 지령을 중첩하는 절차를 통해 성능을 향상시키는 것이다. 예를 들어 지령을 얻는 동시에 그의 앞에 있는 지령의 산수 연산을 집행하는 것이다.그러나 이를 위해서는 집행할 지령의 서열을 미리 정해야 유수선에 집행할 지령이 가득 차 있음을 보장할 수 있다.기계가 조건 지점에 부딪혔을 때, 조건 구치가 완성된 후에야 어느 지점을 가야 할지 확정할 수 있다.그러나 지금은 기계가 그렇게 멍청하게 다른 일을 하지 않고 기다릴 수 없다. 그는 매우 정밀한 지점 예측 논리로 모든 점프 논리가 집행될지 안 될지 추측하고 확률이 가장 높은 지점의 지령을 유수선에 놓는다. 성공률이 비교적 높은 상황에서 사실 효율은 비교적 높다. 그러나 위의 그림의 x라면

2. switch 문장


정상적으로 우리가 개발하는 과정에서 조건의 지점에 부딪히면 모두 switch 문장을 사용하는 것을 권장한다. 효율이 높다고 하는데 왜 그런가?사실 어떤 경우에도 적용되는 것은 아니다. 여러 가지 가능한 결과를 가진 예측을 처리해야 이런 문장이 특히 유용하다. 다음에 끝까지 살펴보자.
우선 switch의 밑바닥 데이터 구조는 점프표이다.점프표는 하나의 수조이고, 표 항목 i는 하나의 코드 세그먼트의 주소이며, 이 코드 세그먼트는 스위치 인덱스 값이 i와 같을 때 프로그램이 취해야 할 동작을 실현한다.프로그램 코드는 스위치 인덱스 값으로 점프표 내의 수조 인용을 실행하고 점프표의 목표를 확정한다. 한 그룹의 긴if-else를 사용하는 것보다 점프표를 사용하는 장점은 스위치 문장을 실행하는 시간이 스위치 상황의 수량과 무관하다는 것이다.GCC는 스위치 상황의 수량과 스위치 상황의 값의 희소 정도에 따라 스위치 문장을 번역하고 스위치 상황의 수량이 비교적 많을 때(4개 이상), 그리고 값의 경계가 시간을 비교하면 점프표를 사용한다.

좋은 웹페이지 즐겨찾기