광고


InterlockedIncrement vs SRWLock vs CriticalSection 성능 비교 시스템



Windows Via C/C++에 보면 SRWLock 챕터에서 이들에 대한 성능 비교 테이블이 나와 있다.
비아에 의하면, 다음과 같은 성능 차이가 발생한다.

* 변수 하나를 1,000,000 번씩 증가 연산시킨다.

쓰레드가 4개일 때
  • InterlockedIncrement : 361 ms
  • SRWLock exclusive : 307 ms
  • CriticalSection : 768 ms
읭? 아무리 SRWLock이 빠르다 해도 InterlockedIncrement보다 빠르다고???
물론, 책에서 어떠한 테스트 환경에서 테스트 하였는지 설명이 누락되어 있기에, 자세한 건 알 수 없지만...
아무리 그렇다 해도 도저히 납득이 가지 않아 직접 재 보았다.

테스트 환경
  • CPU : i5-750 (@2.66GHz, 4 core, No HT)
  • RAM : 4 GB (1033)
  • OS : Windows7 Professional SP1
  • C++ : VisualStudio 2010 SP1
테스트 내용은 책에서 동일하게 쓰레드마다 1,000,000회 반복하여 변수에 증가 연산을 수행하고,
모든 쓰레드가 연산을 마칠 때까지의 시간을 측정하였다.
시간을 측정한 도구 역시 책과 동일한 QueryPerformanceCounter를 이용하였다.

역시나 결과는 책에서와 사뭇 다르다. (소수점 이하 표기 X)

쓰레드 2개 (thread 0.5 : core 1)
  • InterlockedIncrement : 27 ms
  • SRWLock exclusive : 47 ms
  • CriticalSection : 85 ms
  • Mutex : 3,629 ms
쓰레드 4개 (thread 1 : core 1)
  • InterlockedIncrement : 55 ms
  • SRWLock exclusive : 129 ms
  • CriticalSection : 145 ms
  • Mutex : 10,466 ms
쓰레드 8개 (thread 2 : core 1)
  • InterlockedIncrement : 111 ms
  • SRWLock exclusive : 269 ms
  • CriticalSection : 284 ms
  • Mutex : 22,576 ms
아무리 동기화 메써드가 가볍다 한들, 코드 블럭의 원자적 접근을 위한 메써드가
하나의 변수만을 위한 원자적 메써드보다 빠를 수가 있겠는가?

확실히 SRWLock이 CritialSection보다 빠르긴 한 것 같다.
SRWLock의 제약 조건이 두드러지지 않을 곳에서 가볍게 쓸만할 것 같다라는 생각도 든다.

Shared mode는 따로 측정해 보지 않았다.

마지막에 Mutex 테스트를 추가하였는데, 역시나 커널 오브젝트 동기화의 비용은 쩐다 ㅋ

덧글 : 그나저나 이글루스에서는 표 기능을 왜 지원하지 않지? 

핑백

  • 수까락의 프로그래밍 이야기 : Concurrency : critical_section, reader_writer_lock 2013-11-13 21:43:32 #

    ... 스는 아니었다.우선 본격적으로 내용을 까보기에 앞서, 혹시나 하는 마음에 성능 비교를 해 보았다.헐... 그런데 이것이... 결과가 의외였다. Interlocked vs SRWLock vs CriticalSection 성능 비교 에서 수행했던 테스트 환경과 내용 그대로,CRITICAL_SECTION을 이용한 전통적인 방법과 critical_section ... more

덧글

  • whiletrue 2012/11/29 00:56 # 답글

    기본 에디터에 표 기능 없어요?
    다른 방법으로 쓰실라면 html 코드 직접 입력하시거나
    Windows Live Writer 쓰세요.
    Live Writer 참고는 요기.
    http://whiletrue0222.com/lifelog/archives/55
  • SY Kim 2013/01/30 16:42 # 답글

    이글루스에서 표를 쓰면 버그가 심하던데... (고쳐졌을려나요?)

    전 2년 가까이 기다려도 버그 픽스가 안되길래 그냥 티스토리로 도망쳤습니다.
  • 2016/10/21 14:34 # 삭제 답글

    CPU I7-4790K RAM 16G, OS 와 컴파일러는 같구요.

    3개의 producer thread 가 상호경합을 하며 queue 에 집어넣고, 1개의 consumer thread 가 이걸 꺼내 확인하는 테스트였습니다. affinity 는 4개 thread 모두 다르게 설정했구요.

    Debug 모드에서 빌드했을 땐 Interlocked 가 약 1.5배 정도 빨랐는데, Release 모드로 빌드한 결과 확실히 SRWLock 이 Interlocked 보다 1.8배 정도 빠릅니다. 아마 Debug 모드와 Release 모드의 코드가 다르지 싶네요.

    심지어 SRWLock 을 사용한 구현은 3개의 producer 가 서로 다른 코어에서 exclusive lock을 통해 상호경합함에도 불구하고 Interlocked 보다 빠르더군요.
댓글 입력 영역