Какие существуют профиллировщики программ на rust?

Ребят, кто имеет опыт профилирования программ на rust? Никаких инструментов через гугл не нашел, могу только замеры времени через println! делать, что неудобно. Переписываю программу(числодробилку, нахожу все простые числа до n) с python на rust - в итоге в 1.5 раза медленнее, хотя рассчитывал раз в 10-50 быстрей.
Код на питон (4.7 с на коем компе):
# coding=utf-8
from time import time

def get_primes_below2(n):
    """ Returns  a list of primes < n """
    sieve = [True] * n
    q = int(n**0.5)+1
    for i in xrange(3, q, 2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
    result = [2] + [i for i in xrange(3,n,2) if sieve[i]]
    return result

t = time()
A = 10 ** 8
p = get_primes_below2(A)
print 'result = {}, time = {}'.format(1, time() - t)


Код на rust (10.3 с на моем компе):
extern crate time;

use std::num;
use time::now;

fn get_primes_below(n: uint) -> Vec<uint> {
    let mut sieve:Vec<bool> = Vec::from_fn(n, |_| {true});
    let stop = sieve.len();
    let hight_border =  ((n as f64).sqrt() + 1f64) as uint;
    println!("{}", hight_border);
    for i in range(3, hight_border).filter(|j| { j % 2 != 0 }) {
        //if i % 2 == 0 {continue;}
        if sieve[i] == true {
            let start = i * i;
            let step = 2 * i;
            let mut j = start;
            while j < stop  {
                sieve[j] = false;
                j += step;
            }
        }
    }

    let mut result:Vec<uint> = Vec::with_capacity(n);
    result.push(2);
    for i in range(3, n).filter(|j| { j % 2 != 0 }) {
        //if i % 2 == 0 {continue;}
        if sieve[i] == true {result.push(i)};
    }
    result
}

fn main() {
    let start_time = now();
    let a: uint = num::pow(10, 8);
    let primes = get_primes_below(a);
    let stop_time = now();
    println!("{}.{}", (stop_time.tm_sec - start_time.tm_sec), (stop_time.tm_nsec - start_time.tm_nsec) / 1000 / 1000);
}
  • Вопрос задан
  • 2738 просмотров
Пригласить эксперта
Ответы на вопрос 1
@obvn
Будет работать практически любой профилировщик для C.
На выходе же обычный бинарный код, и если он с отладочной информацией, то будет профилироваться чем угодно.
Если говорить конкретнее: будет работать perf, gprof, XCode Instruments (на OS X).
Еще есть вот такая заметка про инструменты разработчика Rust, можно найти много интересного и полезного.
По задаче генерации простых чисел, думаю лучше имлементировать трейт Iterator. Это позволит лениво получать последовательности из итератора, или сразу взять нужный по счету. Пример здесь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы