2015-07-13 22 views
15

Zostałem przydzielony do zadania optymalizacji wydajności aplikacji.Czy przekazanie obiektu do metody zwiększa wydajność nad wysyłaniem poszczególnych parametrów?

Często konieczne jest przekazanie do konstruktora 16-25 parametrów i ustawienie ich tam. Chcę utworzyć obiekt klasy & i ustawić te wartości na obiekcie, a następnie przekazać. Dobrze będzie przeczytać. Ale czy będzie to miało jakikolwiek wpływ na moje zadanie (np. Optymalizację wydajności)?

+18

mimochodem, że wiele parametrów do konstruktora jest zapach kod w każdym razie niezależnie od wydajność. Przy tak wielu parametrach bardzo prawdopodobne jest popełnienie błędu (np. Cofnięcie dwóch parametrów tego samego typu). –

+0

http://stackoverflow.com/questions/5727336/performance-variable-argument-methods-in-java, które powinny ci pomóc. –

+1

Proponuję profilowanie różnych aspektów twojej aplikacji, aby zidentyfikować, gdzie właściwie znajdują się szyjki butelek, zanim spróbujesz zoptymalizować. Na przykład wszystko, co wiąże się z dostępem do sieci, źle napisane zapytania do bazy danych itp. – Romski

Odpowiedz

15

Może to nieco poprawić wydajność, ale główną korzyścią będzie zwiększenie czytelności kodu. Konstruktor z 16-25 parametrami nie jest czytelny i bardzo trudny w użyciu.

Oczywiście należy wprowadzić tylko nowe klasy, które mają sens (tj. Parametry są ze sobą powiązane). Nie ma sensu przepychanie 15-26 niepowiązanych parametrów do jednej klasy tylko po to, aby przekazać je konstruktorowi.

+7

Dlaczego uważasz, że poprawiłoby to wydajność? Czy nie tworzysz tylko dodatkowego obiektu? – Keppil

+2

@Keppil Możesz być w stanie stworzyć ten obiekt raz i używać go w wielu miejscach. –

+1

@Keppil No cóż, skopiowanie jednego odwołania zamiast 15-26 w każdym wywołaniu do konstruktora może zrobić małą różnicę. Z drugiej strony utworzenie obiektu zajęłoby trochę czasu. Dlatego napisałem "to może". Jeśli tworzysz tę nową instancję raz i ponownie używasz jej w wielu wywołaniach do innego konstruktora, może to spowodować niewielką poprawę. – Eran

14

Różnice w wydajności wynikające z tego, o ile w ogóle występują, są mało prawdopodobne.

Jeśli Twoim zadaniem jest rozwiązywanie problemów z wydajnością, pierwszą pracą jest zlokalizowanie problemów. Robisz to, profilując aplikację. Czy zrobiłeś to i czy to pokazało, że problem polega na przekazywaniu parametrów?

5

Byłoby dość niezwykłe w nowoczesnym oprogramowaniu mieć 25 luźnych zmiennych na funkcji wywołującej, a następnie przekazać je jawnie do metody lub ctor.

Najczęściej, w projekcie OO, zmienne te byłyby już zapakowane do klasy (lub kilku klas), pogrupowane według ich logicznych obowiązków.

A ponieważ Java przekazuje obiekty przez odniesienie, podanie referencji pojedynczego obiektu na stosie może przynieść pewne korzyści z wydajności (mniej zmiennych do wypchnięcia do stosu). Jednak prawdziwą korzyścią byłaby czytelność kodu i konserwacja.

Należy jednak zauważyć, że wykonanie tej czynności wymagałoby podzielenia klasy obiektu między konsumenta a usługę - może to być problem, w zależności od tego, co model transferu modyfikuje (np. Czy jest to transfer danych Obiekt, jednostka biznesowa, model widoku, obiekt serializacji XML/JSON itp.?). Jeśli dzielenie się typem między dzwoniącym a odwołanym naruszałoby twoją architekturę, zazwyczaj mapujesz 25 zmiennych do innej odpowiedniej klasy kanonicznej (lub klas, ponownie obserwując obawy dotyczące refaktoryzacji SRP) i zamiast tego przekazujesz je (te). W tym momencie nie będzie korzyści z wydajności, ale korzyści z czytelności/konserwacji zostaną zachowane.

0

Jak oops sugerować współpracę wielu właściwości w jednym urządzeniu o nazwie klasy, który jest reprezentowany przez obiekt więc będzie zwiększyć wydajność i gotowość kodu