kemin1910   1년 전

1번 방식은 제가 고친 코드입니다. 처음으로 제출한 방식은 2번 방식인데 아무래도 배열 용량에 따른 경고메시지가 나타나길래 거슬려서 고쳤습니다. 그런데 1번 방식이 아무리 봐도 더 깔끔하고 최적화 된 모습인 거 같은데 1번 방식은 416ms, 2번 방식은 4ms로 거의 100배의 시간 차이가 나타났습니다. 그로 인해 체점 시간도 오래 걸렸습니다. 이 문제에 대한 원인이 뭘까요?

seawon0808   1년 전

출력을 한번에 하는 것이 더 빨라서 그렇습니다.

kemin1910   1년 전

그렇다면 2번 방식이 코드는 길지만 더 좋은 방식이라고 볼 수 있는 건가요? 배열로 인해 용량 문제가 일어남에도 1번 방식을 이용해서는 안되는 걸까요?

seawon0808   1년 전

kemin님의 제출 기록을 보면 용량 문제가 생기지는 않는 것 같으므로 시간이 빠른 것이 중요하다면 2번 방식의 코드를 사용하는 것이 좋습니다.

kemin1910   1년 전

제출하는 것에 있어서 문제가 있진 않지만 컴파일러 내부적으로 '함수에서 '80020'바이트의 스택을 사용하는데 이 크기가 /analyze:stacksize '16384'을(를) 초과합니다. 일부 데이터를 힙으로 이동하십시오.' 라는 경고메시지가 나타났었습니다. 그래서 고쳤던 건데 이 정도의 속도 차이가 있으면 2번 방식을 이용해야 될 것 같네요.

zenith82114   1년 전

cin과 cout은 C언어에서의 scanf, printf 입출력과 달리

스트림, 즉 버퍼 형식으로 되어 있어 지속적인 내부 동기화를 수행합니다.

따라서 cin과 cout이 빈번하게 번갈아서 실행되면

몰아서 입력받고 몰아서 출력하는 것보다 느려집니다.

ios::sync_with_stdio(false);나 cin.tie(NULL); 라는 문장을 보신 적이 있다면,

바로 이 동기화를 해제하겠다는 의미입니다.


kemin1910   1년 전

이렇게 고쳐서 작성하니 속도가 정말 빨라졌습니다. 그러나 아직 저 코드의 의미는 알지만 동기화 해제에 따른 사용이 불가능한 상황, 사례를 제대로 알지 못하다보니 아무렇게나 사용하는 데에 있어서 살짝 망설임이 있네요.

seawon0808   1년 전

동기화를 해제시키신 다음에는 printf나 scanf를 사용하시면 안됩니다.

댓글을 작성하려면 로그인해야 합니다.