Con la connessione gigabit, Teracopy esegue 31 MB / s, ma Windows 8 lo fa a ~ 109 MB al secondo?
Cosa sta causando esattamente questo? E posso abilitare tali velocità tramite Teracopy? Ho davvero scavato le funzionalità extra che Teracopy ha, sicuramente mi mancheranno ora: D
Due parole: verifica e cache
Spiegazione tecnica
Questa è la procedura generale per copiare un file con Windows Explorer:
- Leggi un blocco di dati dall'unità di origine in memoria
- Invia il pezzo attraverso il sistema (s)
- Scrivi il blocco nell'unità di destinazione
- Se non ancora fatto, tornare al passaggio 1
Questo sembra semplice e abbastanza breve. Con questo algoritmo di trasferimento, ogni byte del file viene elaborato solo due volte: una lettura, una scrittura.
Inoltre, Windows utilizza la memoria (così come l'unità stessa) per memorizzare nella cache alcuni dati. Quindi, invece di attendere che il blocco precedente finisca di essere scritto, e quindi leggere il blocco successivo, è possibile leggere un nuovo blocco mentre il precedente è ancora in fase di scrittura. Ovviamente questo non può durare per sempre, ma Windows può utilizzare tutta la memoria libera rimanente come buffer temporaneo per archiviare la maggior parte, se non tutto il file che viene letto in memoria.
È possibile visualizzare la cache in azione copiando un file di grandi dimensioni o una cartella contenente molti file da un'unità a un'altra, quindi confrontando immediatamente i due. Il confronto sarà molto più veloce a quel punto rispetto a quando lo farai in seguito perché i file sono ancora in memoria, quindi non li sta effettivamente leggendo dalle unità.
Poiché la memoria è molto veloce e le velocità di lettura tendono ad essere un po 'più veloci delle velocità di scrittura, la velocità di trasferimento finale finisce per essere limitata solo dalla velocità di scrittura dell'unità di destinazione.
Teracopy può fare due cose che possono rallentare un trasferimento di file che Explorer non fa:
A differenza di Explorer che verifica solo gli errori di base durante il trasferimento, Teracopy può effettivamente verificare che i dati siano stati scritti correttamente sull'unità di destinazione al fine di prevenire il danneggiamento dei dati che potrebbe verificarsi a causa di problemi nel supporto di trasferimento (rete / cavo dell'unità / ecc. ) o l'unità stessa (settore danneggiato, ecc.) Ciò significa che deve leggere il file dalla destinazione per confrontarlo con l'originale.
A seconda dell'algoritmo utilizzato e delle dimensioni del file, la verifica può essere ottimizzata a partire da (ma non meno di) tre operazioni di unità per ciascun file / blocco di file rispetto alle due di Explorer: leggere il file dall'origine, scrivere il file alla destinazione e leggere il file dalla destinazione.
Guarda cosa succede quando copi un file con Teracopy (con un algoritmo ottimizzato per HDD):
- Leggi un pezzo dall'unità di origine
- Hash il pezzo letto dall'unità di origine
- Invia il pezzo attraverso il sistema (s)
- Scrivilo sull'unità di destinazione
- Cancella cache
- Leggi il pezzo indietro dall'unità di destinazione
- Hash il pezzo dall'unità di destinazione
- Confronta gli hash
- Determina il passaggio successivo
- Se gli hash non corrispondono, fornisci l'errore e richiedi l'intervento dell'utente
- Se gli hash corrispondono e non sono finiti, tornare al passaggio 1
Il problema è che se si memorizzano nella cache i file durante il trasferimento, il confronto diventa inutile perché non si stanno leggendo i dati effettivi sull'unità di destinazione, si sta leggendo la copia memorizzata nella cache dalla sorgente. Pertanto, per verificare correttamente, è necessario cancellare la cache. Questo può essere fatto dopo ogni lettura e scrittura (che è un'operazione aggiuntiva che finirebbe per essere eseguita innumerevoli volte per file di qualsiasi dimensione significativa) o solo una volta dopo che l'intero file è stato trasferito.
Secondo lo screenshot seguente, TeraCopy esegue la verifica dopo il trasferimento dei file, non durante. Ciò significa che utilizza invece questo algoritmo di trasferimento ottimizzato per CPU / RAM:
- Leggi un pezzo dall'unità di origine
- Invia il pezzo attraverso il sistema (s)
- Scrivilo sull'unità di destinazione
- Se non ancora fatto, tornare al passaggio 1
- Copia terminata, quindi cancella le cache ed è in fase di verifica
- Leggi un pezzo dall'unità di origine
- Hash il pezzo dall'unità di destinazione
- Leggi un pezzo dall'unità di destinazione
- Hash il pezzo dall'unità di destinazione
- Confronta gli hash
- Determina il passaggio successivo
- Se gli hash non corrispondono, fornisci l'errore e richiedi l'intervento dell'utente
- Se gli hash corrispondono e non sono finiti, tornare al passaggio 6
Mentre questo algoritmo mette a dura prova un po 'meno la CPU e la RAM, pone anche molta più tensione sulle unità perché ora ogni file deve essere elaborato quattro volte: leggi l'intero file dalla sorgente, scrivilo alla destinazione , quindi leggilo di nuovo dalla fonte e di nuovo dalla destinazione.
(Se TeraCopy fosse ottimizzato per i trasferimenti di rete, allora potrebbe evitare di inviare l'intero file una seconda volta per la verifica e inviare solo gli hash che sono molto più piccoli, ma che attualmente non sembra essere il caso, ei driver di rete vengono trattati allo stesso modo come unità locale, quindi in realtà rilegge la fonte.)
Per impostazione predefinita, TeraCopy non verifica né utilizza la cache. Non verificare accelererebbe il trasferimento (o più precisamente, non lo rallenterebbe ), mentre non usare la cache lo rallenterebbe.
Applicazione
Per determinare i risultati della tua velocità specifica, dovresti controllare le tue impostazioni per vedere se le hai modificate. Quindi puoi provare ad approssimare il tipo di velocità che otterrai con le diverse impostazioni (tieni presente che probabilmente interagiranno, quindi non si tratta semplicemente di aggiungere o sottrarre).
Detto questo, facciamo un calcolo sommario usando i tuoi numeri:
- Trasferimento file locale: 875 Mbps (ovvero velocità dell'unità)
- Velocità di rete: 1 Gbps = 119,21 MBps
- Copia tramite Esplora risorse: 109 Mbps
- Copia tramite TeraCopy: 34 Mbps
Vediamo subito che il trasferimento di file di Explorer sta quasi massimizzando la velocità di trasmissione della rete. Un collegamento da 1 Gbps equivale a 1.000.000.000 di bit al secondo, che in unità binarie di byte è 119 Mbps. Explorer ha un clock di 109 Mbps e i restanti 10 Mbps (che in modo abbastanza divertente era il tuo massimo precedente :^Þ
) possono essere facilmente spiegati per overhead, caricamento in background e frammentazione.
(Poiché la velocità di trasferimento è quasi uguale alla velocità della rete, possiamo supporre che il trasferimento dei file di Explorer sia a senso unico e che venga inviata una sola copia di ciascun file.) Explorer ottiene 110 Mbps per due accessi ai file per file.
Ora per TeraCopy. Sembra che TeraCopy stia ottenendo quasi un terzo della velocità di Explorer.
A seconda che la sua finestra di dialogo delle preferenze indichi o meno con precisione l'algoritmo che utilizza, TeraCopy potrebbe effettivamente inviare l'intero file sorgente due volte in modo da poter controllare la copia. Immediatamente, questo dimezza il rendimento. Se la cache è attiva, anche quella riduce la velocità perché deve attendere il completamento di ogni scrittura prima di poter inviare un nuovo blocco. Se combinato con la verifica, può abbatterlo ancora di più.
La tua velocità di trasferimento di 34 Mbps sembra ragionevole se hai la verifica attivata e la memorizzazione nella cache. Se disattivi la verifica e la memorizzazione nella cache, dovresti ottenere quasi lo stesso di Explorer (potresti comunque ottenere un po 'meno o addirittura un po' di più a seconda di quanto sia diverso il codice di trasferimento file che TeraCopy utilizza da quello utilizzato da Explorer).
Se hai voglia di trasferire quasi 10 GB, puoi anche provare a modificare le impostazioni e ripetere il trasferimento per ciascuna delle quattro permutazioni e annotare le velocità che ottieni (per sicurezza, ordina in modo che la cache sia fuori tra le corse:) V+C+, V+C-, V-C+, V-C-
.