the other side ([info]ukawi) rakstīja [info]koderi kopienā,
@ 2003-07-02 12:53:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Programmēšanas stils un efektivitāte (Java)
Zinu, ka esmu ļoti piekasīgs. Sastapu kodā apmēram tādas rindiņas A, kuru aizstāju ar rindiņām B:

A: String result = (new Integer(i)).toString();
B: String result = Integer.toString(i);


Vienīgais šī koda uzdevums ir pārvērst skaitli (int) par simbolu virkni (String). Izmantojot pusdienlaiku, lai pamatotu savu darbību, uzrakstīju divus mazus testus: TestA izmanto A fragmentu, TestB - B fragmentu. Testi tika izpildīti vairākkārt un jauktā secībā, bet rezultāti visos gadījumos bija šādi:

-- TestA results ----------
free memory before: 1782832
free memory after: 1782464
memory used: 368
-- TestB results ----------
free memory before: 1782832
free memory after: 1782480
memory used: 352


Kā redzams, A gadījumā tiek izmantots vairāk atmiņas, jo tiek izveidots papildus objekts (Integer), kuru tālāk programmā neizmanto. Lai arī 16 baiti nav daudz, tomēr šādas rindiņas tika diezgan plaši izmantotas visā kodā. Papildus atmiņas patēriņam, zināmi resursi nepieciešami arī drazas savācējam (garbage collector), lai šo atmiņu atbrīvotu.
Ar to tiek pierādīts, ka manam piekasīgumam ir arī kāds iemesls. Viss.


public final class TestA {
  public static void main(String args[]){
    Runtime r = Runtime.getRuntime();

    long freeMemBefore = r.freeMemory();
    String result = (new Integer(666)).toString();
    long freeMemAfter = r.freeMemory();

    System.out.println("-- TestA results ----------");
    System.out.println("free memory before: " + freeMemBefore);
    System.out.println("free memory after:  " + freeMemAfter);
    System.out.println("memory used:        " + (freeMemBefore - freeMemAfter));
  }
}
public final class TestB {
  public static void main(String args[]){
    Runtime r = Runtime.getRuntime();

    long freeMemBefore = r.freeMemory();
    String result = Integer.toString(666);
    long freeMemAfter = r.freeMemory();

    System.out.println("-- TestB results ----------");
    System.out.println("free memory before: " + freeMemBefore);
    System.out.println("free memory after:  " + freeMemAfter);
    System.out.println("memory used:        " + (freeMemBefore - freeMemAfter));
  }
}


(Ierakstīt jaunu komentāru)


[info]ex_maita690
2003-07-02 13:17 (saite)
Liekas, ka tev sen laiks būt par "IT project manager/leading programmer"!

(Atbildēt uz šo)


[info]smejmoon
2003-07-02 13:31 (saite)
varēji izlaist cauri nevis tikai 666, bet visus integerus.

tādiem cilvēkiem, kas raksta 'A' C/C++ nevar dot .. un baidos arī Javas GC nepavilks :(

Jautajums: kapēc nevar lietot i.toString() tur, kur tas vajadzīgs? Tapēc, ka Integer un int ir dažādi tipi?

njaa un darbību varēji pamatot ar to, ka tu no koda izvāci 4 iekavas un 1 vārdu :) tas jau ir labi.

(Atbildēt uz šo) (Diskusija)


[info]ukawi
2003-07-02 14:56 (saite)
Jā, dažādi tipi - int nav objekts.

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?