vyuka:psi:cviceni:rychlost-io-java

Rychlost síťových operací v Javě

Ne všechny operace v Javě trvají stejnou dobu. Pro efektivní využití zdrojů je nutné využít nástrojů, jež jsou doporučeny od tvůrců jazyka. Uveďme si jednoduchý příklad a ukažme si srovnání jeho účinnosti. Mějme jednoduchý server, který čeká na klienty. Po připojení klienta mu odešle 2 000 000 bajtů a spojení ukončí. Klient příjme data, zahodí je a změří, jak dlouho mu příjem trval. Porovnáme 2 základní metody pro psaní programů.

Server je popsaný následujícím kódem, který se provede pro každého klienta.

OutputStream os = socket.getOutputStream();
for (int i = 0; i < 2000000; i++) {
  os.write((byte)0x30);
}
OutputStream os = s.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
for (int i = 0; i < 2000000; i++) {
  bw.write('a');
}

Klient pouze přečte data od serveru a vypíše jak dloho mu to trvalo.

InputStream is = socket.getInputStream();
int c;
while((c=is.read())!=-1){
  // do nothing
}
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
int c;
while((c=br.read())!=-1){
  // do nothing
}
Klient Server
Pomalý Rychlý
Pomalý 9800 5200
Rychlý 9650 320

Doba běhu je uvedena v ms.

Čtení ze souborů nebo sítě pomocí funkcí InputStream.read() je náročné na čas. Proto je nutné použít obalové třídy BufferedReader, která omezuje počet časově náročných čtení ze souboru či sítě.

P.S. BufferedReader.readLine() je úžasná funkce, ale pro implementaci Karla se opravdu nehodí…

  • vyuka/psi/cviceni/rychlost-io-java.txt
  • Last modified: 2011/03/31 08:37
  • by votavon1