이 글은 ari님의 글 '성능에 대한 미신'(http://sparcs.kaist.ac.kr/~ari/each/article.each.463.html)에 대한 세번째 트랙백입니다.
마지막까지 남는 의문이 있으니 그걸 다시 한 번 밝히고 저의 트랙백 시리즈는 여기서 접도록 하겠습니다. 어차피 ari님이나 저나 실험을 많이 해본 것도 아니고 해봐서 결론이 지어질 것도 아니니 말입니다. ari님께서 수고스럽게 답변을 주셨는데도 제 의문은 아직도 남습니다. 아래 크게 두 단락에 걸쳐 있습니다.
ari님께서 남겨주신 답변은 녹색으로 처리하였습니다. 일부 문장만 따서 인용하지만 의도적으로 부분만 가지고 곡해할 생각은 없습니다.
프로그래머가 의도하지 않아도 자동으로 추가되는 그런 코드는 무시해도 좋을 만큼 미미합니다. 전체 코드에서 비중이 0.001%나 될까요 ? 생각보다 그렇게 추가되는 어셈블리는 많지도 않습니다.
이 부분에 대한 논증이 부족하다는 생각이 듭니다. 논증 부족을 운운하는 이유는 ari님께서 원글에 '미신'이라는 표현을 사용하셨기 때문입니다. 미신이라 불리우는 것들은 과학적인 방법의 실험이나 관찰이 동반되지 않은 결론도출된 현상이나 믿음일 것입니다. '미신'이라는 주장을 하려면 특히 스스로의 주장부터 합리적인 추론과 증거제시가 필요하다고 봅니다.
저는 C와 C++이 성능 차이를 크게 보이지는 않는다는 쪽을 '믿는' 편이긴 합니다. 그러나 C가 C++보다 조금이나마 빠르지 않을까하는 생각도 하는 편입니다. 어느 쪽이 빠르다 느리다라고 단정을 짓고 싶진 않지만 'C가 C++보다 빠르다'라는 주장은 컴파일러가 빠르다는 소리가 아니니까 곧 '어떤 작업을 위해 C로 작성한 코드가 C++로 작성한 코드보다 빠르다'와 동일합니다. 어느 상황에서나 C가 C++보다 빠르다고 주장할 생각은 없습니다.
그러나 분명히 미니멀리즘의 측면에서 보면 C가 유리한 입장이고 분명히 빠른 경우도 있다고 생각하는 거죠. 그러니까 C가 C++보다 빠르다는 말은 지나친 일반화이지만(저는 여기에 동의함을 이미 밝힌 바 있습니다) 그 주장이 미신이라고 일축하며 C와 C++이 차이가 없다라는 말은 논거가 부족한 주장이라는 생각이 든다는 거죠. 여기에는 계속 관점 차이가 존재할 테니 ari님의 의견은 제가 충분히 납득하고 있고 그냥 제 입장은 이렇다는 걸 말씀드립니다.
마지막으로 한 가지만 질문을 드립니다.
OS에서도 너무너무 빈번하게 수행되는 코드는 C도 아닌 어셈으로 작성할 수밖에 없습니다. 그런 코드는 C 컴파일러가 생성해내지도 못합니다. CPU 제조사에서 나온 메뉴얼을 보고 거기 나온 인스트럭션들을 그대로 따라 써야 하죠.
제 질문을 다시 반복하면 '왜 OS에서조차 성능차이가 발생하지도 않는, 빈번하게 수행되지 않는 코드를 C++이나 Java로 작성하지 않는가?'라고 할 수 있겠네요. ari님의 주장을 확장하게 되면 빈번하게 수행되는 부분이 어셈블리 인스트럭션으로 되어 있으니까 나머지는 C++이나 Java로 작성해도 된다는 결론에 이르거든요. 제가 지나친 귀납에 빠진 것일 수도 있겠습니다만…
저는 OS처럼 성능이 바로 경쟁력이 되고 결국 돈이 되는 DBMS 쪽을 하고 있습니다. DBMS의 API를 C나 Java(JNI / Pure-Java)로 개발하는 일을 지금도 하고 있습니다. 그런데 분명히 비슷한 작업(ODBC, JDBC, ESQL)에 대해 코드를 작성하는데도 각 API 구현 별로 성능차이가 발생합니다. 당연히 JDBC 버전이 다른 C API에 비해 느립니다. 단순히 JDBC가 느린 이유가 (JDBC 구현을 하는 개발자나 JVM 개발자가) 최적화를 잘못해서 그런 것일까요? 저는 Java의 특성상 C보다 무거울 수 밖에 없다고 생각합니다. 필요에 따라 다른 언어로 된 API를 제공해야 하지만 성능 차이가 존재하는 걸 인정할 수 밖에 없는 현실에 처해 있는 거죠. ^^
바쁜 시간 쪼개서 답변 주신 ari님께 진심으로 감사드립니다.