2015-08-14 7 views
6

Sto scrivendo un'applicazione di creare Arc oggetti di grandi array:Come dovrei inizializzare un `Arco <[u8; 65536]>` in modo efficiente?

use std::sync::Arc 

let buffer: Arc<[u8; 65536]> = Arc::new([0u8; 65536]); 

Dopo profiling questo codice, ho trovato che un memmove è in corso, rendendo questo lento. Con altre chiamate a , il compilatore sembra abbastanza intelligente da inizializzare i dati memorizzati senza il memmove.

ci crediate o no, il codice di cui sopra è più veloce di:

use std::sync::Arc; 
use std::mem; 

let buffer: Arc<[u8; 65536]> = Arc::new(unsafe {mem::uninitialized}) 

Che è un po 'una sorpresa.

Insights, mi aspetto che questo sia un problema del compilatore.

risposta

4

Sì, proprio ora, devi poggiare su ottimizzazioni, e apparentemente, non lo fa in questo caso. Non sono sicuro del perché.

Stiamo ancora lavorando alla nuova funzionalità di posizionamento, che sarà in grado di dirvi esplicitamente al compilatore di inizializzarlo direttamente nell'heap. Vedere https://github.com/rust-lang/rfcs/pull/809 (e https://github.com/rust-lang/rfcs/pull/1228 che propone modifiche che non sono pertinenti per questa domanda). Una volta che questo è implementato, questo dovrebbe funzionare:

let buffer: Arc<_> = box [0u8; 65536]; 
+0

Vale la pena notare che la RFC lei ha citato è stata fusa con il [RFC MIR (Mid-Livello intermedio Rappresentazione)] (https://github.com/rust- lang/rfcs/pull/1211), che è una [priorità di lavoro per il 2016] (http://blog.rust-lang.org/2015/08/14/Next-year.html). FYI :) –

+0

Grazie! Non è un grosso problema, aspetterò questa ottimizzazione. Sarebbe bello se potesse funzionare per "non inizializzato" – Greg

Problemi correlati