OVH Cloud OVH Cloud

NIO : problème de performance

3 réponses
Avatar
JLM
Bonjour à tous !

Afin d'être sûr que le package nio apportait réellement du mieux concernant
les gestions de flux, je me suis amusé à lancer ce genre de petit programme
de test :

// ----------------------------
ByteBuffer loWriteBuffer = ByteBuffer.allocateDirect(1024);
CharBuffer loBuffer = CharBuffer.allocate(512);

Charset charset = Charset.forName("ISO-8859-1");
CharsetEncoder encoder = charset.newEncoder();
long llMillis, llMillis2, llMillis3;

llMillis = System.currentTimeMillis();
try {
FileChannel loChannel = new RandomAccessFile(new
File("C:\\Temp\\Test.txt"), "rw").getChannel();
for (int i = 0; i < 1000; ++i) {
loBuffer.put("ceci est un test\r\n");
loBuffer.flip();
encoder.encode(loBuffer, loWriteBuffer, false);
loWriteBuffer.flip();
loChannel.write(loWriteBuffer);
loBuffer.clear();
loWriteBuffer.clear();
}
loChannel.close();
}
catch (IOException leIO) {
leIO.printStackTrace();
}
llMillis2 = System.currentTimeMillis();
try {
Writer loWriter = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream("C:\\Temp\\Test2.txt"), charset));
for (int i = 0; i < 1000; ++i) {
loWriter.write("ceci est un test\r\n");
}
loWriter.flush();
loWriter.close();
}
catch (IOException leIO) {
leIO.printStackTrace();
}
llMillis3 = System.currentTimeMillis();

System.out.println("Results : nio = " + (llMillis2 - llMillis) + " ms /
standard = " + (llMillis3 - llMillis2) + " ms");
// ----------------------------

A ma grande surprise (d'après ce que j'ai pu lire à droite ou à gauche), sur
mon poste, la méthode classique est 4 fois plus rapide que l'utilisation des
nio !!!
D'où ma question : mon code est-il correctement optimisé ? D'autres
personnes ont-elles constaté également un problème de perfs dans les nio ?
Mon test est-il en cause ?

Merci !

3 réponses

Avatar
Vincent Cantin
Tient moi informe de tes futurs tests, ca m'interesse :
j'utilise NIO actuellement pour ma lib de reseau et j'ai besoin de bonnes
performances.

Merci,
Vincent
Avatar
JLM
C'est bon, j'ai trouvé : en fait, les deux parties ne sont pas équivalentes.
Il faut déplacer le flush() dans la deuxième partie pour l'insérer dans la
boucle. En effet, les données doivent être écrites en fin de chaque boucle
si on se réfère code source présent dans le bloc NIO. Actuellement, les
données étaient stockées dans le buffer du BufferedWriter plutôt que d'être
transmises dans le fichier.
Au final, NIO est légèrement plus rapide (environ 1,3 fois sur mon poste).
L'honneur est sauf ! ;-)

"Vincent Cantin" a écrit dans le message de news:

Tient moi informe de tes futurs tests, ca m'interesse :
j'utilise NIO actuellement pour ma lib de reseau et j'ai besoin de bonnes
performances.

Merci,
Vincent




Avatar
Vincent Cantin
Au final, NIO est légèrement plus rapide (environ 1,3 fois sur mon poste).
L'honneur est sauf ! ;-)


Ouf ! je respire :-)