Koziołek napisał(a)
@Ghostek, pytanie kontrolne dlaczego zatem jave używano w komórkach, MDA/PDA i inszych urządzonkach o małych zasobach.
Ekhm... bo owe aplikacje nie są tak skomplikowane?
Do "codziennych" pseudo skryptowych zabawek pod windą java jest wyśmienita :)
To już kwestia gustu - ja pozostaję przy zdaniu, że Python rządzi ;)
Krolik napisał(a)
Ale nawet skompilowanie w C++ pod konkretny procesor nie gwarantuje, że ten kod będzie się wykonywał szybciej niż na JVM bo np:
- JIT może inlineować funkcje wirtualne, C++ nie.
- JIT może usuwać niepotrzebne blokady (czasem do 80%) na podstawie Escape Analysis, C++ nie.
- JIT agresywniej używa rejestrów, ponieważ nie musi się martwić o aliasing wskaźników jak w C
Tylko zauważ, że mimo wszystko Java startuje z gorszej pozycji niż języki kompilowane, bo przecież kompilacja w trakcie wykonywania swoją porcję zasobów zżera, i nie wmówisz mi że jest to do pominięcia ;) A poza tym, w C++ nie ma większego problemu z napisaniem krytycznych dla wydajności fragmentów kodu w asemblerze, więc nie trzeba zawsze zdawać się na łaskę i niełaskę kompilatora.
- Alokacja i dealokacja pamięci w Javie jest średnio kilka razy tańsza niż w C++. Problem fragmentacji pamięci w Javie nie występuje.
Też zależy od tego, jak kto programuje - wiadomo, że trzymanie wielkich kontenerów wskaźników z których każdy jest alokowany dynamicznie pofragmentuje pamięć jak cholera i zeżre przy tym mnóstwo zasobów na alokację i dealokację. Z drugiej strony, jeśli trzymać dane w jednorazowo alokowanych wielkich blokach i trzymać wskaźniki na fragmenty tych bloków, to narzut związany z alokacją odpada a z fragmentacją można poradzić sobie we własnym zakresie (przy ustandaryzowanych rozmiarach fragmentów nie będzie to trudne).
- W Javie więcej i łatwiej się operuje na wskaźnikach ze względu na GC, w C++ łatwiej niechcący "coś dużego skopiować" zamiast przekazać; czasem wręcz trzeba się namotać jak się STLa używa, żeby wyeliminować kopiowanie.
To tylko kwestia przyzwyczajenia, ja np. programując w Javie, Pythonie czy innym języku z wbudowanym GC nigdy nie jestem do końca pewny, czy właśnie kopiuję obiekt czy tylko tworzę nowe odniesienie ;)
- JIT efektywniej korzysta z maszyn wieloprocesorowych, bo np. GC może działać równolegle. Co oznacza, że jednowątkowy program też zyskuje troszkę na obecności drugiego rdzenia. W C++ nie.
Tu żeś imho strzelił kulą w płot, bo w C++ GC nie ma więc 'zysk' z jego braku odczuwasz niezależnie od ilości rdzeni :P
Jaka wojna?
A no taka ;)
Jakie nielogiczne przesłanki?
A no ta... może jednak nie ;)
w 90% przypadków dla kogoś kto dobrze zna Javę najlepszym wyborem jest Java
Przyznam szczerze, że jeśli miałbym kiedykolwiek użyć języka innego niż C++ to nie byłaby to Java, a wspomniany Python. Znacznie bardziej podoba mi się filozofia Pythona niż Javy (w C++ ograniczeniem jest konieczność bezpośredniej i zwięzłej kompilacji do kodu maszynowego, więc conieco można wybaczyć ;)) - zamiast ograniczać (wywalając przeciążanie operatorów czy wielokrotne dziedziczenie) zwiększa możliwości programisty (chociaż czasem aż za bardzo - brak konieczności deklaracji zmiennych przeklinałem przy każdej literówce :-[). Domyślam się, że przez większość tych udogodnień jest jeszcze wolniejszy, ale przynajmniej widzę, za co płacę ;)
Swoją drogą, ciekawi mnie wydajność tandemu Python + prekompilowane moduły pisane w C++. Będę musiał kiedyś potestować ;)