2012-05-26 18 views
5

Aktualnie pracuję nad aplikacją webową C# MVC REST i próbuję wybrać jedną z dwóch możliwości naszego projektu.C# Static Method vs Object Instance

Bez wchodzenia zbyt głęboko w nasz projekt, zamierzamy mieć klasę dostępu do danych, którą nazwiemy DataSource. Każdy DataSource będzie musiał wykonać małe, zamknięte bloki logiczne, aby poprawnie zbudować odpowiednią odpowiedź. Z powodu chęci do szybkiego ładowania kodu w przyszłości, nie chcemy po prostu mieć tych funkcji na DataSource, zamiast tego chcielibyśmy, aby były dostarczane przez inne zespoły. Mamy dowód na to, że to wdrożone, i jak dotąd, tak dobre.

Co próbuję zdecydować między jest pisanie klasy statycznej z pojedynczą statyczną funkcją ExecuteQuery lub pisanie metody fabryki do tworzenia wystąpień tych klas, które mają metodę instancji o nazwie ExecuteQuery.

Jakie są względy wydajnościowe między tworzeniem wielu obiektów krótkotrwałych dla każdego żądania w porównaniu do wywoływania metod statycznych?

Intuicyjnie metody statyczne byłyby szybsze, ale już się spodziewam, że napotkam trochę bólu głowy, wywołując je przez odbicie (w celu wsparcia wymagającego kodu).

Jeśli nie ma ogromnej kary za obiekty krótkotrwałe, to mogą wygrać tylko w prostocie.

Istotne informacje o naszych oczekiwać obciążenia:

  • Czasy reakcji w 300ms - zakresu 800ms
  • średnie obciążenie około 2000 klientów internetowych
  • obciążenia szczytowego około 4000 klientów
  • Klienci robią zapytania co 2 - 5 sekund
  • Maksymalna stawka klienta 1 zapytanie co sekundę

Ponadto każde z nich tworzyło maksymalnie 8, średnio 3 z tych wystąpień.

+0

Prawdopodobnie twój zamiar użycia odbicia spowoduje większą skuteczność niż użycie statycznego względem instancji. Jak skomentowali inni, powinieneś wybrać formę, która najlepiej nadaje sens. Alternatywnie, ponieważ masz pewne zamierzone metryki, możesz sfałszować implementację statyczną/instancji i zorientować się, na jakie obciążenie napotkasz. –

Odpowiedz

1

Użyj klasy statycznej, która deleguje wywołania do klas implementacji.

Te klasy implementacji powinny implementować wspólny interfejs, który pozwoli na wywoływanie metod na nich bez potrzeby refleksji. Oczywiście metody statyczne nie mogą implementować metod interfejsu. Implementacje interfejsu muszą być instancjami, potrzebujesz instancji do ich utworzenia. Jeśli żyją w zewnętrznych zespołach, zdecydowanie sugeruję przyjrzeć się Managed Extensibility Framework (MEF), zobacz http://msdn.microsoft.com/en-us/library/dd460648.aspx.

Jakie są względy wydajnościowe między tworzeniem wielu obiektów krótkotrwałych dla każdego żądania w porównaniu do wywoływania metod statycznych? Biorąc pod uwagę fakt, że metody te umożliwiają dostęp do danych, implikacje dotyczące wydajności są całkowicie całkowicie i całkowicie pomijalne.

Jeśli używasz MEF, framework stworzy dla Ciebie instancje podobne do singletonów.

Jeśli rolę własną i chcesz usunąć potrzebę wielokrotnego tworzenia tych obiektów, możesz wdrożyć na nich wzór Singleton.

+0

Ja debatowałem na ich temat, ale jeszcze nie podjąłem decyzji. Myślę, że MEF będzie dokładnie tym, czego szukam. Dzięki! –

0

Główna decyzja powinna brzmieć "czy ten obiekt ma stan?"

Jeśli "Nie", to za wszelką cenę uczyń go metodą statyczną.

IMHO .. PSM

+0

Niestety, wymagania dotyczące wszystkich możliwych obiektów nie są jeszcze dostępne, więc chociaż nie sądzę, że będą miały stan, nie mogę być w 100% pewny na tym etapie. –

1

Zakładam każda instancja DataSource uczyni nowego połączenia z bazą danych. Jeśli tak, to miałoby sens mieć tylko jedno wystąpienie. Jedynym sposobem, aby dowiedzieć się, czy "jest to ogromna kara", jest stworzenie makiety obu rozwiązań i profilu oraz sprawdzenie, czy wpływ jest znaczący, czy też nie.

  • Ponieważ nie wydaje się mieć wielu klientów naraz, więc siada również będzie z wzorca Singleton.
  • Nie ma wielu równoczesnych zapytań (głównie z powodu powyższej instrukcji).
  • Masz zdefiniowaną specyfikację czasu reakcji.

Jedyny argument, który mogę zrobić dla wzoru Factory to "prostota". Jeśli projekt jest naprawdę wrażliwy na czas, to myślę, że nie masz wyboru. Ale jeśli naprawdę chcesz wydajności, idź z Singleton.

1

Użyj MEF. Nie musisz wymyślać własnej struktury wtyczek. Poprowadzi Cię do metod instancji wyeksponowanych za pośrednictwem interfejsów. Często zdarza się tworzyć obiekty na żądanie ... struktura MVC robi to wszędzie. Instancje typu "per-request" są szczególnie dobre dla scenariuszy dostępu do danych, dzięki czemu można obsługiwać takie operacje, jak transakcje/wycofywanie zmian, w taki sposób, że doświadczenie jednego użytkownika nie wpływa na innych użytkowników, dopóki nie zostanie jawnie wykonane. W razie potrzeby użyj buforowania odpowiedzi, jeśli perf jest problemem.

+0

To bardzo dobry punkt, nie przyszło mi do głowy, że MVC musi tworzyć wiele obiektów na żądanie. Z pewnością zajrzę do MEF, ponieważ jest to już wspomniane dwa razy i na pobieżne spojrzenie wygląda dokładnie tak, jak chcę. –