這是分別在 Rust 和 Node.js 中生成素數的兩個基本代碼片段。我正在生成 100000 個素數。
銹
use std::time::Instant;
fn main(){
let start = Instant::now();
generate_primes(100000);
let elapsed = start.elapsed();
// println!("{:?}", generate_primes(10));
println!("Time taken: {}ms", elapsed.as_millis());
}
pub fn generate_primes(n: i32) -> Vec<i32> {
let mut numbers:Vec<i32> = vec![0; 0];
let mut iter:i32 = 2;
let mut generated:i32 = 0;
while generated < n {
if is_prime(iter) {
numbers.push(iter);
generated = 1;
}
iter = 1;
}
numbers
}
fn is_prime(n: i32) -> bool {
let limit = (n as f32).sqrt() as i32;
for i in 2..=limit {
if n % i == 0 {
return false;
}
}
true
}
Rust 代碼執行所需的時間: 3274ms
編輯:運行后cargo run --release:370ms
節點.js
const t0 = Date.now();
const primes = generatePrimes(100000);
const t1 = Date.now();
console.log(`Time taken: ${t1 - t0}ms`);
function generatePrimes(total) {
let primes = [];
let iter = 2;
let generated = 0;
while (generated < total) {
if (isPrime(iter)) {
primes.push(iter);
generated ;
}
iter ;
}
return primes;
}
function isPrime(num) {
for (let i = 2; i * i <= num; i ) {
if (num % i === 0) {
return false;
}
}
return true;
}
執行 Javascript 所需的時間: 333ms
我是 Rust 的新手(以及一般的型別語言),所以一定有一些我錯過了一些優化。知道如何改進 Rust 的時間會很有趣(即使使用cargo run --release,它也比 Node.js 慢)。
uj5u.com熱心網友回復:
在 JS 中,所有數字都是浮點數,因此對浮點數執行除法/取模。
然而,在當前的處理器中,整數除法/模比浮點運算要慢得多(請參閱此處)。
在您的 Rust 程式中,模數自然是在整數上計算的。當人為地切換到浮點時,我得到了實質性的改進(310ms --> 152ms)。
fn fmod(
x: f64,
y: f64,
) -> f64 {
x - (x / y).floor() * y
}
fn is_prime(n: i32) -> bool {
let limit = (n as f32).sqrt() as i32;
for i in 2..=limit {
if fmod(n as f64, i as f64) == 0.0 {
return false;
}
}
true
}
更進一步,sqrt()如果我們比較方塊,我們可以保存操作(順便說一下,你在你的 JS 代碼中這樣做了)。(152ms --> 144ms)
fn is_prime(n: i32) -> bool {
for i in 2.. {
if i * i > n {
break;
}
if fmod(n as f64, i as f64) == 0.0 {
return false;
}
}
true
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/368088.html
