2016-12-06 11 views
8

Tôi đang làm việc trên ứng dụng Haskell, chạy trong trình duyệt được biên dịch với GHCJS, giao tiếp với máy chủ, cũng được viết bằng Haskell, qua websockets. Cả hai chương trình đều có cùng định nghĩa kiểu dữ liệu Haskell và tôi “chỉ” phải chọn định dạng tuần tự hóa.Định dạng dây hiệu quả nhất cho mã GHCJS trên websockets

Hiện tại, để đơn giản, chương trình chạy trên ReadShow, hoạt động nhưng rõ ràng không lý tưởng.

Mặt khác, không rõ liệu các ứng cử viên bình thường cho serialization nhanh, chẳng hạn như thư viện cereal, hoạt động trên ByteStrings thực sự sẽ hiệu quả trong GHCJS. Hơn nữa, API của GHCJS có vẻ khó để cho phép ByteStrings tương tác với loại nhị phân Blob mà các ràng buộc JavaScript vào Websockets cung cấp.

Tạo mã chung (sử dụng GHC.Generics) sẽ rất tuyệt.

Có ai đã giải quyết vấn đề này trước đây không? Thậm chí có thể chuẩn hóa các biến thể tuần tự hóa khác nhau trên GHCJS?

+1

Tôi vừa sử dụng ngũ cốc. Tôi đã sử dụng reflex-frp trên máy khách, cung cấp một cách cơ bản để xem một websocket như một sự kiện đầu vào của ByteString và một sự kiện đầu ra của ByteString. Tôi đã không thực sự có bất kỳ nhu cầu hiệu suất cụ thể mặc dù, và tôi đã không chuẩn; Tôi đã có những mảnh nằm xung quanh đã (đã sử dụng ngũ cốc anyway), và nó chỉ làm việc, vì vậy đó là tất cả tôi cần thiết. – Ben

+0

Đoán tôi nên xem xét 'reflex-frp' cho các ràng buộc websockets của chúng. –

+1

Tôi nhớ lại mặc dù tôi đã sử dụng 'https: // github.com/reflex-frp/reflex-platform' chứ không phải là hackage, và tôi đã có một số thất vọng cho đến khi tôi tìm ra rằng các công cụ websocket bao gồm trong đó là đáng kể khác với những gì đã được phát hành trên hackage vào thời điểm đó (một vài tháng trước). – Ben

Trả lời

1

Chúng tôi đang tìm kiếm thư viện serializer/deserializer nhanh trong Haskell để lưu trữ dữ liệu trong bộ nhớ cache reddis năm ngoái và cuối cùng chúng tôi đã sử dụng ProtoBuf! Đó là một phần bởi vì chúng tôi đã có ProtoBuf thực hiện của tất cả các đối tượng mà chúng tôi muốn serialize, nhưng hiệu suất cũng tốt hơn nhiều so với ngũ cốc/nhị phân. Vào thời điểm đó, store không tồn tại.

Kích thước và tốc độ tuần tự hóa/deserialization rất nhiều phụ thuộc vào dữ liệu của bạn. Ví dụ, nếu bạn có rất nhiều smallish (nói trong khoảng 1 đến 100) số 64 bit, protobuf (vì mã hóa base 128 variant) hoặc thậm chí JSON có thể hiệu quả hơn ngũ cốc hoặc nhị phân (tôi đoán sử dụng kích thước cố định cho số bất kể giá trị của chúng).

Ngoài ra còn có Typed-Wire cho phép bạn thực hiện tuần tự hóa trên một vài ngôn ngữ, nhưng tôi nghĩ rằng nó sử dụng JSON làm triển khai cơ bản.

tôi không có kinh nghiệm với GHCJS, nhưng tôi khuyên bạn nên thử trước store trước tiên. Chỉ cần đảm bảo máy khách và máy chủ không có sự không tương thích nhỏ/lớn về endianness.

+0

Các cá thể 'Generic' có nguồn gốc tự động của thư viện' store' có phải là Endian-safe không? –

+0

Theo như tôi nhớ, 'store' giả định rằng cả bộ mã hóa và bộ giải mã đều có cùng endian (vì lợi ích của hiệu năng). Hầu hết các thư viện mã hóa khác không đưa ra giả định đó. Việc bạn có sử dụng cài đặt chung hay không không quan trọng vì các cá thể cho các kiểu cơ bản thường được thực hiện theo cách thủ công. – Hapal

+0

Nhân tiện, nếu bạn đang tìm kiếm hiệu suất ở phía JS, bạn cũng có thể hưởng lợi từ việc thực hiện JSON gốc. Tôi không chắc chắn làm thế nào bạn có thể sử dụng một bộ giải mã JSON gốc chứ không phải là một cái gì đó như Aeson trong GHCJS, nhưng nó phải có thể làm được. – Hapal

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