2016-01-07 2 views
3

В попытке изучить некоторые системные программы я собирался попытаться написать токенизер в ржавчине. Сразу же, хотя я обнаружил, что он очень медленный, итерации по строкам. Я собрал простой ориентир, чтобы показать, что я имею в виду.Как этот узел быстрее работает в этом тесте?

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

+6

Стандартный вопрос: компилируете ли вы с 'сборкой груза -реализацией' или' rustc -O', чтобы включить оптимизацию? –

+0

@ DK - ах! вы заметили ошибку n00b :) Да, теперь программа ржавчины примерно на 7 раз быстрее, чем программа узла - Спасибо :) – shane

ответ

4

Простой ответ, когда бенчмаркинг, не используйте target/debug/program но запустить cargo build --release первым. Это даст вам target/release/program для ваших тестов :)

Смежные вопросы