일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- pyenv
- 설정
- 1002
- 백트래킹
- BOJ
- 개발환경
- streamlit
- 재귀
- 신경망 학습
- 4948
- 실버
- 백준
- 밑바닥부터 시작하는 딥러닝
- n과 m
- end to end
- 1101
- 15649
- N-Queen
- 경사하강법
- 기계학습
- 9020
- Python
- 파이싼
- 그리디 알고리즘
- 손실함수
- 파이썬
- 가상환경
- Mac
- Today
- Total
파이톨치
[시스템 프로그래밍] 최적화 본문
Program Optimization
알고리즘 시간에 asymptotic 복잡도를 배우지만 이것 이외에도 프로그램 성능에 영향을 미치는 요소들이 많다.
물론 점근적인 접근법도 중요하지만 이러한 최적화 문제도 중요하다.
많은 부분에서 컴파일러는 프로그래머를 대신해서 최적화를 진행해준다.
하지만 컴파일러가 만능은 아니기 때문에 우리는 컴파일러가 해줄 수 있는 부분과 없는 부분에 대해 이해하고 있어야 한다.
프로그램은 곱하기 보다 더하기에 강하다. 곱하기 연산자보다 더하기 연산자가 더 빠르기 때문이다.
그렇기에 프로그램은 곱하기 보단 더하기를 만들어 주는 방향으로 설계되어 있다.
또한 불필요하게 중복되는 연산도 있을 것이다. 그러한 것들을 줄여주는 것을 컴파일러가 해준다.
Generally Useful Optimization
다음과 같은 코드를 보자. 여기서 n*i에는 빨간 색으로 색칠이 되어 있다. 왜 그럴까?
for문을 돌면서 계속해서 다시 연산해 주어야 하기 때문에 불필요해서이다.
저런 코드를 이런식으로 바꾸어 주면 프로그램의 성능이 올라갈 것이다.
Reduction in Strength
또한 아까 말했다싶이 더하기에 강하기 때문에
이런 식의 변환도 진행해준다.
Optimization Blocker
하지만 아까도 말했다 싶이 컴파일러가 만능은 아니라서 컴파일러가 만질 수 없는 부분들이 있다.
이 부분을 바꾸면 프로그램이 원래 동작과 달라질 수 있기 때문에 그렇다.
Optimization Blocker : Memory Aliasing
다음 두 코드는 비슷비슷해 보인다. 결과는 비슷하게 나올 것 같다.
하지만 만약에 xp와 yp가 동일한 주소를 가진다면 어떻게 될까?
동일한 주소 공간에 x라는 값이 저장되어 있다고 생각하자.
twiddle1은 그렇다면 x -> 2x -> 4x 로 4x가 될 것이다.
twiddle2는 x - > 2x 가 될 것이다.
다른 결과가 나오는 것이다. 때문에 컴파일러는 똑똑하게도 이러한 것에 접근할 수 없다.
Two differnt memory references specify single location하는 것이 aliasing이라고 한다.
Optimization Blocker : Procedure calls
얘도 비슷해 보인다. 하지만 다른 점은 함수가 불릴 때마다 값이 달라질 수 있다는 것이다.
f의 형태가 저런식이면 counter 의 값이 변해지기 때문에 다른 함수이다.
때문에 함부로 함수를 바꾸어 줄 수 없기 때문에 함수를 그대로 유지해주기 때문에 불필요하게 함수를 반복해서 호출할 수 있다.
다음의 경우에는 함수의 내용이 바뀌지 않지만 위와 같은 이유로 바꾸어줄 수 없다.
때문에 이러한 것들이 비효율을 만들어 낸다.
때문에 길이 변수를 저장하고 사용해야 한다.
다음 코드를 보고 연습해보자.
1. 다음 코드에서 일단 제일 먼저 불편한 것이 vec_length 를 for문 안에 썼다는 점이다.
일단 저것을 따로 연산해서 저장해줄 것이다.
2. 그리고 for문 안에 *dest 가 있다는 것도 불편하다. 포인터를 사용하면 왔다갔다 해야하기 때문에 시간이 오래 걸린다.
얘를 for문 밖으로 이동을 시켜줄 것이다. 그리고 값의 저장은 포인터가 아닌 지역변수에 해준다.
3. get_vec_element도 불편하다. 왜냐하면 배열의 첫 머리만 알면 찾아갈 수 있는데 저렇게 쓸 이유가 없다.
때문에 이렇게 최적화 시키면 많이 빨라진다.
'대학수업' 카테고리의 다른 글
[웹 프로그래밍] Bootstrap (0) | 2022.10.03 |
---|---|
[시스템 프로그래밍] Superscalar Processor (0) | 2022.10.03 |
[컴퓨터 구조] 컴퓨터의 성능은 어떻게 체크할까? (0) | 2022.09.23 |
[컴퓨터 구조] 컴퓨터는 어떻게 동작할까? (1) | 2022.09.23 |
[웹 프로그래밍] CSS (0) | 2022.09.15 |