2014-12-23 1 views
0

매우 엄격한 시간 제한의 응용 프로그램이 있습니다. 때때로 우리는 폐기해야 할 병적 인 입력을받습니다. 병목 현상을 일으키는 하나의 루프가 있으며 많은 반복이 있습니다. Xe6 정도 정도. 약 30ms 이상 걸리는 것은 잘못된 입력이며, 나는 그것을 떨어 뜨릴 수 있음을 안다.최소 x 시간 후 루프를 종료하는 집중적 인 방법

시간을 확인하고 루프를 종료하는 성능 저하가 가장 적은 방법은 무엇입니까?

QueryHighPerformanceCounter()를 보았지만 1ms가 넘는 매우 높은 오버 헤드가 추가되었습니다. 게다가, 그것은 내가 필요로하는 것보다 더 정밀하다. 다양한 타이밍 요소가 성능에 미치는 영향에 대해서는 전혀 알지 못합니다.

어떤 조언이 필요합니까?

답변

1

아마 스레드에서 루프를 실행합니다. 두 개의 Event 객체를 설정합니다. 하나는 처리가 완료되었음을 알리는 신호이고, 다른 하나는 스레드가 종료되어야한다는 신호입니다. 이 스레드는 루프를 종료 할 때 첫 번째 스레드를 설정합니다. WaitForSingleObject (예를 들어)를 호출하여 주기적으로 두 번째를 확인합니다. 시간 초과가 0이면 WaitForSingleObject는 몇 밀리 초마다 한 번 수행 할 것으로 예상 할 수 있습니다. 1e6 반복과 30ms가 주어 졌을 때 30,000 번의 반복을 한번 해봅시다. 해당 이벤트가 설정되면 루프를 종료합니다.

첫 번째 이벤트에는 WaitForSingleObject를 수행하는 다른 스레드가 있습니다. WaitForSingleObject를 호출하면 30 밀리 초의 제한 시간을 지정합니다. WaitForSingleObject가 반환되면 반환 값을 확인합니다. 이벤트가 설정되어 리턴 된 경우 처리가 완료되며 계속 진행할 수 있습니다. 시간이 초과되면 두 번째 이벤트를 설정하고 스레드가 이벤트를 다음에 확인하면 처리를 중지하라는 신호가 표시되어 루프를 종료합니다.

분명히 가능한 유일한 방법은 아니지만 매우 간단한 오버 헤드가 있어야하는 매우 간단한 방법입니다. 루프에서 발생하는 유일한 부분은 WaitForSingleObject에 대한 zero-timeout 호출입니다.

비교적 최근의 CPU를 테스트 한 결과 각 호출에 약 0.2 마이크로 초가 걸릴 것으로 예상되므로 총 30 마이크로 초의 처리 시간이 추가됩니다. IOW, 처리 속도가 1 % 미만으로 느려지고 있습니다. 나는 처리 속도의 차이를 신뢰할 수있게 측정 할 수 있다는 것을 의심의 여지가 없다.

관련 문제