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: 352Kā 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));
}
}