# 덜 느린 C/C++ 코드 작성하는 법 배우기

> Clean Markdown view of GeekNews topic #20442. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=20442](https://news.hada.io/topic?id=20442)
- GeekNews Markdown: [https://news.hada.io/topic/20442.md](https://news.hada.io/topic/20442.md)
- Type: GN+
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-04-21T09:14:53+09:00
- Updated: 2025-04-21T09:14:53+09:00
- Original source: [github.com/ashvardanian](https://github.com/ashvardanian/less_slow.cpp)
- Points: 39
- Comments: 1

## Summary

**고성능 C/C++ 및 어셈블리 코딩 기법**을 학습할 수 있는 오픈소스 프로젝트로, 다양한 **하드웨어 최적화 기법**과 **벤치마크 측정 방법**을 포함합니다. **입력 생성 비용**, **수학 함수 근사화**, **CPU 분기 예측**, **멀티코어 병렬화** 등 다양한 퍼포먼스 트릭을 설명하며, **플랫폼별 최적화 기법**도 다룹니다. **Google Benchmark** 기반으로 벤치마크 실행 및 통계 처리 자동화 기능을 제공하며, **병렬 알고리듬, 코루틴, 다형성** 등 고성능 코드 구현을 위한 다양한 기법을 소개합니다. 이 프로젝트는 **Linux, Windows, macOS** 환경에서 동작하며, **GCC, Clang** 기반의 Linux 환경을 추천합니다.

## Topic Body

- **고성능 C/C++ 및 어셈블리 코딩 기법**을 실전 예제로 학습할 수 있는 오픈소스 프로젝트  
- STL 대신 **최적화된 라이브러리**와 다양한 하드웨어 최적화 기법 사용 예시 포함  
- **입력 생성 비용**, **수학 함수 근사화**, **CPU 분기 예측**, **멀티코어 병렬화** 등 다양한 퍼포먼스 트릭 설명  
- CUDA, PTX, ASM, FPGA, JSON 처리 등 **플랫폼별 최적화 기법**과 **벤치마크 측정 방법**까지 폭넓게 다룸  
- Google Benchmark 기반으로 **벤치마크 실행 및 통계 처리 자동화** 기능 제공  
  
---  
  
### 성능 지향 C/C++ 및 어셈블리 코드 작성법  
  
- 이 프로젝트는 고성능 소프트웨어 설계에 필요한 **직관과 사고방식 형성**을 돕는 벤치마크 코드 모음임  
- 현대 코드에서 흔한 **버그, 보안 문제, 성능 병목** 등을 피하기 위한 실전 코딩 예제를 다룸  
- **대학 강의나 부트캠프**에서 접하기 어려운 실무 성능 지향 기법을 체계적으로 소개함  
- 대부분의 코드는 **GCC, Clang** 기반의 Linux 환경에서 동작하지만, Windows와 macOS도 일부 지원함  
- 고성능 코드 구현을 위한 **병렬 알고리듬, 코루틴, 다형성** 등도 함께 소개함  
  
### 주요 항목들  
  
- **무려 100배 저렴한 무작위 입력?!** 알고리듬보다 입력 생성이 더 느릴 수도 있다는 사실  
- **1% 오차로 비용은 1/40:** [`std::sin`](https://en.cppreference.com/w/cpp/numeric/math/sin) 같은 STL 삼각함수를 단 3줄 코드로 근사화해보기  
- **지연 로직이 4배 더 빠르다고?** 커스텀 [`std::ranges`](https://en.cppreference.com/w/cpp/ranges)와 반복자로 극한의 게으름 구현  
- **`-O3`를 넘는 컴파일러 최적화:** 숨겨진 플래그와 트릭으로 성능을 2배 더 끌어올릴 수 있음  
- **행렬 곱셈이 문제라고?** 연산 수는 60% 적지만 3x3x3 GEMM이 4x4x4보다 70% 느릴 수 있음  
- **AI 스케일링의 진실?** 이론적 [ALU](https://en.wikipedia.org/wiki/Arithmetic_logic_unit) 처리량과 실제 [BLAS](https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms) 성능 간의 간극 측정해보기  
- **조건문 몇 개가 많다고 할 수 있을까?** 단 10줄 코드로 CPU 분기 예측기의 한계 실험  
- **재귀가 더 좋아?** 어디서 [`SEGFAULT`](https://en.wikipedia.org/wiki/Segmentation_fault) 나는지 스택 깊이 직접 측정해보자  
- **예외를 피해야 하는 이유?** `std::error_code`나 [`std::variant`](https://en.cppreference.com/w/cpp/utility/variant) 같은 대안 써볼래?  
- **멀티코어 확장하려면?** [OpenMP](https://en.wikipedia.org/wiki/OpenMP), Intel oneTBB, 혹은 직접 만든 스레드 풀을 이용하는 법  
- **메모리 할당 없이 [JSON](https://www.json.org/json-en.html) 처리하는 법?** C++20이 더 나을까, 아니면 구식 C99 도구가 더 간단할까?  
- **STL의 연관 컨테이너 제대로 쓰려면** 커스텀 키와 투명 비교자를 어떻게 활용할까?  
- **수제 파서보다 빠른 방법이 있다면?** [`consteval`](https://en.cppreference.com/w/cpp/language/consteval) 기반 정규표현식 엔진으로 정면 승부  
- **포인터 크기는 진짜 64비트일까?** [포인터 태깅](https://en.wikipedia.org/wiki/Tagged_pointer)을 활용해보자  
- **[UDP](https://www.cloudflare.com/learning/ddos/glossary/user-datagram-protocol-udp/)가 얼마나 많은 패킷을 드롭할까?** 사용자 공간에서 [`io_uring`](https://en.wikipedia.org/wiki/Io_uring)으로 웹 요청 처리까지 해보자  
- **Scatter-Gather**로 50% 더 빠른 벡터화된 비연속 메모리 연산 구현  
- **Intel oneAPI vs Nvidia CCCL?** `&lt;thrust&gt;`와 `&lt;cub&gt;` 은 뭐가 특별할까?  
- **CUDA C++, [PTX](https://en.wikipedia.org/wiki/Parallel_Thread_Execution), SASS**는 CPU 코드와 뭐가 다른가?  
- **성능 민감한 코드라면?** 인트린식, 인라인 `asm`, 또는 `.S` 파일 중 어떤 걸 선택할지 비교  
- **Tensor Core와 메모리 구조** — CPU와 Volta, Ampere, Hopper, Blackwell GPU는 어떻게 다를까?  
- **FPGA 코딩은 GPU랑 어떻게 다를까?** 고수준 합성(HLS), Verilog, VHDL의 차이점은? 🔜 #36  
- **Encrypted Enclave란 무엇인가?** Intel SGX, AMD SEV, ARM Realm의 지연시간 비교 🔜 #31  
  
### 실행 방법 및 환경 설정  
  
- **Linux + GCC 환경 추천**, WSL 또는 Mac의 Clang(비기본 배포판)도 사용 가능  
- `CMake`, `liburing`, `OpenBLAS`, `g++`, `build-essential` 설치 필요  
- `less_slow` 실행 파일을 빌드 후 실행하면 벤치마크 자동 수행됨  
  
```sh  
git clone https://github.com/ashvardanian/less_slow.cpp.git  
cd less_slow.cpp  
pip install cmake --upgrade  
sudo apt install -y build-essential g++ liburing-dev libopenblas-base  
cmake -B build_release -D CMAKE_BUILD_TYPE=Release  
cmake --build build_release --config Release  
build_release/less_slow  
```  
  
- CUDA 및 Intel TBB 사용 여부 선택 가능 (`-D USE_INTEL_TBB=OFF` 등 플래그 사용)  
- 실행시 특정 벤치마크만 선택 실행하거나 JSON 저장, 출력 포맷 지정 가능  
  
```sh  
build_release/less_slow --benchmark_filter=std_sort  
build_release/less_slow --benchmark_out=results.json --benchmark_format=json  
```  
  
### 성능 측정 향상 팁  
  
- **SMT 비활성화**, **random interleaving 사용**으로 노이즈 최소화  
- Google Benchmark의 `--benchmark_perf_counters` 옵션으로 하드웨어 성능카운터 측정 가능  
  
```sh  
sudo build_release/less_slow --benchmark_perf_counters="CYCLES,INSTRUCTIONS"  
```  
  
- 또는 Linux `perf` 툴을 이용한 벤치마크 측정 가능  
  
```sh  
sudo perf stat taskset 0xEFFFEFFFEFFFEFFFEFFFEFFFEFFFEFFF build_release/less_slow --benchmark_filter=super_sort  
```  
  
### 프로젝트 파일 구조  
  
- 메인 소스: `less_slow.cpp` (CPU 벤치마크 코드 중심)  
- 플랫폼별 최적화 파일 포함: x86/ARM용 ASM, CUDA `.cu`, PTX `.ptx` 코드 포함  
  
```  
├── less_slow.cpp           # 주 벤치마크 코드  
├── less_slow_amd64.S       # x86 어셈블리  
├── less_slow_aarch64.S     # ARM 어셈블리  
├── less_slow.cu            # CUDA C++  
├── less_slow_sm70.ptx      # PTX IR (Volta)  
├── less_slow_sm90a.ptx     # PTX IR (Hopper)  
```  
  
### 외부 라이브러리 사용  
  
- Google Benchmark: 성능 측정  
- Intel oneTBB: 병렬 STL 백엔드  
- Meta libunifex: 비동기 실행 모델  
- range-v3: `std::ranges` 대체  
- fmt: `std::format` 대체  
- StringZilla: `std::string` 대체  
- CTRE: `std::regex` 대체  
- nlohmann/json, yyjson: JSON 파서  
- Abseil: 고성능 컨테이너  
- cppcoro: 코루틴 구현  
- liburing: 리눅스 커널 우회 I/O  
- ASIO: 비동기 네트워킹  
- Nvidia CCCL, CUTLASS: GPU 알고리듬 및 행렬 연산  
  
### Google Benchmark 사용 팁 요약  
  
- `BENCHMARK()`로 벤치마크 등록, `->Args({x,y})`로 파라미터 전달  
- `DoNotOptimize()`, `ClobberMemory()`로 컴파일러 최적화 제어  
- `->Iterations(n)`, `->MinTime(n)`으로 반복 수 및 벤치 시간 제어  
- `->Complexity(...)`, `->SetComplexityN(n)`으로 시간 복잡도 지정  
- `state.PauseTiming()`, `ResumeTiming()`으로 타이밍 구간 직접 제어  
- `state.counters[...]`로 커스텀 카운터 등록 가능  
  
### 밈과 유머 요소  
  
- 교육 자료에 **기술 밈 이미지** 삽입으로 흥미 유발  
- 성능과 추상화의 대립, IEEE 754 부동소수점 등 유머러스하게 표현

## Comments



### Comment 37398

- Author: neo
- Created: 2025-04-21T09:14:53+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=43727743) 
- 40배 빠른 삼각법: std::sin 같은 표준 라이브러리 함수를 3줄의 코드로 가속화할 수 있음
  - 확장을 몇 개의 항으로 제한하여 `sin(x)`를 근사할 수 있음
  - 계산 비용은 줄어들지만 정확도도 감소함
  - 정확도 감소는 과소평가임. [-2, 2] 범위를 벗어난 입력에 대해 매우 부정확함
  - 단일 사인파 구간도 처리할 수 없으며 반복적인 특성도 다루지 못함. 쓸모없는 "최적화"임

- 마이크로컨트롤러에서의 경험 공유
  - 임베디드 시스템에서 작업 중이며, 힙은 약 256 KiB, 가장 큰 스택은 4 KiB임
  - 현대적인 C++를 주로 사용하지만 모든 트릭이 모든 상황에 적합하지 않음
  - CTRE는 스택 오버플로우를 피하는 한 괜찮음. HTTP 프록시 구성의 문자열을 검증하려고 시도했으나 스택 오버플로우로 인해 시스템이 충돌함
  - JSON을 내부적으로 거의 사용하지 않고 자체 BSON 라이브러리를 작성함. 메모리 할당이나 단편화를 걱정할 필요가 없음
  - newlib 대신 picolibc를 사용하고 C/C++ 표준 라이브러리 로케일 코드를 제거함. 프로그램 크기를 줄임

- Abseil의 선택에 대한 의견
  - 처음 등장했을 때 큰 이슈였지만, 이제는 약점을 개선한 여러 대안이 존재함
  - 최근 몇 년 동안 Abseil에 대한 불만이 증가함. Google에서 핵심 라이브러리 유지 관리자의 이탈이 있었음

- C++에서 성능을 위한 왜곡에 대한 비판
  - CTRE가 좋은 결과를 준다는 것에 놀람. 더 깊이 파고들 필요가 있음
  - OpenMP 및 TBB 스레드풀 벤치마크를 조사하고 Boost::ASIO 스레드풀을 추가할 수 있는지 확인하고 싶음

- FPGA와 GPU 코딩의 차이점 및 고급 합성, Verilog, VHDL에 대한 요청
  - 이 주제에 대한 우선 요청을 받고 싶음

- 비정규화된 부동소수점에 대한 새로운 정보
  - GPU에서 행렬을 곱할 때 가끔 궁금해함

- Google Benchmark 게시물에 대한 긍정적인 피드백
  - 성능 벤치마킹에 대한 집중이 좋음. 저장소가 잘 구성되어 있음

- "덜 느린 C, C++, 어셈블리 코드"에 대한 기대
  - C 코드도 포함될 줄 알았으나 .cpp와 .S만 있음
  - less_slow.cpp가 많은 C++ 특성을 사용함. "C"를 목록에서 제거하거나 수정이 필요함
