我已經完成了將我用 JavaScript 制作的應用程式轉換為 Rust 以提高性能。我正在學習編程,而應用程式所做的只是計算出一個范圍內任何數字的乘法持久性。它將所有數字相乘以形成一個新數字,然后重復直到數字小于 10。
我的問題是,我用 JavaScript 撰寫的程式比用 Rust 撰寫的程式快 5 倍以上。我一定是在某處將字串轉換為整數時做錯了,我什至嘗試將 i128 交換為 i64,但這并沒有什么不同。
如果我運行“cargo run --release”,它仍然會更慢!
請有人可以通過我的代碼來確定是否有任何部分導致問題?先感謝您 :)
fn multiplicative_persistence(mut user_input: i128) -> i128 {
let mut steps: i128 = 0;
let mut numbers: Vec<i128> = Vec::new();
while user_input > 10 {
let string_number: String = user_input.to_string();
let digits: Vec<&str> = string_number.split("").collect();
let mut sum: i128 = 1;
let digits_count = digits.len();
for number in 1..digits_count - 1 {
sum *= digits[number].parse::<i128>().unwrap();
}
numbers.push(sum);
steps = 1;
user_input = sum;
}
return steps;
}
fn main() {
// let _user_input: i128 = 277777788888899;
let mut highest_steps_count: i128 = 0;
let mut highest_steps_number: i128 = 0;
let start: i128 = 77551000000;
let finish: i128 = 1000000000000000;
for number in start..=finish {
// println!("{}: {}", number, multiplicative_persistence(number));
if multiplicative_persistence(number) > highest_steps_count {
highest_steps_count = multiplicative_persistence(number);
highest_steps_number = number;
}
if number % 1000000 == 0 {
println!("Upto {} so far: {}", number, highest_steps_number);
}
}
println!("Highest step count: {} at {}", highest_steps_number, highest_steps_count);
}
我確實計劃在函式中使用 numbers 變數,但我還沒有學到足夠的知識來知道如何正確地將它作為關聯陣列回傳。
uj5u.com熱心網友回復:
也許問題在于將數字轉換為字串,然后再將其重新轉換為數字并不是那么快,而且是可以避免的。您不需要此中間步驟:
fn step(mut x: i128) -> i128 {
let mut result = 1;
while x > 0 {
result *= x % 10;
x /= 10;
}
result
}
fn multiplicative_persistence(mut user_input: i128) -> i128 {
let mut steps = 0;
while user_input > 10 {
user_input = step(user_input);
steps = 1;
}
steps
}
編輯只是出于好奇,我想知道瓶頸是否真的是由于字串轉換或其他代碼浪費了。這是一個不呼叫的示例,不.split("")重新分配該中間向量,并且僅分配一次,而不是在每個步驟中分配字串。
#![feature(fmt_internals)]
use std::fmt::{Formatter, Display};
fn multiplicative_persistence(user_input: i128) -> i128 {
let mut steps = 0;
let mut digits = user_input.to_string();
while user_input > 10 {
let product = digits
.chars()
.map(|x| x.to_digit(10).unwrap())
.fold(1, |acc, i| acc*i);
digits.clear();
let mut formatter = Formatter::new(&mut digits);
Display::fmt(&product, &mut formatter).unwrap();
steps = 1;
}
steps
}
我基本上已經行內了將要執行的字串轉換,.to_string()以便重新使用已經分配的緩沖區,而不是每次迭代都重新分配一個。你可以在操場上試一試。請注意,您需要一個夜間編譯器,因為它利用了不穩定的特性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/459269.html
