Co właściwie robi to polecenie?

Co właściwie robi to polecenie?
M4
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 58
0

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

Kopiuj
     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?

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

NoZi
  • Rejestracja: dni
  • Ostatnio: dni
0

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

NoZi
  • Rejestracja: dni
  • Ostatnio: dni
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

Wizzie
  • Rejestracja: dni
  • Ostatnio: dni
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.

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
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.

Wizzie
  • Rejestracja: dni
  • Ostatnio: dni
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 :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.