2017-05-30 1 views
2

Comment tampon dans package java.io optimise les performances. J'ai lu les sources des classes principales dans le paquetage java.io et j'ai remarqué que j'emballe un flux dans un flux tamponné - alors le même travail finit par se produire, mais d'une certaine manière c'est qu'il va augmenter les performances. Je comprends que le réseau tamponné économisera du trafic de sortie en utilisant la mise en cache, mais comment l'écriture de fichier profite-t-elle de la mise en cache. Je suppose que la réponse est quelque part hors de Java - comme dans le compilateur Jit ou le système d'exploitation sous-jacent.tampon dans package java.io optimise les performances

+0

Peut-être que [ma réponse à cette question] (https://stackoverflow.com/questions/33690884/pourquoi-does-le-buffered-writer-does-not-write-imediately-when-the-write-method- i/33691533 # 33691533) aiderait? Oui, vous faites le même travail "utile" à la fin, mais le point est que vous réduisez la quantité de frais généraux (ouvrir le fichier, chercher au bon endroit, etc.) en le tamponnant. –

+0

@UPvoter non, ce n'est pas le cas. Calling 'write' dans l'objet tamponnée [le met dans la mémoire tampon] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/BufferedWriter. java # 143); et lorsque le tampon est vidé, [le tampon entier est écrit à l'écrivain sous-jacent à la fois] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java /io/BufferedWriter.java#128). –

+0

ne l'appellera-t-il pas finalement? whitch est BUTE par octet ... http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/OutputStream.java#OutputStream.write%28byte% 5B% 5D% 29 – UPvoter

Répondre

2

JNI appels et les appels système ne sont pas au-dessous pas cher. Donc, si vous lisez ou écrivez des choses quelques octets à la fois cela pourrait devenir très cher. lecture/écriture au lieu de/à partir d'un tampon de taille à quelques kilo-octets à la fois, puis (qui compilent souvent à une seule instruction mov sur x86) juste tableau-accès performant du tampon peut être beaucoup beaucoup moins cher.

Mais ils ne sont pas universellement plus vite, dans certaines circonstances, lorsque vous voulez transférer grandes blocs de données entre bytebuffers directes, les fichiers ou prises canal scatter/gather ou transfer méthodes ou fichiers mappés en mémoire peuvent être plus performants car ils éviter la copie intermédiaire.

1

Principalement parce qu'il économise énormément sur les appels système. Au lieu d'appeler le système d'exploitation une fois par octet, il l'appelle une fois par bufferload (8k octets) ou par flush().