… na oszczędzenie na czasie. Chyba tak. Albo chyba nie? Ale o co chodzi?

Szybko, dobrze i tanio

Jest taka legenda Miejska, która mówi, że pewna mała firma IT w katalogu reklamowym miała napisane:Szybko, Tanio, Solidnie. Wybierz i zapłać za dwa z tych produktów, a my dajemy gwarancję satysfakcji.
Pewien człowiek, zapytał się dlaczego ma wybrać dwa z tych przymiotników. Odpowiedź była oczywista.
Soft można tworzyć szybko i tanio, ale nie solidnie. Można też szybko i solidnie, ale nie jest to tanie. Można w końcu tanio i solidnie, ale będzie to trwało dość długo.
Idąc w myśl tych zasad można powiedzieć, że istnieją też takie trzy cechy oprogramowania, które pozwalają na opisanie sposobów tworzenia kodu. Moim zdaniem są to:

  • Zużycie pamięci
  • Zużycie procesora
  • Elegancja i bezpieczeństwo kodu

Idąc tym tropem opiszę kilka prostych sztuczek, które pozwalają zoptymalizować kod pod kątem jednej z tych cech.

Nienawidzę pętli for

Pierwsza prosta optymalizacja to optymalizacja pod kątem czasu wykonania i zużycia pamięci. Jeżeli mamy pętlę for:

Listing 1.

package eu.runelord.optymalizacja;

public class PetlaFor {

	/** * @param args */
	public static void main(String[] args) {
		PetlaFor petlaFor = new PetlaFor();
		for (int i = 0; i 
<p>Pytanie jaki będzie wynik?</p>
  • sto [.]
  • nic
  • program się nie skompiluje

Prawidłowa odpowiedź to a. Za każdym obrotem zostanie wywołana metoda obliczająca wielkość. Nic wielkiego jak metoda tylko zwraca jakąś liczbą, a co gdy wykonuje dodatkowe obliczenia, albo jest obłożona interceptorami? Wtedy nie dość, że tracimy czas na powtarzanie obliczeń to jeszcze dodatkowo możemy zająć dużo pamięci.
Rozwiązaniem jest wprowadzenie dodatkowej zmiennej, która będzie przechowywała wynik obliczeń:

Listing 2. Pętla po małej optymalizacji

package eu.runelord.optymalizacja;

public class PetlaFor {

	/** * @param args */
	public static void main(String[] args) {
		PetlaFor petlaFor = new PetlaFor();
		int l = petlaFor.size();
		for (int i = 0; i 
<p>Jest szybko i z małym zużyciem pamięci, ale kod nie jest bezpieczny wielowątkowo. Dlaczego? A no dlatego, że może się okazać, że inny wątek znacznie zmniejszył rozmiary naszego zbioru i wielkość, którą operujemy jest nieprawidłowa.	Jak widać nie można być pięknym, mądrym i bogatym.</p>