2009-04-23 26 views
8

Kích thước bộ đệm tối ưu để sử dụng với luồng từ HttpWebResponse.GetResponseStream() là gì?Kích thước bộ đệm tối ưu cho luồng phản hồi của HttpWebResponse

Ví dụ trực tuyến thay đổi từ 256b đến 5Kb. Đưa cái gì? Tôi đoán kích thước bộ đệm có thể là tình huống. Nếu vậy thì các tình huống sử dụng loại kích thước bộ đệm là gì?

Cảm ơn.

Trả lời

6

Thực sự, nó không quan trọng lắm. Chắc chắn, nếu bạn sử dụng bộ đệm thực sự nhỏ, bạn có thể phải thực hiện thêm một vài cuộc gọi qua các lớp để nhận các byte (mặc dù luồng có khả năng làm ít nhất một số bộ đệm - Tôi không biết nó là gì mặc định là). Và chắc chắn, nếu bạn sử dụng bộ đệm thực sự lớn, bạn sẽ lãng phí một số bộ nhớ và giới thiệu một số phân mảnh. Vì bạn rõ ràng đang làm IO ở đây, bất cứ lúc nào bạn đạt được bằng cách tinh chỉnh bộ đệm sẽ bị chi phối bởi thời gian IO.

Như một quy tắc chung, tôi đi với một sức mạnh của hai giữa 2048 (2k) và 8192 (8k). Chỉ cần chắc chắn rằng bạn biết những gì bạn đang làm nếu bạn đi với một bộ đệm bằng hoặc lớn hơn 85.000 byte (sau đó nó là "large object" and subject to different GC rules).

Thực tế, quan trọng hơn kích thước bộ đệm là bạn giữ được bao lâu. Đối với các đối tượng bên ngoài đống đối tượng lớn, GC rất tốt trong việc xử lý các đối tượng rất ngắn (bộ sưu tập Gen 0 nhanh) hoặc các đối tượng rất dài (Gen 2). Các đối tượng sống đủ lâu để đến được Gen 1 hoặc 2 trước khi được giải thoát thì tương đối tốn kém hơn, và thường đáng giá hơn thời gian của bạn đáng lo ngại về mức độ lớn của bộ đệm.

Lưu ý cuối cùng: nếu bạn cho rằng mình gặp vấn đề về hiệu suất do kích thước bộ đệm bạn đang sử dụng, hãy kiểm tra . Đó là không, nhưng những người hiểu biết, có thể bạn có một hợp lưu kỳ lạ của phiên bản hệ điều hành, phần cứng mạng, và phát hành trình điều khiển có một số vấn đề lẻ với bộ đệm có kích thước nhất định.

+1

Bài đăng rất hữu ích, nhưng tôi nghĩ bạn có nghĩa là 8192? Sức mạnh của 2 -> 2048, 4096, 8192 (8k). – Derrick

3

Kinh nghiệm giai thoại của tôi là nó thực sự phụ thuộc vào những gì bạn đang làm, nhưng thường bất cứ thứ gì trong phạm vi 1024-4096 byte (1-4KB hay còn gọi là sức mạnh của hai) sẽ cho tôi hiệu suất tương đương (với 4KB là "tốt nhất" số tôi đã nhìn thấy).

Về cơ bản, bạn muốn có bộ đệm đủ lớn để bạn không cần đọc dữ liệu từ luồng, nhưng không lớn đến mức bạn giảm bớt số lần trả về. Nếu bộ đệm của bạn quá lớn (~ MBs), thì bạn sẽ tăng bộ nhớ cache của bạn nhớ, điều này thực sự có thể bắt đầu giảm hiệu suất của bạn. Tất nhiên, điều này thay đổi rất nhiều dựa trên thực tế H/W (tốc độ bus, kích thước bộ nhớ cache, vv), nhưng tôi có vẻ như trường hợp bộ đệm 4MB chậm hơn bộ đệm 4KB (cả hai trường hợp đều có thời gian hoạt động lâu dài, vì vậy GC không một vấn đề).

Như Jonathan lưu ý, hãy kiểm tra triển khai hiện tại của bạn trước khi thử tối ưu hóa sớm.

2

Thực ra tôi đang gặp sự cố khi kích thước bộ đệm quá nhỏ. Tôi đã thử nghiệm nó và XÁC MINH rằng kích thước bộ đệm không nên được đặt là giá trị nhỏ. Trong ví dụ của tôi tôi đặt nó đến 2048 và tải xuống đang trở thành VERY SLOW so với firefox một (firefox một là không có phân đoạn tải xuống quá, giống như tôi).

Và sau khi tôi đặt nó thành kích thước lớn 409600, tải xuống là NHẢI FASTER, tôi nghĩ rằng cuộc gọi bổ sung sẽ mất phí hoặc làm cho việc tải xuống chậm. Có lẽ ở cấp độ mạng, bộ đệm vượt quá kích thước bộ đệm của bạn, vì vậy TCP cần yêu cầu gửi lại gói đó một lần nữa? (Chỉ cần một đoán, như tôi không biết làm thế nào TCP hoạt động), tuy nhiên kích thước bộ đệm nhỏ chắc chắn là làm chậm tải xuống của tôi. Tôi đã thử nghiệm nó bằng cách chạy bằng cách sử dụng tải xuống mặc định firefox (mà không thêm vào và segmenetation) và sử dụng lớp học của tôi, cả hai đều quá khác nhau.

Bây giờ nó nhanh hơn nhiều, mỗi lần lặp lại, nó sẽ đọc khoảng 200000 byte (200Kb) vì kết nối ở đây nhanh, nhưng sau khi chạy hai luồng, nó sẽ chậm hơn nhiều, có thể cần chia sẻ một chủ đề khác.

+0

Tương tự xảy ra với tôi trong trường hợp tải lên một tệp lớn (2Gb): Bộ đệm lớn hơn làm cho nó nhanh hơn nhiều –

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