클라이언트 테스터는 전형적인 producer-consumer 구조로 되어 있다. Consumer가 producer보다 몇 배나 빠르도록 설계 되어 있어 producer가 consumer를 압도하는 시나리오는 상상해보지도 않았고, 당연히 그에 대한 처리도 하지 않았다. 그런데 어제 테스트를 하고 있는데 부하가 심해지면 producer가 consumer를 압도하면서 queue를 가득 채워 뻑나는 황당한 경우가 발생했다.
Multi-thread 구조에 문제가 있는건 아닌지, 코드에 오류는 없는지를 하나하나 확인하고 있는데 원인은 황당하게도 printf 에 있었다. Consumer가 자기 할 일을 하고 간단한 정보를 출력하는데 그 일을 하면서 출력을 동기화하고 그 과정이 producer의 속도를 따라가지 못하게 된 것이다. printf를 빼니 모든 문제가 사라졌다-_-;;
(사실 printf로 console에 출력하는 행위 자체가 많이 느리기 때문에 printf에서 사용하는 lock이 문제였는지 출력 자체가 문제였는지는 정확하지 않다. 프로파일링을 해봐야 정확하지만 해서 도움도 안되고 시간만 잡아먹을게 뻔한 짓을 하고 싶지는 않다)
그러고 보니 예전에는 printf를 사용해서 출력하면 동기화가 안되서 출력이 섞이곤 했는데 - 그렇다고 기억이 되는데 정확하진 않음 - 최근에는 본적이 없다. 모르고 있었는데, 좀 황당하네.
결론: printf는 원래 성능이 구린데다가, 동기화하는데 성능이 구리다.
환경: VS2008SP1, Vista64
