Improving MVVM performance using low pass filter

כשיש לנו בעייה ב-UI, הנטייה הראשונית היא לבדוק את ביצועי WPF והרכיבים שבחרנו להשתמש.

אפשרות אחרת היא עומס מידע המוצג שלא לצורך. במערכת המעבירה כמויות מידע בקצב מהיר, לא תמיד יש צורך לעדכן את התצוגה על פי קצב ההגעה.

בפוסט How to improve WPF performance in the View model שנכתב ע”י קובי מורד, הוא מתאר שיטה בה ניתן להקטין את כמות המידע המוצג באמצעות שימוש בפילטר פשוט ב-View Model.

Push the Turbo button

לאחרונה נתקלתי בתשתית Open Source להעברת מידע בשם ZeroMQ .חלקכם אולי מכירים אותה אבל אני מניח שרובכם לא, אם אתם נמנים עם החלק השני של האנשים אז הפוסט הזה מיועד לכם.

ZeroMQ נכתבה ב-C תחת רשיון LGPL Open Source אולם נכתבו לה Wrappers עבור שפות רבות כגון C++, C#, F#, Java, Node.js, Objective-C, Perl, PHP, Python, Ruby ועוד.

ממבט ראשון היא נראית כמו ספריה המכילה יכולות תקשורת אבל בעצם משמשת כתשתית אסינכרונית להעברת מידע בין Threads ו-Process באמצעות שימוש ב-Queues. היא מאפשרת לכם להעביר הודעות עד גודל 1GBבמגוון שכבות תקשורת כגון In-Process, TCP, Multicast. ניתן לחבר socket בין N ל-N משתמשים באמצעות שימוש ב- Pub-Sub, fanout, task distribution ו-Requst-Reply. חשוב להדגיש שהתשתית מהירה מאוד ואסינכרונית מה שמאפשר ליצור אפליקציות שניתן לבצע להן Scale up בכמעט אפס עבודה.

שילוב של API אינטואיטיבי, יעילות, דינמיות וביצועים מדהימים הופכים את התשתית למאוד אטרקטיבית למי שמעוניין להעביר מידע בקצבים גבוהים ביותר עם זמני תגובה מהירים.

Publisher – Subscriber

מתחשק לכם לעבוד בתצורת Publisher-Subscriber? אין בעיה, בדוגמא הבאה תראו כמה זה פשוט.

בשיטת העבודה של Publisher-Subscriber, יש לנו יצרן ומספר לקוחות שאמורים לקבל את המידע. כמתואר בדיאגרמה הבאה:

Publisher-Subscriber

קודם כל נגדיר את ה-Publisher:

// Create the context which manage all sockets. Usually a single context for entire application
Context context = new ZMQ.Context();
// Create a socket of type publisher
Socket socket = context.Socket(SocketType.PUB);

// Bind to tcp with specified port
socket.Bind("tcp://*:5555");

// Just send the message you want.
socket.Send("Demo Hello World", Encoding.Unicode);

המילה הראשונה בהודעה שנשלחה היא בעצם ה-Topic של ההודעה שעל פיה מבצע ה-Subscriber רישום.

הגדרת ה-Subscriber :

// Again, create a context to hold the sockets
Context context = new ZMQ.Context();
// Create a socket of type subscriber
Socket socket = context.Socket(SocketType.SUB);

// Register the messages you are interested in
socket.Subscribe("Demo", Encoding.Unicode);

// Connect the producer
socket.Connect("tcp://localhost:5555");

// Wait for incoming messages
while (true)
{
var message = socket.Recv(Encoding.Unicode);
Console.WriteLine(message);
}

 

כמובן שישנם עוד שיטות שניתן להשתמש עם ZeroMQ :

Request-Response

שרת ולקוח המבצעים פעולת תישאול. לקוח פונה לשרת ומקבל ממנו תשובה

Req-Rep

Ventilator

בשיטה הזו, יש לנו Ventilator שמחלק את העבודה  בין workers שונים המסוגלים לבצע את העבודה במקביל. בסיום התהליך, ה-Workers שולחים את התוצרים ל-Sink.

Ventilator

דוגמאות קוד והסברים מעמיקים יותר ניתן למצוא באתר ZeroMQ.

Wrapper ל-#C ניתן למצוא כאן https://github.com/zeromq/clrzmq או באמצעות NuGet ע”י הוספת Package בשם clrzmq.

Prologue

וואו, עשיתי את זה.
אחרי שנים של פחד במה, החלטתי לעשות מעשה ולהכנס לעולם הבלוגים.
כמובן שהנושאים יהיו קשורים לתוכנה בכלל ו-DotNet  בפרט. בכל זאת, זה גוזל מעל חמישים אחוז מהיום שלי.
אבל אני מבטיח שאשתדל לכתוב גם על דברים שאני מקווה ויעניינו גם אנשים שאינם שייכים לעולם התוכנה.
תחזיקו לי אצבעות, מקווה שתיהנו :).