Skip to content

Commit a42343d

Browse files
committed
Optimize Events::extend and impl std::iter::Extend (#2207)
The previous implementation of `Events::extend` iterated through each event and manually `sent` it via `Events:;send`. However, this could be a minor performance hit since calling `Vec::push` in a loop is not optimal. This refactors the code to use `Vec::extend`.
1 parent 29bc4e3 commit a42343d

File tree

1 file changed

+41
-10
lines changed

1 file changed

+41
-10
lines changed

crates/bevy_ecs/src/event.rs

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ impl<T: Component> Events<T> {
277277
id: self.event_count,
278278
_marker: PhantomData,
279279
};
280-
trace!("Events::send() -> {}", event_id);
280+
trace!("Events::send() -> id: {}", event_id);
281281

282282
let event_instance = EventInstance { event_id, event };
283283

@@ -361,15 +361,6 @@ impl<T: Component> Events<T> {
361361
}
362362
}
363363

364-
pub fn extend<I>(&mut self, events: I)
365-
where
366-
I: Iterator<Item = T>,
367-
{
368-
for event in events {
369-
self.send(event);
370-
}
371-
}
372-
373364
/// Iterates over events that happened since the last "update" call.
374365
/// WARNING: You probably don't want to use this call. In most cases you should use an
375366
/// `EventReader`. You should only use this if you know you only need to consume events
@@ -384,6 +375,35 @@ impl<T: Component> Events<T> {
384375
}
385376
}
386377

378+
impl<T> std::iter::Extend<T> for Events<T> {
379+
fn extend<I>(&mut self, iter: I)
380+
where
381+
I: IntoIterator<Item = T>,
382+
{
383+
let mut event_count = self.event_count;
384+
let events = iter.into_iter().map(|event| {
385+
let event_id = EventId {
386+
id: event_count,
387+
_marker: PhantomData,
388+
};
389+
event_count += 1;
390+
EventInstance { event_id, event }
391+
});
392+
393+
match self.state {
394+
State::A => self.events_a.extend(events),
395+
State::B => self.events_b.extend(events),
396+
}
397+
398+
trace!(
399+
"Events::extend() -> ids: ({}..{})",
400+
self.event_count,
401+
event_count
402+
);
403+
self.event_count = event_count;
404+
}
405+
}
406+
387407
#[cfg(test)]
388408
mod tests {
389409
use super::*;
@@ -526,4 +546,15 @@ mod tests {
526546
assert!(events.drain().eq(vec![E(0), E(1)].into_iter()));
527547
});
528548
}
549+
550+
#[test]
551+
fn test_events_extend_impl() {
552+
let mut events = Events::<TestEvent>::default();
553+
let mut reader = events.get_reader();
554+
555+
events.extend(vec![TestEvent { i: 0 }, TestEvent { i: 1 }]);
556+
assert!(reader
557+
.iter(&events)
558+
.eq([TestEvent { i: 0 }, TestEvent { i: 1 }].iter()));
559+
}
529560
}

0 commit comments

Comments
 (0)