Как стать автором
Обновить
7
0

Game Developer по образованию. Пописываю на Rust-е

Отправить сообщение

В крейте bytemuck есть функция cast_mut. Если без крейта хотите, то через касты указателей в unsafe-е.

Hidden text
use indextree::*;
use rand::Rng;

struct Foo {
    _p: [u8; 256],
}

fn main() {
    let mut linked_list = std::collections::LinkedList::new();
    let mut arena = Arena::new();

    let query = (0..1_000_000).map(|_| rand::thread_rng().gen_range(0..1_000usize)).collect::<Vec<_>>();

    for _ in 0..1_000_000 {
        linked_list.push_back(Foo { _p: [0; 256] });
    }

    let mut last_node = arena.new_node(Foo { _p: [0; 256] });
    let first_node = last_node;
    for _ in 0..(1_000_000 - 1) {
        let node = arena.new_node(Foo { _p: [0; 256] });
        node.append(last_node, &mut arena);
        last_node = node;
    }

    let time = std::time::Instant::now();
    for i in &query {
        let _ = std::hint::black_box(linked_list.iter().skip(*i).next());
    }
    println!("Linked list: {:?}", time.elapsed());

    let time = std::time::Instant::now();
    for i in &query {
        let _ = std::hint::black_box(first_node.descendants(&arena).skip(*i).next());
    }
    println!("Indextree: {:?}", time.elapsed());
}

Linked list: 589.368393ms
Indextree: 1.937983ms

Зато прыгать по указателям быстро ?

19 марта выходит обновление 1.6

Надо мерить. Всё зависит от LIMIT , если оно большое, то время на синхронизацию будет меньше, чем вычисления, соответственно на бенчмарки сильно не повлияет. Я бы составил таблицу с зависимостью времени от LIMIT.

Метод init3 работает некорректно, так как он недетерминированный - результаты выполнения потоков объединяются в неопределенном порядке. Из-за этого результат метода init3 может отличаться от результатов других методов. В данном случае необходима другая логика объединения результатов.

По второй ссылке представлены другие варианты бага, например, вместо placeholder-а используется Option:
let f: fn(Option<&'d &'d ()>, &'c T) -> &'d T = foo; (Сигнатура helper-а другая).
Возникнуть теоретически может, если писать код с временами жизни и с вложенными ссылками, а не с Rc<RefCell<T>> :)

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Game Developer, System Software Engineer
Junior
Rust
C++
Vulkan API
Computer graphics
Golang
gRPC
PostgreSQL
Redis