2012-05-06 2 views
2

잠재적으로 데이터의 무한 "스트림"(바이트, 문자 등)에서 작동하는 함수를 작성할 때 입/출력을 위해 문자열/배열 대 스트림을 사용하기로 결정할 때 고려해야 할 몇 가지 설계 고려 사항은 무엇입니까? ?C# 배열 대 스트림

항상 스트림을 사용하는 함수를 작성한 다음 스트림 래퍼 (예 : StringReader/Writer)를 사용하여 배열이나 문자열과 같은 "간단한 데이터"를 반환하여 처리하지 않아도되는 오버로드 메서드를 만드는 데 큰 성능 영향이 있습니까? 다른 고려 사항들?

배열에서 작동하는 함수가 훨씬 더 편리하다고 생각할 수 있습니다. 왜냐하면 결과 배열을 "반환"할 수 있고 일반적으로 처분에 대해 걱정할 필요가 없기 때문입니다. 나는 스트림 운영자가 무한한 데이터 소스에서 작동 할 수 있다고 생각한다. 아마 메모리 효율적인 것일 것이다.

+0

(LinkedList 이외의) 사용하는 모든 종류의 콜렉션 또는 스트림 클래스는 궁극적으로 코어의 바이트 []로 귀결됩니다. 기계가 지원하는 근본적이고 유일한 수집 유형. 분명히 고통스러운 임피던스 불일치 일 수 있습니다. 도구 상자에있는 것을 사용하고 이미이를 수행하는 것이 좋습니다. –

답변

1

알 수없는 크기의 이진 데이터로 작업하는 경우 항상 스트림을 사용하십시오. 예를 들어 전체 파일을 바이트 배열로 읽는 것은 일반적으로 피할 수 있다면 좋지 않은 생각입니다. 암호화 및 압축과 같은 이진 데이터로 작동하는 .Net의 대부분의 기능은 스트림을 입/출력으로 사용하도록 제작되었습니다.

1

데이터 스트림을 처리하는 함수를 작성하는 경우 IEnumerable<T>으로 전달하는 것이 좋습니다. 그런 다음 생성자 함수에서 IEnumerable<T>으로 스트림을 반환 할 수 있습니다. 즉, return yield을 사용하여 각 결과를 한 번에 반환합니다.

필요에 따라 평가가 이루어지기 때문에 성능이 점차 향상 될 수 있습니다.

+0

메모리의 객체 컬렉션 (즉, 참조 유형)에서 작동하는 함수에 대해이 작업을 수행하지만,이 접근법을 사용하여 프리미티브에서 작동하는 아이디어가 마음에 들지는 않습니다. 예를 들어 스트림이 특정 패턴을 생략하도록 설계된 경우 한 번에 많은 값을 반환 할 수 없기 때문에 필요한 루프 이상을 구현해야합니다. –