예를 들어 코테 문제에 숫자 하나를 입력받아 뒤집은 숫자와 더한 값을 출력하는 문제(즉 12345를 입력했으면 12345+54321=66666를 출력하는 문제가 나왔다고 하면
나같은 떌깜은 이렇게 풀 거임.
long long a; cin>>>a; string b = to_string(a); reverse(b.begin(), b.end()); long long c = stol(b); cout<<a + c;반면 수학을 잘 아는 참 프로그래머들은
long long a; cin>>a; long long c = 0; do { c *= 10; c += b % 10; b /= 10; } while (b > 0); long long d = a + c;이렇게 풀 것인데, 나는 두 코드의 실행 시간이 어떤지 궁금해져 비교를 하는 프로그램을 짜봄
#include <iostream> #include <string> #include <ctime> #include <algorithm> #include <chrono> #include <thread> using namespace std; int main(int, char **) { using std::chrono::duration; using std::chrono::duration_cast; using std::chrono::high_resolution_clock; using std::chrono::milliseconds; using namespace chrono; double sum = 0; for (int i = 0; i < 100000; i++) { system_clock::time_point t1 = high_resolution_clock::now(); long long a = 123456789; string b = to_string(a); reverse(b.begin(), b.end()); long long c = stol(b); long long d = a + c; using namespace std::chrono_literals; system_clock::time_point t2 = high_resolution_clock::now(); duration<double, std::milli> ms_double = t2 - t1; cout<<d<<endl; sum += ms_double.count(); } cout.setf(ios::fixed); cout << sum/100000 << endl; double sum2 = 0; for (int i = 0; i < 100000; i++) { system_clock::time_point t1 = high_resolution_clock::now(); long long a = 123456789; auto b = a; long long c = 0; do { c *= 10; c += b % 10; b /= 10; } while (b > 0); long long d = a + c; using namespace std::chrono_literals; system_clock::time_point t2 = high_resolution_clock::now(); cout<<d<<endl; duration<double, std::milli> ms_double = t2 - t1; sum2 += ms_double.count(); } cout.setf(ios::fixed); cout << sum2/100000<<endl; cout<<sum/sum2<<endl; }실행 결과:
(위가 땔감식, 밑이 수학식)
결론:수학식 알고리즘이 2배정도 빠르다.
코드 넣을 때 포맷팅 좀
어 왜 깨지지
해결
수학식이 월급 더 많이 나가는걸 고려해야한다
ㅇㅇ
이터레이션 50 -> 100만으로 하고 실행ㄱ
ㄳ 수정함
현대 CPU 무쉬 하냐
?
저런거 최적화 키면 dead code elimination으로 날아감
컴파일러가 알아서 최적화 하는 거임?
수정함
여전히 최적화로 날라감. 사이드 이펙트라도 만들어봐
ㄴ수정함
횟수는 작은데 시간해상도가 커서 제대로 측정못하나본데
수정함
사실 코테아니면 별 상관 없을듯ㅇㅇ....
그런가
코테도 솔직히 어지간히 병신같이 짜지 않는 이상 굳이 필요없고 PS 수준까지는 가야 이런거 따질만한듯
나도 저거 비슷한 문제 땔감식으로 풀음ㅋㅋㅋ
반복 조건이랑 몸체를 do { c += b % 10; c *= 10; } while (b/=10); 로 두는게 더 빠르지 않을까?
근데 몸체는 그대로 냅둬도 될듯, 조건 수식만 최적화한게 이거라