Mi sono appena imbattuto in un altro motivo in qualche modo inatteso per l'utilizzo di AsynchronousFileChannel. Quando si eseguono scritture casuali orientate ai record su file di grandi dimensioni (che superano la memoria fisica e quindi la cache non aiuta tutto) su NTFS, trovo che AsynchronousFileChannel esegue più di due operazioni, in modalità single-thread, rispetto a un normale FileChannel.
La mia ipotesi migliore è che poiché l'io asincrono si riduce all'IO sovrapposto in Windows 7, il driver del file system NTFS è in grado di aggiornare le proprie strutture interne più rapidamente quando non deve creare un punto di sincronizzazione dopo ogni chiamata .
I micro-confrontata RandomAccessFile per vedere come sarebbe eseguire (risultati sono molto vicino a FileChannel, e ancora metà della performance di AsynchronousFileChannel.
Non so cosa succede con multi-thread scrive. Questo inizia Java 7, su un SSD (l'SSD è un ordine di grandezza più veloce del magnetico e un altro ordine di grandezza più veloce su file più piccoli che si adattano alla memoria)
Sarà interessante vedere se gli stessi rapporti valgono su Linux.
fonte
2012-02-15 06:35:59
Grazie, ma mi chiedevo di più sulle ragioni di efficienza - non riesco a vedere il motivo per cui eseguire l'I/O in un altro thread aiuta. Un thread deve sempre bloccare l'I/O, e non vi è alcun riutilizzo delle risorse, utilizzo delle funzionalità hardware o altri comportamenti che migliorano le prestazioni. –
Il vantaggio di questo è che * non * necessita di due thread. Se si sta scrivendo un grande blob di dati, a livello basso, il controller del disco esegue il processo di scrittura dei dati sul disco prima di segnalare un interrupt che sale nello stack per richiamare il gestore di completamento. Durante questa procedura il thread non deve essere bloccato e può fare altre cose. Si utilizza un thread in meno, lo scheduler dei thread gestisce un thread in meno, non è necessario utilizzare java notify. Fondamentalmente, si utilizzano meno risorse per fare la stessa cosa. – lenkite
Il sistema operativo può anche ottimizzare l'ordine in cui vengono eseguite operazioni IO asincrone. Ad esempio, se si dispone di un numero elevato di letture di una varietà di regioni in un file eseguite in modo asincrono, il sistema operativo può raggrupparle in letture sequenziali, senza doversi preoccupare dell'esecuzione di tutte le operazioni nell'ordine specificato. –