화요일, 3월 08, 2005

implicit things

c 언어가 주류이던 시절에는 성능을 끌어내기 위해서는 architecture 를 잘알아야 했고, cache miss 와 alignment 를 신경써야 했다.

그런데 지금처럼 c++ 이나 스크립트 언어가 주류인 상황에서는 그보다 더 중요한것은 language 에서 해주는 implicit 한 feature 들의 구현에 대해 잘 알아야 성능을 끌어낼 수 있다. 현대 컴퓨터 언어는 사용이 편한 대신에 c 와 다르게 under the hood 에서 해주는 일이 꽤 많다. 그런 이유로 compiler 와 interpreter 의 동작에 대해서 알면 효율적인 코드를 쓰는데 도움이 된다. 다음은 일반적으로 현대 언어 ( c++/java 또는 interpreter 기반의 script 언어) 에서 성능이 좋은 코드를 쓰기 위해서 고려해야할 것들이다.

1. instance 들의 카피를 어떻게 최적화 하고 피할 것인가?
- reference 의 적극적인 사용과 c++ 의 경우 RVO (return value optimization ) 을 제공하는지 체크 한다.

2. 긴 list 나 array 또는 dictionary 를 어떻게 바닥부터 채우는것을 피할것인가?
- script language 에서는 흔히 list 종류의 자료구조들은 hash_table 로 구현되어 있으며, 사이즈가 어느 이상 커질때마나 rebucketting 을 한다.

3. garbage collection
- 단단한 script 언어의 경우 gc 가 제공된다. ref count 기반에 상호참조의 경우 leak 이 생기는 것을 막기 위해서 이기도 하고, 한편으로는 귀찮은 ref count 를 구현하기 싫어서이기도 하다.( 후자는 java) 이런 경우 오랜 동안 실행이 pending 되는 garbage collection 을 피하는 디자인을 고려해 봐야한다.

4. string append
string 이 정해진 size 보다 커져야 할때는 다시 할당되고 카피가 일어나야 한다. 보통의 스크립트 랭귀지에서는 append 마다 일어난다. 고로 python/php 는 이런 케이스에 join 을 제공한다. c++ 도 안심할바는 못된다. 충분한 크기를 잡고 sprintf 를 쓰는 것에 비하면 확실히 재할당과 카피는 std::string 에서는 많이 일어난다.

5. exception
dynamic language 처럼 local resource 를 book-keeping 을하고 있다면 추가 코스트는 없지만, c++ 의 경우 추가 코스트가 무엇인지를 알고 있어야 한다.

2 Comments:

At 1:27 오전, Blogger John Simon said...

정리하자면 C 를 써서 성능을 끌어내려면 하드웨어 아키텍처와 커널 아키텍처만 알면 됐는데, HLL 을 쓸땐 언어 아키텍처도 알아야 한다, 이런거 아닐까.

 
At 2:36 오전, Blogger nahodoom said...

정확한 용어를 알았습니다.

컴파일러 책을 보다보니 저러한류의 랭귀지 피쳐에 따라 해주는 implicit 한 일을 run-time system 이라고 하는군요.

 

댓글 쓰기

<< Home