Может ли программа Rust быть написана идиоматически, чтобы она выполнялась быстрее?
Да.Чтобы создать вектор с несколькими элементами, используйте макрос vec![]
:
let mut work: Vec<f64> = vec![0.0, 1.0];
for _x in 1..100000000 {
work.swap(0, 1);
}
Так этот код быстрее?Да.Посмотрите , какая сборка генерируется :
example::main:
mov eax, 99999999
.LBB0_1:
add eax, -11
jne .LBB0_1
ret
На моем ПК это работает примерно в 30 раз быстрее, чем ваш исходный код.
Почему сборка все еще содержит этот цикл, который ничего не делает?Почему компилятор не может увидеть, что два push
совпадают с vec![0.0, 1.0]
?Оба очень хорошие вопросы, и оба, вероятно, указывают на недостаток в LLVM или компиляторе Rust.
Однако, к сожалению, не так много полезной информации можно получить из вашего микро-теста.Бенчмаркинг сложный, как очень сложный.Есть так много подводных камней, на которые влюбляются даже профессионалы.В вашем случае, эталонный тест имеет недостатки в нескольких отношениях.Для начала, вы никогда не наблюдаете содержимое вектора позже (он никогда не используется).Вот почему хороший компилятор может удалить весь код, который даже касается вектора (как это делал выше компилятор Rust).Так что это не хорошо.
Кроме того, это не похоже ни на один реальный критичный к производительности код.Даже если вектор будет наблюдаться позже, обмен нечетным числом раз будет равен одному обмену.Поэтому, если вы не хотите узнать, сможет ли оптимизатор понять это правило обмена, к сожалению, ваш тест не очень полезен.