可能的原因分析
- 过多的观察者注册:大量模块注册为观察者,导致每次通知时需要遍历并调用大量的回调函数,增加了处理时间和内存开销。
- 复杂的通知逻辑:观察者收到通知后执行的逻辑过于复杂,导致单个通知处理时间过长,从而产生延迟。
- 内存泄漏:如果观察者对象在不再使用时没有正确从主题中注销,会导致这些对象无法被垃圾回收,造成内存消耗过大。
优化方案及代码示例
- 批量处理通知
- 原理:将多个通知合并为一次处理,减少通知的频率,提高处理效率。
- 代码示例:
class Subject
def initialize
@observers = []
@notifications = []
end
def attach(observer)
@observers << observer
end
def detach(observer)
@observers.delete(observer)
end
def notify
@observers.each do |observer|
observer.update(@notifications)
end
@notifications.clear
end
def add_notification(notification)
@notifications << notification
end
end
class Observer
def update(notifications)
puts "Received notifications: #{notifications.inspect}"
end
end
# 使用示例
subject = Subject.new
observer1 = Observer.new
observer2 = Observer.new
subject.attach(observer1)
subject.attach(observer2)
subject.add_notification("Notification 1")
subject.add_notification("Notification 2")
subject.notify
- 异步通知
- 原理:使用线程或异步任务队列将通知处理逻辑放到后台执行,避免阻塞主线程,提高响应速度。
- 代码示例(使用
Thread
):
class Subject
def initialize
@observers = []
end
def attach(observer)
@observers << observer
end
def detach(observer)
@observers.delete(observer)
end
def notify
Thread.new do
@observers.each do |observer|
observer.update("New notification")
end
end
end
end
class Observer
def update(notification)
puts "Received notification: #{notification}"
end
end
# 使用示例
subject = Subject.new
observer1 = Observer.new
observer2 = Observer.new
subject.attach(observer1)
subject.attach(observer2)
subject.notify
- 优化观察者逻辑
- 原理:简化观察者收到通知后执行的逻辑,避免复杂的计算或I/O操作在通知处理时进行。
- 代码示例:
class Subject
def initialize
@observers = []
end
def attach(observer)
@observers << observer
end
def detach(observer)
@observers.delete(observer)
end
def notify
@observers.each do |observer|
observer.update
end
end
end
class SimpleObserver
def update
# 只做简单操作,例如记录日志
puts "Received notification, logging..."
end
end
# 使用示例
subject = Subject.new
observer1 = SimpleObserver.new
observer2 = SimpleObserver.new
subject.attach(observer1)
subject.attach(observer2)
subject.notify