Tăng Statechart so với máy Meta State


142

Rõ ràng boost chứa hai thư viện riêng cho các máy trạng thái : StatechartMeta State Machine (MSM). Các khẩu hiệu cho mô tả rất giống nhau:

  • Boost.Statechart - Các máy trạng thái hữu hạn phức tạp tùy ý có thể được thực hiện theo mã C ++ dễ đọc và có thể bảo trì.
  • Meta State Machine - Một thư viện hiệu năng rất cao dành cho các máy trạng thái hữu hạn UML2 biểu cảm.

Bạn có biết đâu là điểm khác biệt chính và những cân nhắc trong việc lựa chọn giữa hai là gì?


4
Hehe, một trường hợp khác rất nhiều quan tâm nhưng không ai biết câu trả lời ... :)
j_random_hacker

8
: D Câu hỏi này là đỉnh cao của kinh nghiệm SO của tôi! Nhận câu trả lời từ cả hai nhà phát triển ... liệu có thể tốt hơn không?! Rất cám ơn tới Barshe và Andreas.
FireAp4

Câu hỏi tuyệt vời và bạn quản lý để có được câu trả lời của hai nhà phát triển cạnh tranh!
Offifyo

3
Statechart làm cho bạn đưa chức năng vào các hàm tạo và hàm hủy. Đó là một kiểu chống, đặc biệt là với các bộ phá hủy.
Lev

2
Trong Statechart, các hành động thoát có thể được đặt trong một trình xử lý exit () riêng được gọi trước khi hủy. Tôi nghĩ rằng điều khoản này giảm nhẹ vấn đề chính với mô hình chống mà Lev đề cập.
Tim phi hành đoàn

Câu trả lời:


116

Vì dường như có nhiều sự quan tâm, xin vui lòng cho phép tôi đưa ra ý kiến ​​(rõ ràng là thiên vị), do đó nên được thực hiện với một hạt muối:

  • MSM nhanh hơn nhiều
  • MSM không yêu cầu RTTI hoặc bất cứ thứ gì ảo
  • MSM có hỗ trợ UML2 đầy đủ hơn (ví dụ: chuyển tiếp nội bộ, các vùng trực giao tuân thủ UML)
  • MSM cung cấp một ngôn ngữ mô tả (thực tế là một số). Ví dụ: bằng cách sử dụng giao diện người dùng eUML, quá trình chuyển đổi có thể được mô tả là Nguồn + Sự kiện [Guard] / Action == Target
  • MSM sẽ làm cho trình biên dịch của bạn bị ảnh hưởng đối với các máy trạng thái lớn hơn, vì vậy bạn sẽ cần một trình biên dịch khá gần đây (g ++> = 4.x, VC> = 9)

Bạn có thể tạo cho mình một ý kiến ​​tốt hơn bằng cách tìm kiếm các bình luận được đăng trong quá trình đánh giá MSM. Chủ đề này đã được thảo luận nhiều trong danh sách nhà phát triển.


2
Cảm ơn rât nhiều. Thật vui khi nghe ý kiến ​​của chính nhà phát triển! Bây giờ chúng tôi chỉ cần phản hồi của Andreas Huber :)
FireAp4

16
Lựa chọn nhỏ nit: Trong chế độ phát hành, việc sử dụng C ++ RTTI (Dynamic_cast, typeid) là tùy chọn hoàn toàn với Boost.Statechart.

111

Như Barshe đã đề cập, một trong những khác biệt chính giữa hai thư viện là hiệu năng thời gian chạy. Trong khi MSM có thể cung cấp tốt nhất bạn có thể đến đây, Statechart có ý thức giao dịch bộ nhớ và chu kỳ bộ xử lý theo hướng khả năng mở rộng tốt hơn.

Với Boost.Statechart, bạn có thể trải bố cục (nghĩa là trạng thái, chuyển tiếp) của máy trạng thái của bạn qua nhiều đơn vị dịch (tệp cpp) theo cách bạn không thể với MSM. Điều này cho phép bạn thực hiện các FSM lớn có thể duy trì nhiều hơn và biên dịch nhanh hơn nhiều so với MSM.

Việc chi phí hiệu năng của Statechart so với MSM có thực sự có ý nghĩa đối với ứng dụng của bạn hay không thường rất dễ trả lời khi bạn tự hỏi ứng dụng của bạn sẽ phải xử lý bao nhiêu sự kiện mỗi giây.

Giả sử một FSM phức tạp vừa phải được triển khai với Boost.Statechart, đây là một vài số ballpark:

  • Hầu hết các phần cứng PC hiện tại sẽ dễ dàng đối phó với> 100'000 sự kiện mỗi giây
  • Ngay cả phần cứng rất hạn chế tài nguyên sẽ có thể xử lý vài trăm sự kiện mỗi giây.

Về tải CPU, nếu số lượng sự kiện cần xử lý thấp hơn nhiều so với những con số này, thì Boost.Statechart so với MSM gần như chắc chắn sẽ không đáng chú ý. Nếu số lượng cao hơn nhiều, bạn chắc chắn sẽ tốt hơn với MSM.

Thông tin chi tiết hơn về sự đánh đổi hiệu suất / khả năng mở rộng có thể được tìm thấy ở đây: http://www.boost.org/doc/libs/1_45_0/libs/statechart/doc/performance.html


9
Xin chào Andreas, về sự lan rộng của bố cục, đã có một số cải tiến. Bây giờ bạn có thể biên dịch tiểu liên trên các lõi khác nhau. Nó không hoàn hảo nhưng là một cải tiến đáng chú ý. Xem svn.boost.org/svn/boost/trunk/libs/msm/doc/HTML/iêu
Henry

11

Trong khi mã hóa triển khai PPP của riêng tôi, tôi đã sử dụng Statechart vì ba lý do: 1) Statechart đơn giản hơn và có tài liệu rõ ràng hơn; 2) Tôi thực sự không thích UML :)

Các tài liệu Boost cho biết MSM nhanh hơn ít nhất 20 lần, nhưng biên dịch khá chậm đối với FSM lớn.


7
Mặc dù tôi đồng ý rằng phần lớn UML là hoàng đế quần áo mới, biểu đồ trạng thái là thứ thực sự có giá trị trong UML.
Jon Trauntvein

4
Chắc chắn, nhưng tôi đã học statecharts từ toán học rời rạc, không phải kỹ thuật phần mềm. Điều này để lại dấu ấn :)
rực sáng

4

Cách đây một thời gian, tôi đã bắt đầu với Statechart và chuyển sang MSM vì nó dễ sử dụng hơn khi kết hợp với asio từ một luồng duy nhất. Tôi đã không quản lý được lưới Statechart và các khả năng đa luồng của nó với việc sử dụng asio của tôi - đó có thể là một số người mới hiểu về Statechart về phía tôi. Tôi thấy rằng MSM dễ sử dụng hơn vì nó không giải quyết vấn đề đa luồng.


1
Hầu hết các loại statechart cũng không giải quyết luồng. Liên quan đến đa luồng, bạn sẽ có thể sử dụng boost :: statechart :: state_machine giống như đối tác MSM. boost :: statechart :: asynyncous_state_machine và các loại liên quan là một phần tùy chọn nghiêm ngặt của thư viện statechart.

2

Trả lời cho cuộc thảo luận muộn của Tim (cũng là một trong những ý kiến ​​rất sớm từ Lev).

Là một trong những người tranh luận về việc tách lối ra khỏi các hàm hủy trong statechart (đối số dựa trên trường hợp sử dụng thực tế, về tương tác với thế giới thực, tức là I / O) khi nó được gửi tới Boost, tôi đồng ý rằng có thể có vấn đề trong việc thoát ra logic trong các hàm hủy. David Abrahams không có gì ngạc nhiên khi đưa ra những lập luận thuyết phục liên quan đến an toàn ngoại lệ. Vì những lý do đó, Statechart không yêu cầu bạn đưa logic vào các hàm hủy - nhưng nó cho phép bạn - với lời khuyên thông thường.

Logic chỉ nên chạy như một phần của quá trình chuyển đổi ra khỏi trạng thái (không phá hủy toàn bộ đối tượng statechart) có thể (và nếu có cả việc dọn dẹp tài nguyên để làm) được tách thành một hành động thoát () riêng biệt.

Đối với trạng thái "mỏng" không có trạng thái hoạt động (tài nguyên), chỉ cần thực hiện các hành động nhập / thoát, bạn có thể thực hiện các hành động đó trong ctor và d'tor và đảm bảo rằng hàm tạo và hàm hủy không ném. Không có lý do gì để họ - không có trạng thái thực hiện RAII trên - không có gì xấu khi xử lý lỗi ở những nơi này đưa ra các sự kiện thích hợp. Bạn vẫn có thể cần xem xét liệu bạn có muốn các hành động thoát làm thay đổi trạng thái bên ngoài để chạy khi phá hủy máy trạng thái hay không ... và đưa chúng vào hành động thoát nếu bạn không muốn chúng xảy ra trong trường hợp này ...

Mô hình Statechart kích hoạt như là khởi tạo một đối tượng, vì vậy nếu hàm tạo của bạn có công việc thực sự / kích hoạt / khởi tạo và nếu nó có thể thất bại thì trạng thái không thể được nhập vào Statechart hỗ trợ bằng cách cung cấp cho bạn khả năng ánh xạ ngoại lệ tới biến cố. Điều này được xử lý theo cách xây dựng hệ thống phân cấp trạng thái đang tìm kiếm trạng thái bên ngoài xử lý sự kiện ngoại lệ, tương tự như cách ngăn xếp sẽ không có kết quả cho mô hình gọi dựa trên ngăn xếp cuộc gọi.

Đây là tất cả tài liệu tốt - tôi khuyên bạn nên đọc tài liệu và thử nó. Tôi khuyên bạn nên sử dụng các hàm hủy để dọn sạch "tài nguyên phần mềm" và các hành động thoát để thực hiện "các hành động thoát trong thế giới thực".

Điều đáng chú ý là sự lan truyền ngoại lệ là một vấn đề trong tất cả các môi trường hướng sự kiện, không chỉ statecharts. Tốt nhất là lý do và bao gồm các lỗi / lỗi trong thiết kế statechart của bạn và nếu và chỉ khi bạn không thể xử lý chúng theo cách khác để ánh xạ ngoại lệ. Ít nhất điều đó làm việc cho tôi - ymmmv ....


Cảm ơn bạn, tôi thấy rằng tất cả các mối quan tâm của tôi đã được giải quyết đầy đủ trong phần "Xử lý ngoại lệ" trong hướng dẫn Boost :: statechart. Trong trường hợp đó, tôi nghĩ rằng nhận xét (gây hiểu lầm) của Lev có thể được giải quyết đơn giản bằng cách chỉ vào phần "thoát hai giai đoạn" của hướng dẫn đó. Tôi sẽ xem xét xóa câu trả lời của tôi, ngoại trừ câu trả lời của bạn thêm thông tin có giá trị vào chủ đề này.
Tim phi hành đoàn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.