2012-04-08 40 views
12

Có ai xảy ra để biết liệu có sự khác biệt nào liên quan đến hiệu suất giữa hai phương pháp đọc tệp đầu vào bên dưới không? Cảm ơn.Máy quét vs InputStreamReader

1) Đọc một tập tin với Scanner và File

Scanner input = new Scanner(new File("foo.txt")); 

2) Đọc một tập tin với InputStreamReader và FileInputStream

InputStreamReader input = new InputStreamReader(new FileInputStream("foo.txt")); 
+1

Liên quan: http://stackoverflow.com/questions/2231369/scanner-vs-bufferedreader –

+0

Liên quan: [Máy ​​quét v. StreamTokenizer] (http://stackoverflow.com/a/2082174/230513). – trashgod

Trả lời

7

Điểm đầu tiên là không phải trong số các mẫu mã đó đọc một tệp. Điều này nghe có vẻ khó chịu hoặc không chính xác, nhưng đó là sự thật. Những gì họ thực sự làm là mở một tập tin để đọc. Và về những gì họ thực sự làm, có lẽ không phải là một sự khác biệt lớn trong hiệu quả tương ứng của họ.

Khi thực sự đọc tệp, cách tiếp cận tốt nhất để sử dụng sẽ tùy thuộc vào tệp chứa, dữ liệu phải có trong các thuật toán trong bộ nhớ, v.v. Điều này sẽ xác định xem nó có tốt hơn không sử dụng Scanner hoặc Reader thô, từ góc độ hiệu suất và quan trọng hơn là từ quan điểm làm cho mã của bạn đáng tin cậy và có thể bảo trì.

Cuối cùng, cơ hội là điều này sẽ không tạo sự khác biệt đáng kể đối với hiệu suất tổng thể của mã của bạn. Những gì tôi nói là bạn đang tối ưu hóa ứng dụng của bạn sớm. Bạn nên bỏ qua hiệu suất ngay bây giờ và chọn phiên bản sẽ làm cho phần còn lại của mã của bạn đơn giản hơn. Khi ứng dụng đang hoạt động, hãy cấu hình nó với một số dữ liệu đầu vào đại diện. Các hồ sơ sẽ cho bạn biết thời gian được dành đọc tập tin, trong điều kiện tuyệt đối, và tương đối so với phần còn lại của ứng dụng. Điều này sẽ cho bạn biết liệu đó có phải là có giá trị nỗ lực để cố gắng tối ưu hóa việc đọc tệp hay không.

Chỉ một chút lời khuyên về hiệu suất tôi muốn đưa ra là ký tự đó bằng cách đọc ký tự từ luồng đầu vào hoặc trình đọc chưa được lọc không hiệu quả. Nếu tệp cần được đọc theo cách đó, bạn nên thêm BufferedReader vào ngăn xếp.

2

Một sự khác biệt, và hiệu trưởng, tôi đoán, là với BufferedReader/InputStreamReader bạn có thể đọc toàn bộ ký tự của tài liệu theo ký tự, nếu bạn muốn. Với máy quét này là không thể. Nó có nghĩa là với InputStreamReader, bạn có thể kiểm soát nhiều hơn về nội dung của tài liệu. ;)

+2

Câu trả lời này không giải quyết hiệu suất, mặc dù, đó là những gì OP đã yêu cầu. –

+0

@AdamMihalcin Nếu quan điểm của bạn là câu trả lời nếu tôi không đồng ý thì tôi không đồng ý. Anh ấy muốn nghe về hiệu suất và cũng biết được sự khác biệt giữa hai điều mà cuối cùng sẽ chỉ mang lại lợi ích cho sự hiểu biết của anh ấy về sự khác biệt giữa hai điều đó. – Joop

3

Về hiệu suất, Máy quét chắc chắn là chậm hơn, ít nhất là từ trải nghiệm của tôi. Nó được thực hiện để phân tích cú pháp, không đọc khối dữ liệu khổng lồ. InputStreamReader, với bộ đệm đủ lớn, có thể thực hiện ngang bằng với BufferedReader, mà tôi nhớ nhanh hơn vài lần so với Máy quét để đọc từ danh sách từ điển. Here's a comparison between BufferedReader and InputStreamReader. Hãy nhớ rằng BufferedReader nhanh hơn vài lần so với Máy quét.

Các vấn đề liên quan