Pourquoi les performances de BufferedReader sont-elles si pires que BufferedInputStream?
Je comprends que l'utilisation d'un BufferedReader (emballage d'un FileReader) va être beaucoup plus lent que d'utiliser un BufferedInputStream (emballage d'un FileInputStream), parce que les premières octets doivent être converties en caractères. Mais je ne comprends pas pourquoi il est beaucoup plus lent! Voici les deux exemples de code que j'utilise:
BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(filename));
try {
byte[] byteBuffer = new byte[bufferSize];
int numberOfBytes;
do {
numberOfBytes = inputStream.read(byteBuffer, 0, bufferSize);
} while (numberOfBytes >= 0);
}
finally {
inputStream.close();
}
et:
BufferedReader reader = new BufferedReader(new FileReader(filename), bufferSize);
try {
char[] charBuffer = new char[bufferSize];
int numberOfChars;
do {
numberOfChars = reader.read(charBuffer, 0, bufferSize);
} while (numberOfChars >= 0);
}
finally {
reader.close();
}
J'ai essayé de tests à l'aide de différentes tailles de mémoire tampon, le tout avec un 150 mégaoctets de fichiers. Voici les résultats (taille de la mémoire tampon est en octets; les horaires sont en millisecondes):
Buffer Input
Size Stream Reader
4,096 145 497
8,192 125 465
16,384 95 515
32,768 74 506
65,536 64 531
Comme peut être vu, le temps le plus rapide pour la BufferedInputStream (64 ms) est sept fois plus vite que le temps le plus rapide pour le BufferedReader (465 ms). Comme je l'ai dit ci-dessus, je n'ai pas de problème avec une différence significative; mais cette différence semble tout à fait déraisonnable.
Ma question est: quelqu'un aurait-il une suggestion pour améliorer les performances de la BufferedReader, ou un autre mécanisme?
source d'informationauteur Andy King
Vous devez vous connecter pour publier un commentaire.
Le BufferedReader a convertir les octets en caractères. Cet octet par octet d'analyse et de copie à un plus grand type est cher par rapport à une simple copie de blocs de données.
imprime
REMARQUE: le fait de Devoir faire ce mélangés avec des appels système peut ralentir les deux opérations (comme les appels système peut perturber le cache)
dans BufferedReader mise en œuvre il y a une constante fixe
defaultExpectedLineLength = 80
qui est utilisé dansreadLine
méthode lors de l'attribution deStringBuffer
. Si vous avez de gros fichiers, avec beaucoup de lignes de plus de 80, ce fragment pourrait être quelque chose qui peut être amélioré