-
[사소한 테스트] 곱셉/나머지 연산의 로직을 덧셈/뺄셈으로 변경한다면?개발/C·C++ 2024. 8. 28. 17:43
사소해서 코드까지 올릴 문제는 아니다. 문자열로 표현된 숫자를 가지고 더하기 연산을 할 때, 올림값(carry) 관련해서 곱셉과 나머지 연산을 이용하면 간결한 코드를 작성할 수 있다. 이를 조건문, 덧셈, 뺄셈으로도 표현할 수 있는데 코드가 조금 길어진다. 문득 이 두 로직 간의 성능 차이가 얼마일지 궁금해서 100만 번 테스트를 했다.
나노초 단위로 표현된 차이이며 백만 번 수행했을 때 속도 차이는 0.1초였다. CPU 기준에선 꽤 큰 차이라고 할 수 있다. 라이브 중인 서비스라면 결코 무시할 수 없는 수치라고 생각한다. 어느 정도 예상했겠지만 Test_2() 함수가 조건문, 덧셈, 뺄셈으로 구현된 함수다. 곱셈, 나눗셈, 나머지 연산이 느리다는 건 알고 있었지만 테스트로 직접 눈으로 확인해보니까 조금 신기하네.
추가적으로 조건문을 통해서 한 번만 수행되는 연산, 조건문 없이 그냥 두 번 실행되는 연산에 대해서도 테스트를 수행했다. 환경에 따라 달라질 수 있지만, 내 경우에서는 조건문이 없는 쪽이 유의미하게 빨랐다. 0.06초 이상 차이가 난다. 로직을 작성할 때 트레이드 오프를 고려해봐야 되는 결과라 생각한다. 몇 분만 지나도 초 단위 차이다. 코드는 다음과 같다.
#include <iostream> #include <string> #include <vector> #include <chrono> void Add_1(string str1, string str2) { const size_t size = max(str1.size(), str2.size()); if (size != str1.size()) str1.resize(size); else str2.resize(size); } void Add_2(string str1, string str2) { const size_t size = max(str1.size(), str2.size()); str1.resize(size); str2.resize(size); } int main() { auto start = chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) Add_1("123123123123", "123123123"); auto end = chrono::high_resolution_clock::now(); auto duration = chrono::duration_cast<chrono::nanoseconds>(end - start); cout << "Add_1() 100만 번 수행 시간: " << duration.count() << endl; cout << "===========================================" << endl; start = chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) Add_2("123123123123", "123123123"); end = chrono::high_resolution_clock::now(); duration = chrono::duration_cast<chrono::nanoseconds>(end - start); cout << "Add_2() 100만 번 수행 시간: " << duration.count() << endl; }
'개발 > C·C++' 카테고리의 다른 글
std::transform()에 대한 간단한 고찰 (2) 2024.09.04 포인터의 타입 추론 (0) 2024.08.31 [윈도우 시스템 프로그래밍] 압축 파일 복사하기 (0) 2024.08.27 std::remove_if, std::erase (0) 2024.08.17 전화번호 무작위 생성 (0) 2024.08.03