В попытке изучить некоторые системные программы я собирался попытаться написать токенизер в ржавчине. Сразу же, хотя я обнаружил, что он очень медленный, итерации по строкам. Я собрал простой ориентир, чтобы показать, что я имею в виду.Как этот узел быстрее работает в этом тесте?
src/bench.html
это HTML документ с приблизительно 3000 символов
узел:
var input = require('fs').readFileSync('src/bench.html', 'utf8');
var len = input.length;
for(var i = 0; i < 100; i+=1) run();
function run() {
var index = 0;
while (index < len) {
var c = input.charAt(index);
// noop
index++;
}
}
ржавчины:
use std::error::Error;
use std::fs::File;
use std::io::prelude::*;
use std::path::Path;
fn main() {
// Create a path to the desired file
let path = Path::new("src/bench.html");
let display = path.display();
// Open the path in read-only mode, returns `io::Result<File>`
let mut file = match File::open(&path) {
// The `description` method of `io::Error` returns a string that
// describes the error
Err(why) => panic!("couldn't open {}: {}", display,
Error::description(&why)),
Ok(file) => file,
};
// Read the file contents into a string, returns `io::Result<usize>`
let mut s = String::new();
match file.read_to_string(&mut s) {
Err(why) => panic!("couldn't read {}: {}", display,
Error::description(&why)),
Ok(_) => {
for x in 1..100 {
for token in s.chars() {
match token {
_ => {
// noop
}
}
}
}
println!("done!");
}
}
}
Может кто-нибудь объяснить, что я делаю неправильно в ржавчине Например, чтобы сделать его в 10 раз медленнее, чем одно и то же в узле?
Весь код можно найти здесь https://github.com/shakyShane/rust-vs-node
Стандартный вопрос: компилируете ли вы с 'сборкой груза -реализацией' или' rustc -O', чтобы включить оптимизацию? –
@ DK - ах! вы заметили ошибку n00b :) Да, теперь программа ржавчины примерно на 7 раз быстрее, чем программа узла - Спасибо :) – shane