YUDA't

- 공통된 부분 표현식을 하나로 모으라


- 비싼 연산을 싼 연산으로 대체해라: 연산강도의 감축(reduction in strength)

ex. 나눗셈과 나머지 연산은 곱셈보다 훨씬 느리다.

따라서 나눗셈을 곱셈의 역연산으로 대체한다든가, 나누는 수가 2의 승수일 때 마스킹 연산(AND 연산)으로 나머지 연산을 대체하면 성능을 개선할 수 있을 것이다.


- 루프를 펼치거나 제거하라

루프를 준비하고 실행하는 데에는 시간과 메모리가 든다. 

만약 루프가 너무 길지 않다면, 반복주기 내용을 쭉 장성하는 게 더 효율적일 수 있다.


for i in range(3):
    a[i] = b[i] + c[i]

대신

a[0] = b[0] + c[0]
a[1] = b[1] + c[1]
a[2] = b[2] + c[2]

을 사용하면 루프, 특히 분기(branching)의 오버헤드가 없어진다.


- 빈번히 사용되는 값을 캐싱하라

캐싱연산은 밖에서는 보이지 않는 게 제일 좋다. 

그래서 프로그램을 더 빠르게 하는 효과 외에는 나머지 부분에 영향이 없어야 한다.


- 특수한 메모리 할당 함수를 작성하라


- 입력과 출력을 버퍼링하라

버퍼링을 하면 트랜잭션들을 모아 한번에 처리하기 때문에 잦은 연산을 가능한 한 적은 오버헤드로 수행할 수 있다.

예를 들어, C 프로그램이 printf를 호출하면 버퍼가 꽉 차거나 명시적으로 비워지기 전까지는 OS로 넘기지 않는다.


- 특수한 경우를 따로 처리하라


- 결과를 사전계산하라

값을 사전계산해서 필요할 때 바로 쓸 수 있게 준비해두면 프로그램을 더 빠르게 만들 수 있다.


- 근사값을 사용하라

정확성이 중요하지 않은 경우라면 정밀도가 더 떨어지는 데이터 타입을 사용한다.


- 저수준 언어로 재작성하라