po wielu profilowaniu odkryłem, że ta metoda zajmuje większość% czasu obliczeń. Naprawdę nie widzę sposobu na optymalizację, ponieważ jest to okropna funkcja. (to jest ...) Może ktoś może mi pokazać jakiś fajny pomysł?Czy można zoptymalizować tę funkcję?
public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
double t1 = 1d + 1/4d * Math.pow(10d, 0.1d * (L_G - a0 - L_ETQ));
double t2 = Math.pow(t1, 0.25);
return 0.064d * Math.pow(10, 0.025 * L_ETQ) * (t2 - 1);
}
Oto ulepszona wersja:
public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
double x = L_G - a0 - L_ETQ;
double t1 = 0.25 * Math.exp(0.230259 * x) + 1;
double t2 = Math.sqrt(Math.sqrt(t1));
return ltqFactors[(int)L_ETQ] * (t2 - 1);
}
na wyszukanie dla ltqFactors idzie w ten sposób. ltqValues posiada 20 punktów od podanej funkcji ltq, że wartość przybliżona powinna być wystarczająca.
for(int i = 0; i < etqValues.length; ++i) {
ltqFactors[(int)etqValues[i]] = 0.064d * Math.exp(etqValues[i] * 0.05756462732485114210d);
}
Edycja: Po więcej Test przebiega z większą liczbą plików, przychodzę do prędkości ~ 100% up:
- Stary: 6,2% z 7000000 wywołań
- Nowość: 3, 2% 8000000 połączeń.
Dziękuję, do tej pory!
Edycja2: Nie wiem, którą odpowiedź zaakceptować. :( Z kilkoma innymi usprawnieniami (głównie tabele wyszukiwania) czas przetwarzania dla 9000 plików dźwiękowych spadł z 4: 30 min do 3: 28 min.
Pozostawię to pytanie otwarte, aby sprawdzić, czy są inne pomysły, ale potem przyjąć jedną odpowiedź
Edycja. Jestem trochę sfrustrowany teraz używam treeviewer jface aby pozwolić użytkownikowi przeglądanie wyników, a to potrzeba więcej czasu, aby zaktualizować niż sam obliczeń. /.
Chcę wiedzieć, jak ktoś mógłby wymyślić taką funkcję. Te stałe wydają się takie przypadkowe! –
@controlfreak http://ergo.ucsd.edu/~holcus/papers/JSNC2000.pdf – InsertNickHere
Nie ma nic w tej metodzie, która powinna trwać długo, aby obliczyć, czy na pewno nie zajmuje ona większości%, ponieważ jest nazywane wiele razy? –