OZ 2011/1-2

38 ORGANIZACIJA ZNANJA 2011, LETN. 16, ZV. 1 – 2 Današnji diski so zelo zmogljivi pri branju velikih količin (blokov) podatkov, toda zelo neučinkoviti pri branju velikega števila majhnih kosov podatkov. Za pospešitev branja oz. pisanja je zelo pomembno predpomnjenje podatkov in prav tu se izkažejo filtri za predpomnjenje. Primer branja datoteke v javi: InputStream in = null; try { in = new FileInputStream(fileName); while (true) { int data = in.read(); if (data == -1) break; ... } } catch (IOException) { if (in != null) in.close(); } Z uporabo filtra lahko branje take datoteke pohitrimo za nekaj velikostnih razredov: InputStream in = null; try { InputStream inFile = new FileInputStream(fileName); in = new BufferedInputStream(inFile); ... Še dodatno lahko pospešimo vhodne in izhodne opracije z uporabo lastnega predpomnilnika. Velikost predpomnilnika moramo določiti glede na pričakovano velikost naših podatkov: static final in BUF_SIZE = 100000; static binal byte[] buffer = new byte[BUF_SIZE]; InputStream in = null; try { in = new FileInputStream(fileName); while (true) { synchronized (buffer) { int amountRead = in.read(buffer); if (amountRead == -1) break; ... Serializacija Pri prenosu objektov preko mreže (angl. remote method invocation ) ali pri shranjevanju na disk se izvede serializacija oz. deserializacija objektov. Serializirajo se vsi atributi, ki niso tipa transient oz. static . Po deserializaciji so transientni atributi prazni (privzete vrednosti). Da bi povečali hitrost prenosa, naj bo čim več atributov transientnih, le-te pa inicializiramo pri deserializaciji objekta. To naredimo tako, da povozimo metodo nadrazreda java.lang.Object in v njej izvedemo inicializacijo teh atributov: public void readObject(ObjectInp utStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); initTransientAttributes(); } Poraba pomnilnika Pri delovanju uporablja aplikacija delovni pomnilnik RAM, v katerem so shranjeni vsi podatki in koda, ki jo program potrebuje. Pri slabo napisani aplikaciji se količina porabljenega pomnilnika s časom povečuje, kar nakazuje na to, da se sistemski viri po uporabi ne brišejo. Porabo pomnilnika lahko preverimo z dvema vgrajenima metodama Runtime.totalMemory() in Runtime.freeMemory() . Prva metoda nam poda celotno razpoložljivo količino pomnilnika, ki ga lahko zasedajo objekti in drugi podatki aplikacije, medtem ko nam druga metoda vrne količino prostega pomnilnika. Pri preverjanju pomnilnika v Windows Task Manager opazimo, da je poraba pomnilnika veliko večja, kot nam prikažejo metode v javi; te namreč kažejo samo porabo, ki ga zasedajo objekti. K celotni porabi pomnilnika prispevajo: • Objekti To je pomnilnik, ki ga prikažejo javine metode Runtime.totalMemory() in Runtime.freeMemory() . Prav pri tej komponenti lahko največ pripomoremo k optimizaciji porabe pomnilnika. Primeri porabe pomnilnika za tipične razrede java: Tip Velikost Byte 1 bajt Char 2 bajt Short 2 bajt Int 4 bajt Float 4 bajt long 8 bajt double 8 bajt reference 4 bajt java.lang.Object 8 bajt java.util.Hashtable 96 bajt javax.swing.JTextField 3109 bajt javax.swing.JTable 4086 bajt POROČILO

RkJQdWJsaXNoZXIy MTAxMzI5