struct Vec {
data: [f32; 3],
}
impl Vec {
fn dot(&self, other: &Vec) -> f32 {
..
}
// vs
fn dot(self, other: Vec) -> f32 {
..
}
}
В настоящее время я пишу векторную математическую библиотеку, и мне интересно, следует ли мне брать или копировать свои типы векторов.Должен ли я брать или копировать свои небольшие типы данных?
В настоящий момент я реализую Copy
для Vec
, что делает API немного приятнее, потому что вам не нужно писать &
все время.
Но для этого требуются гораздо более сложные ограничения, потому что теперь все мои ограничения также должны удовлетворять Copy
.
Какая из них потенциально дает лучшую производительность и почему?
Какой из них потенциально дает лучшую эргономичность и почему?
Edit:
Я создал небольшой microbenchmark
test bref_f32 ... bench: 2,736,055 ns/iter (+/- 364,885)
test bref_f64 ... bench: 4,872,076 ns/iter (+/- 436,928)
test copy_f32 ... bench: 2,708,568 ns/iter (+/- 31,162)
test copy_f64 ... bench: 4,890,014 ns/iter (+/- 553,050)
Кажется, что нет никакой разницы между ref
и copy
для этого примера с точки зрения производительности.
Copy
, похоже, обеспечивает лучшую эргономику для пользователей библиотеки.
Вы действительно уверены, что хотите спросить о «идиоматическом», а не «производительности» или «упрощении границ»? Потому что идиомы очень * субъективны *, и я боюсь, что обе альтернативы могут быть рекомендованы, и нет однозначного объективного ответа ... в этом случае ваш вопрос будет заправлен для закрытия (в первую очередь основанный на мнении). –
@ MatthieuM. Я предположил, что есть некоторые направляющие строки, для которых должен выглядеть похожий код Rust, я перефразировал вопрос и добавил пример. –