Wpis z mikrobloga

#naukaprogramowania #programowanie #java

Hej. Proszę o rady, jak usprawnić ten kod, żeby algorytm był szybszy (w rozwiązaniu dostaję 40% za wydajność). I może jakieś rady na przyszłość, w jaki sposób myśleć o podobnych rozwiązaniach, do jakich struktur się odwoływać, jakich unikać itd:

"class Solution {
public int[] solution(int N, int[] A) {
int[] result = new int[N];
for(int i = 0; i < N; i++) {
result[i] = 0;
}
for(int i = 0; i < A.length; i++) {
if(A[i] >= 1 && A[i] <= N) {
result = increase(A[i], result);
} else if (A[i] == N + 1) {
maxCounter(result);
}
}
return result;
}
public int[] increase(int i, int[] j) {
j[i-1] += 1;
return j;
}

public int[] maxCounter(int[] j) {
int maxElement = 0;
for(int i = 0; i < j.length; i++) {
maxElement = Math.max(j[i], maxElement);
}
for(int z = 0; z < j.length; z++) {
j[z] = maxElement;
}
return j;
}
}"
  • 28
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@LazyInitializationException: niech będzie, choć nie jest to klasyczny JIT, który kompiluje każdy kod w chwili wykonania. HotSpot kompiluje tylko fragmenty często wykonywane. Zwał jak zwał, dyskusja zmierza na tory akademickie, natomiast rzeczywistość jest taka, że te kompilatory, które ma JVM Oracle (tudzież OpenJDK) są mizernie słabe w porównaniu nawet do 20-letnich kompilatorów C++.
  • Odpowiedz
@LazyInitializationException: Z zasady nie jest co innego. Szczegóły techniczne są tylko nieco inne. PGO w C++/Rust jest silniejsze niż to co robi JVM, bo ma więcej czasu na zebranie profilu, samo zbieranie profilu może być dokładniejsze (droższe) a na końcu jest znacznie więcej czasu na przetworzenie tego i optymalizację.

Co i tak nie zmienia faktu że znajomość profilu podczas kompilacji daje nie więcej niż 20% dodatkowej wydajności w skrajnie optymistycznych
  • Odpowiedz
Jeszcze dodam że ta dynamiczna optymalizacja Javy to jest masakra ze względu na brak przewidywalności wydajności. Widziałem jak serwis wrzucony na produkcję działał wydajnie przez kilka godzin a potem nagle JVMowi coś się odwidzialo i zdeoptymalizowal część kodu na krytycznej ścieżce. I nagle wydajność serwisu spadła trzykrotnie. Takie coś jest nie do pomyślenia w aplikacji natywnej.
  • Odpowiedz