반응형
알고리즘 문제를 푸는데 시간초과가 계속 발생했다. 정답 코드를 검색해서 비교해봤을때 내 코드와 다른 부분은 출력부분 뿐이었다. 나는 개행을 std::end
를 사용했다.
xfor (int i = 0; i < N; i++)
//cout << s[i].name << endl;
cout << s[i].name << "\n";
이 부분을 \n
으로 바꾸니 시간초과 문제를 해결할 수 있었다. for loop를 10만번 반복했을 경우 endl
을 사용할 땐 411ms가 걸렸고, \n
을 썼을 땐 53ms가 걸렸다. 약 8배 오래 걸렸다. 왜 이런 차이가 발생했을까?
두 가지 모두 개행을 삽입하느 방법이다. 차이점은 endl
의 경우 호출 시 출력 버퍼를 flush 하게 된다. 즉 출력 버퍼에 남아있는 데이터를 모두 비우는 동작을 한다.
x
using namespace std;
int main() {
for (char i='A'; i <= 'Z'; i++)
{
cout << i << endl;
//cout << i << "\n";
}
return 0;
}
위와 같이 각 알파벳을 출력하는 코드를 작성했다. 여기서 endl
을 사용할 경우 26번의 flush가 일어난다. 하지만 \n
을 사용하면 버퍼에 26글자를 채운 다음 마지막에 flush가 일어나 출력한다.
호출이 적은 경우에는 상관 없겠지만 반복이 많아질 수록 endl
을 사용할 경우의 성능을 떨어진다.
ref
https://www.educative.io/edpresso/what-is-the-difference-between-endl-and-n-in-cpp
반응형