Bonjour a tous,
Je développe actuellement une application cliente relativement simple qui a besoin des meilleurs performances possibles coté communication réseau. La cinématique est la suivante:
1. L'application se connecte et s'authentifie auprès du server
2. Elle recoit un paquet
3. Elle decode le paquet en type primitif (au nombre de quatre à quelques dizaines)
4. On boucle sur le 2
Comme vous le voyez, les communication ascendante se font uniquement a la connection et le gros du traitement se fait en réception des messages.
Pour le moment, j'utilise une Socket, un byte array, et la classe DataInputStream. J'ai testé avec les nouvelles classes nio SocketChannel et ByeBuffer en espérant avoir un gain de performance significatif... Mais les perfs sont désastreuses!
Pour 5000000 paquet avec les io
time=5785ms avg=0.001157
time=7329ms avg=0.0014658
time=5541ms avg=0.0011082
Pour 5000 paquets avec les nios
time=136ms avg=0.00272
time=135ms avg=0.0027
Es ce normal? J'ai du louper quelques choses? Je pensais la classe ByteBuffer imbatable niveau performances...
Voici le code:
io
et nio
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Socket m_socket; InputStream m_inputStream; m_socket = new Socket(); try{ m_socket.setReceiveBufferSize(1024*1024); m_socket.setSendBufferSize(1024*1024); m_socket.connect(new InetSocketAddress("server", 8081) ); m_inputStream = new DataInputStream(m_socket.getInputStream()); byte my_bytes[] = new byte[16]; long start_time = System.nanoTime(); for(int i= 0; i < 50000; i++) { readBytes(m_inputStream,my_bytes); DataInputStream m_decode_stream = new DataInputStream (new ByteArrayInputStream (my_bytes)); int an_int = m_decode_stream.readInt(); int another_int = m_decode_stream.readInt(); double a_double = m_decode_stream.readDouble(); } long result = (System.nanoTime()-start_time)/1000000; System.out.println("time="+result+" avg="+((float)result/(float)50000)); } catch(IOException ioEx){ ioEx.printStackTrace(); return; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 SocketChannel m_socket; try{ m_socket = SocketChannel.open(); m_socket.configureBlocking(true); m_socket.connect(new InetSocketAddress("server", 8081)); m_socket.socket().setReceiveBufferSize(1024*1024); m_socket.socket().setSendBufferSize(1024*1024); ByteBuffer my_data = ByteBuffer.allocateDirect(1024); my_data.limit(16); long start_time = System.nanoTime(); for(int i= 0; i < 50000; i++) { my_data.clear(); my_data.limit(16); readBytes(m_socket,my_data); my_data.flip(); if( my_data.limit() == 16 ) { int an_int = my_data.getInt(); int another_int = my_data.getInt(); double a_double = my_data.getDouble(); } else { System.err.println("disconnected.."); break; } } long result = (System.nanoTime()-start_time)/1000000; System.out.println("time="+result+" avg="+((float)result/(float)50000)); } catch(IOException ioEx){ ioEx.printStackTrace(); return; }
Partager