https://gall.dcinside.com/m/github/34144
어제 쓴 글인데
생각보다 관심을 많이 줘서 질답해드림
금융은 뭐하길래 속도가 중요하냐?
=> 1금융은 당연히 원장 신뢰성이 중요하기 때문에 성능보단 안정성이 우선임.
내가 말하는 건 자산운용, 트레이딩 등에서 쓰이는 애플리케이션들 ㅇㅇ
트레이딩 플랫폼, HFT, 퀀트 등등
이쪽 업계는 최근에 FPGA, ASIC 인력 엄청나게 흡수한 걸로 유명함
만드는 서비스 전체에서 그런 연산이 필요한 부분이 얼마나 있을까?
=> 나는 웹땔감 경력밖에 없어서, 적어도 내가 보고들은 한에서는 없음.
분명히 성능 개선이 필요한 부분이 생기긴 하는데 주로 DB 병목임.
DB 자체를 수직 분산하거나 쿼리 최적화하면 개선됨.
IT 서비스 성능 문제의 대다수는 DB병목, 인프라 문제로 종결된다.
그럼 머 써야함? C? 어셈블리?
=> 성능이 요구되는 분야는 아무리 최적화를 해도 끝도 없이 요구됨.
위에서 썼듯이 소프트웨어 최적화로 모자라서 fpga 끌고 오는 애들도 있음
그러나 그렇지 않은 분야는 (나의 경우처럼)
성능 최적화라는 단어가 아주 대단한 비용을 들일 필요가 없는 경우가 더 많음
결론: 회사에서 쓰는 거나 잘 쓰셈
이것(성능)때문에 리눅스 커널이 C 쓰는거 아님?
=> 반은 맞고 반은 틀림.
사실 뭐 운영체제를 C로 짜느냐 Java로 짜느냐 하는 거였으면 성능 상의 이유가 맞음.
그런데 C냐 C++이냐의 고민은 다른 문제지.
우선 중요한건 C++로 운영체제를 만든다손 치더라도
동적 할당이나 예외 매커니즘을 쓸 수 없는 것은 감안해야함
이 기능들 자체가 운영체제에 크게 의존하고 있기 때문에
운영체제를 C++로 만들면 직접 구현하는 수밖에 없음
그리고 그것 외에도 C++을 쓰면 생기는 문제가 ABI문제임
오버로딩이나 클래스 멤버함수 등을 쓰면 필연적으로 Name mangling이 발생함.
템플릿도 전이적으로 이 기능에 의존하니 마찬가지.
대부분의 현대 운영체제는 모놀리틱 커널 방식을 채택했는데
이 경우 커널 모듈이 운영체제 커널에 직접 링크되는 매커니즘이 필요함
알다시피 name mangling은 표준적인 동작이 아니기 때문에
링크 과정에 영향을 미치게끔 돼있음
자 그래서 결론적으로
STL 컨테이너 못쓰고, 예외 못쓰고, 템플릿 못쓰고, 오버로딩 못하고, 클래스 못쓰면
남는 게 뭐지?
그냥 C를 쓰게 되는 거야
사실 커널은 ABI만 C로 노출해도 되는데 그냥 토발즈가 싫어해서 안넘어간거 아님? 할당 안되는건... 정말 넣고싶었으면 kmalloc 쓰게 어떻게 개조 가능할 거 같은데 이건 내가 cpp 몰라서 뭐라 못하겠음. Rust는 custom allocator 넣어서 구현하긴 했는데 cpp에도 이런 기능이 있을듯?
애초에 윈도우가 cpp인거 생각하면 걍 철학 차이지 - dc App
nt 커널 코어는 c하고 어셈블리임
stl 못 쓰고 템플릿 못 쓰고 오버로딩 못 쓰는 거는 abi 차원에서 얘기지, 외부로 드러나지 않는 구현에서는 다 써도 됨
stl 쓸려면 커널 내부에 따로 구현해야 되긴 함
DB 개발 쪽인데 저런 것 까지 못 쓰게 하는 부분은 병목이 발생한다거나 진짜 미친듯이 자주 실행되는 정말 특정 코드들만 그렇지 않나. 일단 기본적으로 가능하면 메모리 쓰기 지양하는건 맞는데 저정도까지 쥐어짜보인적은 없는듯.
종만북 저자가 트레이딩 쪽에서 일했던 거 같은디 성능 최적화가 존나 중요하긴 하구낭..