2009-03-09 31 views
14

Tôi hiện đang sử dụng trình định dạng nhị phân (Remoting) để tuần tự hóa và deserialize các đối tượng để gửi xung quanh LAN của tôi.Trình nối tiếp nhanh nhất và bộ giải mã với bộ nhớ thấp nhất trong C#?

Gần đây tôi đã nâng cấp từ 2.0 lên .NET 3.5. Có 3,5 giới thiệu bất kỳ loại mới để cải thiện hiệu suất serialization?

Tôi đã xem xét DataContractSerializer, nhưng điều này sẽ nối tiếp mọi thứ với quyền XML cơ bản ... mà phải tăng thêm dung lượng bộ nhớ.

Trình nối tiếp nhanh nhất để gửi các đối tượng qua mạng LAN của tôi là gì? Tôi không quan tâm về interop hoặc versioning…. Tôi cần tốc độ!

Tôi đang mở cho các lựa chọn thay thế nguồn mở của bên thứ ba.

+0

Dường như có hai câu hỏi ở đây ... Nối tiếp nhanh nhất là một, số còn lại là tuần tự hóa với dấu chân mem thấp nhất. –

+0

@Mauricio: Luôn luôn là vấn đề cân bằng. Bạn thường tìm kiếm tối ưu giữa hai phẩm chất, vì vậy bạn xem xét cả hai cùng một lúc. –

+0

có thể trùng lặp của [Cách nhanh nhất để tuần tự hóa và deserialize đối tượng .NET] (http://stackoverflow.com/questions/4143421/fastest-way-to-serialize-and-deserialize-net-object) – nawfal

Trả lời

8

Có vẻ như Protocol Buffers có thể là những gì bạn đang tìm kiếm.

Có ba triển khai .NET mà tôi biết: protobuf-net, protobuf-csharp-portProto#.

performance comparisons cho thấy rằng Bộ đệm giao thức hoạt động tốt hơn các trình nối tiếp tích hợp cả về kích thước và tốc độ tuần tự hóa/deserialization.

+6

Whats sự khác biệt giữa các ba triển khai .NET? –

+1

@StefanSteinegger Chúng là các triển khai khác nhau của protobuf, bởi các nhà phát triển khác nhau.Đối với tình hình hiện nay: proto # dường như đã biến mất, cả protobuf-net và protobuf-csharp-port đã được thực hiện bởi các nhà phát triển xuất sắc. Các liên kết chính xác là https://github.com/mgravell/protobuf-net và https://github.com/jskeet/protobuf-csharp-port. – atlaste

2

Trong số performance comparison được liên kết bởi @Luke, hãy lưu ý rằng DataContractJsonSerializer hoạt động rất tốt so với các trình nối tiếp MS khác.

Với tính phổ biến của JSON và sự dễ dàng mà bạn có thể sử dụng DataContractJsonSerializer, tôi không thấy nhiều lý do để sử dụng "bộ đệm giao thức". JSON sẽ dễ dàng hơn để gỡ lỗi khi nảy lên giữa các ngôn ngữ và nền tảng và nó sẽ nén đẹp mắt.

(Tôi yêu cách Google mất CS 101 khái niệm và trở nên nổi tiếng để thực hiện chúng. Trong C, chúng ta gọi là "đệm giao thức" "struct" s. Họ làm việc tuyệt vời.)

+0

C struct (hoặc C++ trong trường hợp của tôi) sẽ là tuyệt vời, nhưng .Net (theo yêu cầu của OP) và Java không tuần tự hóa dữ liệu của struct, chúng cũng tuần tự hóa các định nghĩa cấu trúc cho một điểm. Ngoài ra, bộ đệm giao thức cho phép thêm _ "trường mới vào định dạng thư của bạn mà không vi phạm tính tương thích ngược;" _ [xem Hướng dẫn dành cho nhà phát triển] (https://developers.google.com/protocol-buffers/docs/overview). – Trisped

5

Tôi có một số benchmarks for the leading .NET serializers sẵn dựa trên bộ dữ liệu Northwind.

@marcgravell protobuf-net nhị phân là triển khai nhanh nhất được đánh giá chuẩn là khoảng 7x nhanh hơn bộ nối tiếp nhanh nhất của Microsoft hiện có (XML DataContractSerializer) trong BCL.

của Microsoft JsonDataContractSerializer là khá chậm - qua 9x chậm mà protobuf-net và hơn 3.6x chậm hơn so với riêng tôi JsonSerializer.

+0

Còn thư viện của Simon Hewitt thì sao? Xem * [Tối ưu hóa tuần tự hóa trong .NET - phần 2] (http://www.codeproject.com/dotnet/OptimizingSerialization2.asp) * hoặc * [Làm thế nào để tuần tự hóa các đối tượng lớn trong .NET?] (Http: // stackoverflow. com/questions/709399/how-to-serialize-big-objects-in-net-outofmemory-exceptions/1290530 # 1290530) *. –

0

Như tôi đã minh họa trong this answer mã được tạo có thể là bộ nối tiếp nhanh nhất. Tuy nhiên nó đang ở giai đoạn đầu và vẫn thiếu một số tính năng mà các trình tuần tự khác cung cấp.

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