Clone::clone_from.Когда у вас уже есть объект и нужно заменить его клоном другого значения - не спешите писать
a = b.clone().Вместо этого используйте:
a.clone_from(&b).Такой вызов позволяет переиспользовать существующее значение - особенно ресурсы вроде памяти.
Это особенно эффективно при клонировании
Box, Vec, String и прочих.И, конечно, это работает транзитивно.
Вложенный
Vec<T> будет клонировать T с помощью clone_from для существующих элементов.При использовании
#[derive(Clone)], компилятор автоматически вызывает clone_from для всех полей.Но если вы реализуете
Clone вручную - подумайте, не стоит ли также переопределить clone_from.Ведь реализация по умолчанию просто делает
*self = other.clone().Если ваш тип не
Copy, clone_from почти наверняка окажется дешевле.Аналогичная оптимизация есть и у трейта
ToOwned.Для типов вроде
str, Path или [T] используйте ToOwned::clone_into(&mut target) вместо target = value.to_owned().Такие небольшие улучшения могут сэкономить вам годзиллионы процессорных циклов.
И при профилировании вы будете реже видеть, как ваше приложение тратит 90% времени на клонирование и выделение памяти.