Skip to content

Commit 2638ec5

Browse files
committed
Implement Events::extend with Vec::extend
Problem: - Events::extend manually called Vec::push for each element of the provided iterator. - This can potentially be an expensive. Solution: - Use Vec::extend over a Vec::push for loop.
1 parent 06d26e5 commit 2638ec5

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

crates/bevy_ecs/src/event.rs

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -145,20 +145,7 @@ impl<T: Component> Events<T> {
145145
/// "Sends" an `event` by writing it to the current event buffer. [EventReader]s can then read
146146
/// the event.
147147
pub fn send(&mut self, event: T) {
148-
let event_id = EventId {
149-
id: self.event_count,
150-
_marker: PhantomData,
151-
};
152-
trace!("Events::send() -> {}", event_id);
153-
154-
let event_instance = EventInstance { event_id, event };
155-
156-
match self.state {
157-
BufferState::A => self.events_a.push(event_instance),
158-
BufferState::B => self.events_b.push(event_instance),
159-
}
160-
161-
self.event_count += 1;
148+
self.extend(std::iter::once(event));
162149
}
163150

164151
/// Gets a new [ManualEventReader]. This will include all events already in the event buffers.
@@ -231,13 +218,30 @@ impl<T: Component> Events<T> {
231218
})
232219
}
233220

221+
/// Writes each event in `events` to the current event buffer.
234222
pub fn extend<I>(&mut self, events: I)
235223
where
236224
I: Iterator<Item = T>,
237225
{
238-
for event in events {
239-
self.send(event);
226+
let mut event_count = self.event_count;
227+
let events = events.map(|event| {
228+
let event_id = EventId {
229+
id: event_count,
230+
_marker: PhantomData,
231+
};
232+
event_count += 1;
233+
EventInstance { event_id, event }
234+
});
235+
match self.state {
236+
BufferState::A => self.events_a.extend(events),
237+
BufferState::B => self.events_b.extend(events),
240238
}
239+
trace!(
240+
"Events::extend() -> [{}, {})",
241+
self.event_count,
242+
event_count
243+
);
244+
self.event_count = event_count;
241245
}
242246

243247
/// Iterates over events that happened since the last "update" call.

0 commit comments

Comments
 (0)