2017-11-14 2 views
0

작동중인 스트림이 MemoryStream 인 경우 비동기 메서드 (CopyToAsync, ReadAsync 등 ...)를 사용하지 않는 것이 좋습니다.memorystreams에서 비동기 I/O를 사용해야합니까?

this SO question에 대한 Stephen Clearly의 의견은 많은 동시 요청을 처리 할 수 ​​있어야하는 서버 응용 프로그램에서 내가 사용하고있는 접근 방식에 의문을 제기하게했습니다.

해당 응용 프로그램에서는 모든 스레드가 낭비되지 않도록 비동기 적으로 수행됩니다. 그러나 CopyToAsync f.i. MemoryStream에서 비동기 적으로 작동하는 것은 아닙니다. 서버 애플리케이션에서도 MemoryStream에서 비동기 연산을 사용하는 것이 어떤 이점이 있는지 궁금합니다.

+2

'MemoryStream'은 메모리가 할당되고 복사되는 것을 의미하기 때문에 일반적으로 불필요하게 성능을 발휘할 때 냄새가납니다. 그러나, 코드가 이미 비동기 상태 인 경우 사용하는 특별한 경우가 필요하지 않습니다. if (스트림이 MemoryStream입니다.) 체크가 실제 성능을 향상시키지 않을 것입니다. 메모리 스트림을 모두 제거하는 것과는 대조적입니다. 물론 YMMV와 프로파일 링을 통해 더 많은 정보를 얻을 수 있습니다. –

+0

이미 프로파일을 작성했으며 async를 사용하면 직선 동기화를 사용하는 것보다 속도가 느립니다. 처음에 비동기식을 사용하면 애플리케이션이 과중한 부하에서 더 잘 수행 될 수 있다고 생각했지만 memorystream에 대한 비동기식은 실제로 비동기식이 아니므로 불필요한 오버 헤드를 추가하는 것이 전부입니다. 그래서 Mem-Stream에서 CopyToAsync를 사용하는 것이 무엇인지 궁금합니다. –

+0

메모리 스트림에서 메모리 스트림으로 복사하면 얻을 수있는 것이 없습니다. 쓰기 만 사용하고 완료된 [작업] (https://referencesource.microsoft.com/#mscorlib/system/io/memorystream.cs,1a4dcb744a23ba6f)을 반환합니다. –

답변

4

글쎄, MemoryStream 구현을 확인하면 추가 스레드를 사용하지 않고 ReadAsync (및 WriteAsync)이 실제로 동기화된다는 것을 알 수 있습니다. 약간의 오버 헤드가 있지만 아주 작아서 무시할 수 있어야합니다.

CopyToAsync은 다른 야수입니다. 다른 비동기 메서드는 하나의 스레드에서만 작동하지만 CopyToAsync은 두 개에서 작동합니다. 소스 MemoryStream이 비동기의 이점을 얻지는 못하지만 대상 스레드는 비동기식입니다. 물론 두 스트림이 모두 메모리 스트림이라면 아무런 이점도 얻지 못할 것입니다.

일반적으로 질문에 대답하기 위해 MemoryStream은 다른 스트림 구현과의 일관성을 위해서만 비동기 메소드를 가지고 있습니다. 그러나이를 사용할 때 성능이 크게 저하되지는 않습니다.

P. MemoryStream으로 좋은 성능이 필요한 경우 재 할당을 피하고 기본 버퍼를 다시 사용하는 것이 좋습니다. 그러나 비동기와 관련없는 주제는 다릅니다.

관련 문제