ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [사소한 테스트] 곱셉/나머지 연산의 로직을 덧셈/뺄셈으로 변경한다면?
    개발/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;
    }

    댓글

Designed by Tistory.