Skip to content

Performance

This document covers performance optimization tips for Apq.ChangeBubbling.

Batch Operations

csharp
// Not recommended: triggers 1000 events
for (int i = 0; i < 1000; i++)
{
    users.Add(new User());
}

// Recommended: triggers 1 event
users.BeginBatch();
for (int i = 0; i < 1000; i++)
{
    users.Add(new User());
}
users.EndBatch();

Silent Population

csharp
// Use for initialization
users.PopulateSilently(initialData);

Event Filtering

csharp
// Filter at source
ChangeMessenger.RegisterFilter("filter",
    new PropertyNameFilter("Name", "Email"));

Throttling

csharp
ChangeMessenger.AsThrottledObservable(TimeSpan.FromMilliseconds(100))
    .Subscribe(c => HandleChange(c));

Memory Optimization

csharp
// Enable weak references
ChangeMessenger.EnableWeakMessenger = true;

// Dispose subscriptions when done
subscription.Dispose();

Concurrency

csharp
// Use concurrent nodes for multi-threading
var logs = new ConcurrentBagBubblingNode<LogEntry>("Logs");

// Use thread pool scheduler
ChangeMessenger.RegisterThreadPool("background");

Performance Monitoring

csharp
ChangeMessenger.EnableMetrics = true;

var metrics = ChangeMessenger.GetPerformanceMetrics();
Console.WriteLine($"Total: {metrics.TotalEvents}");
Console.WriteLine($"Rate: {metrics.EventsPerSecond}/s");

Benchmark Results

OperationOps/Second
Single Add~100,000
Batch Add (1000)~1,000,000
Silent Populate (1000)~5,000,000
Event Publish~500,000
Rx Subscribe~200,000

Released under the MIT License