Co właściwie robi to polecenie?

0

Cześć. Mam pytanie. Co dokładnie robi ta pętla tutaj?

     public void addingString()
    {
        String str = "a";
         long startTime = System.currentTimeMillis();
        for(int i = 0; i<100000; i++)
        {
            str = str + "a";
        }
       long endTime = System.currentTimeMillis();
        long result = endTime-startTime;
        System.out.println(result);  
      }

Rozumiem, że samo currentTimeMilis() sprawdza ile czasu trwał cały proces, ale na jaką choinkę jest tutaj "str=str+"a"?
Samo str=str by nie wystarczyło żeby obliczyć ten czas? Czy to nie ma żadnego znaczenia a to ciało pętli jest czysto hipotetyczne?

3

Ta pętla liczy jak długo zabiera taka konkatenacja stringa. Pokazuje to jak bardzo nieefektywne jest składanie stringa w ten sposób bo string w javie jest immutable i każda operacja tworzy nowy.

0

Poza tym tak się też nie liczy czasu wykonania.

0

Poczytaj o micro benchmarkach w Javie. Jeśli chcesz wiedzieć dlaczego w Javie trudno jest obliczyć czas wykonania poczytaj również o JIT. Do tego JVM dokonuje różnych optymalizacji. Poczytaj http://www.amazon.com/Java-Performance-The-Definitive-Guide/dp/1449358454

0

Już nawet nie chodzi o sam fakt, że String jest immutable, tylko, że łączenie stringów jest O(n), dlatego to jest takie wolne.

0

@Wizzie, StringBuilder, StringBuffer i metoda append w JTextArea łączą szybko. Za nieefektywność operacja konkatenacji jest odpowiedzialna właściwość immutable. Jeśli masz w pamięci String s o rozmiarze 1MB, za nim w pamięci wolne miejsce, to operacja s+"a" i tak przepisze całość w nowe miejsce.

0

@bogdans Ale przecież istnieją kolekcje immutable, które mają operacje typu append o złożoności O(1), więc to nie wina mutowalności, a implementacji. Piszę o czasie wykonania, nie pamięci :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1