tgoop.com/random_rust_dev/202
Last Update:
Сегодняшний Rust Tip об очень полезной функции - 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% времени на клонирование и выделение памяти.
BY Random Rust Dev
Share with your friend now:
tgoop.com/random_rust_dev/202