ari님 글에 대한 두번째 트랙백
이 글은 ari님의 글 '성능에 대한 미신'(http://sparcs.kaist.ac.kr/~ari/each/article.each.463.html)에 대한 두번째 트랙백입니다. 답글로 남기기에는 너무 길어서져 트랙백으로 보냅니다.
제 블로그에 남겨주신 답글은 감사히 읽어보았습니다.
그런데 제가 궁금한 것은 C와 C++, Java는 태생적으로 다른 언어이고 어떤 하나의 작업을 위해서 다른 코드를 생성할 수 밖에 없고 그 다른 코드가 다른 어셈블리 인스트럭션을 만들어 낼 수 밖에 없습니다. 단순 연산이라면 동일한 어셈블리 코드를 만들어내지만 그거야 무의미한 비교라는 생각이 들거든요.
단순 연산말고 좀 더 복잡한 작업을 구현해야 하는 상황에서 '비교'를 하게 된다면 다른 코드가 나올 수 밖에 없고 그럼 성능 차이가 발생할 수 있다는 결론에 이르게 됩니다. 비교라면 어떤 최종적인 작업차원에서 비교해야지 상이한 언어로 똑같은 코드를 만들어낸다는 게 어렵겠죠.
게다가 제가 첫번째 트랙백에서 언급했다시피 C++이나 Java를 쓰기 때문에 프로그래머가 의도하지 않아도 자동으로 사용될 수 밖에 없는 기능들(예를 들면 폴리모피즘에 관련된)에 관련된 어셈블리 코드들이 프로그래머가 알게 모르게 생성될 것이거든요. 그게 장점일 수도 있지만 그런 기능이 굳이 필요없는 경우에는 성능 저하의 원인이 될 수 있다고 봅니다.(OOP 언어를 최적화기 어려운 이유도 같은 맥락에서 연유한다고 봅니다.)
제 의문을 요약하면 ari님께서 전제하시는 '똑같은 소스 코드를 C와 C++로 짠다면'이라는 가정이 처음부터 불가능하므로 동일한 작업을 위해 작성한 것이라 해도 다른 소스 코드가 나오게 되고 그럼 성능 차이가 약간이나마 쌓이게 될 것이고 결국 반복작업이라도 하게 되면 성능차이가 눈에 띌만큼 보이지 않겠는가하는 것이죠.
예를 들면 OS를 C++이나 자바로 만들지 않는 이유가 나름대로 있지 않을까요? 그게 설계 편의성에서 차이가 있을 수도 있지만 성능면에서 차이가 있어서일 수도 있다고 생각이 듭니다.
C++을 잘 알지 못하니 제대로 배워봤으면 하는 욕심이 있는데 Java로도 쩔쩔매고 있는 형편이라… 이런 이야기를 겁없이 떠든다니 좀 부끄럽기도 하네요.
댓글 2개
ari
프로그래머가 의도하지 않아도 자동으로 추가되는 그런 코드는 무시해도 좋을 만큼 미미합니다. 전체 코드에서 비중이 0.001%나 될까요 ? 생각보다 그렇게 추가되는 어셈블리는 많지도 않습니다.
성능의 차이가 약간이나마 쌓일거라고 하셨는데, 그게 워낙 미미해서 아무리 쌓이고 쌓여도 눈에 띌 정도가 되지 않습니다. 1년동안 수행하면 1초의 차이가 발생하는 정도라고 할까요. 이런 차이는 무시해도 좋습니다.
OS의 경우는 전혀 다른 영역의 프로그래밍입니다. OS를 만들 때는 어셈 인스트럭션 레벨에서 하나하나가 최적화되는 수준입니다. 왜냐면 OS는 늘상 실행되기 때문입니다. 특히 context-switching에 관련된 코드는 5ms마다 실행되는만큼 컴퓨터가 켜있는 내내 수행이 되죠. 물론 이 코드의 대부분은 CPU의 도움을 받은 특화된 인스트럭션들입니다. OS를 만드는데 적용되는 최적화는 일반 어플리케이션을 만들 때는 적용이 되지 않습니다.
OS에서도 context-switching과 같이 엄청나게 빈번하게 수행되는 코드가 아니라 기껏해야 하루에 1,2번 수행되는 코드에서까지 최적화를 하지는 않습니다.
OS에서도 너무너무 빈번하게 수행되는 코드는 C도 아닌 어셈으로 작성할 수밖에 없습니다. 그런 코드는 C 컴파일러가 생성해내지도 못합니다. CPU 제조사에서 나온 메뉴얼을 보고 거기 나온 인스트럭션들을 그대로 따라 써야 하죠.
결론을 얘기하자면, 1. C++이라고 해서 그렇게 추가되는 인스트럭션이 많지도 않고 전체에서 비중이 엄청나게 미미하므로 무시해도 좋다. 이들로 인한 성능 차이는 없는 거나 마찬가지다. 2. OS에 적용하는 최적화는 일반적인 최적화와는 다르다, 라는 것입니다.
Terzeron
1. C++이라고 해서 그렇게 추가되는 인스트럭션이 많지도 않고
–> 과연 그럴까요?
2. 전체에서 비중이 엄청나게 미미하므로 무시해도 좋다
–> 근거 없음
3. OS에 적용하는 최적화는 일반적인 최적화와는 다르다
–> 1,2의 가정이 옳다면 OS에 써도 상관없다는 결론이 도출되므로 자가당착의 논리임