2011-01-15 2 views
2

Java에서 I/O 작업을 수행 할 때 컴퓨팅 자원 측면에서 일반적으로 ObjectInputStream과 같은 객체 데이터 스트림을 사용하는 것이 더 효율적입니까 아니면 DataInputStream과 같은 원시 데이터 스트림을 사용하는 것이 더 효율적입니까?자바에서 객체 데이터 스트림이나 원시 데이터 스트림을 사용하는 것이 더 효율적입니까?

개체 데이터 스트림을 사용하는 것이 더 효율적이라면 개체 생성과 관련된 오버 헤드 (최소한있을 수 있음)를 고려할 때 개체 데이터 스트림이 훨씬 더 효율적입니까?

답변

2

ObjectInputStream을 사용하는 것이 더 간단합니다. DataInputStream을 사용하기 전에 충분히 빠르지 않을지 확인합니다. DataInputStream은 NIO/ByteBuffer를 사용하는 것만 큼 효율적이지 않지만 상대적으로 작은 개선을 위해 노력이 증가합니다.

3

실제로 스트림에있는 데이터의 종류에 따라 객체 또는 데이터 InputStream을 선택합니다. Java Object의 경우 Object 스트림을 사용하고, 그렇지 않으면 DataInputStream (또는 기타 적절한 경우)을 사용합니다.

그래서 스트림에 어떤 종류의 데이터가 있습니까?

+0

나는 선택할 권리가있다. 나는 새로운 클래스를 만들고 데이터를 객체에 넣을 수있다. 아니면 원시 데이터로 전송할 수있다. 좀 더 효율적인지 알아 내려고 노력 중입니다. – ubiquibacon

+0

그런 다음 벤치 마크를 작성하고 파악하십시오. 효율성은 여기서 볼 수있는 최후의 것입니다. 더 중요한 요소는 다른 언어가이 시스템과 상호 작용하는 데 필요한 것과 같은 것입니다. 항상 Java 만 될 것인가 아니면 .NET이나 Perl 또는 X와 연결해야합니까? 그게 당신이하는 선택에 큰 영향을 줄 테니까요. Java 만 사용한다면 OO 접근법을 추천하고 OOS를 사용하십시오. –

+0

ByteBuffer 또는 ObjectOutput/InputStream (또는 버스트)입니다. 게다가 마이크로 벤치 마크를 올바르게 작성하는 방법을 알지 못한다면 마이크로 벤치 마크는 Java에서 가장 힘든 간단한 작업 중 하나입니다. – bestsss

2

개체 직렬화/desirialization은 자바에있는 더 무거운 것 중 하나입니다. 따라서 이것이 프로그램의 성능에 중요한 부분이라면 객체 직렬화를 피하는 것이 도움이 될 수 있습니다. 많은 경우 병목 현상이 다른 곳에서 발생하지만 조기 최적화를 수행하게 될 수도 있습니다. 그래서이 IMHO가 병목 현상을 일으킬 것이라는 것을 모르는 경우 ObjectInputStream을 사용하고 나중에 최적화하십시오.

+2

나중에 다른 방법으로 전환해야 할 경우에 대비하여 직렬화/개체 전송 비즈니스를 나머지 코드와 구분하는 것이 좋습니다. – biziclop

4

사용자 정의 직렬화로 공간/대역폭 및 CPU 시간을 절약 할 수 있습니다.

Google의 Protocol Buffers을 살펴볼 것을 제안합니다. 매우 효율적이며 휴대용 직렬화 라이브러리입니다.

1

왜 당신이 원하는 것을 작성하지 마십시오 주위에 몇 가지 테스트를 넣어 그것이 작동 알 수 있도록. 그런 다음 문제가 발생하면 구현을 번거롭고 번거롭지 않게 빠르게 대체 할 수 있습니다. 그것이 문제가되지 않는다는 것이 밝혀지면, 대부분의 것들이 다음과 같이 밝혀지면 ... 불필요한 것에 시간을 할애하지 않고 조기에 최적화하지 않았을 것입니다.

XstreamIs 매우 편리하게 이런 종류의 일을하고, 매우 사용하기 쉽습니다.

아키텍처가 불편하지 않은 경우이 비트를 최적화 할 필요가 없습니다.

관련 문제