2012-08-01 12 views
5

Mam Mini-Profiler zainstalowany na nowej stronie MVC4 i zauważam duży czas oczekiwania na pewne Find: DisplayTemplates, w tym String i DateTime. Poniżej znajduje się przykład. W innym pytaniu, Sam Saffron powiedział o krok findZnajdź: DisplayTemplates Speed ​​

Na kolejnych przebiegów jest błyskawiczne (chyba że masz coś naprawdę złego dzieje)

Ale dodaje się dzieje na każdej stronie obciążenia:

http://localhost:80/SLS.Site/s/hogwarts/lunch...  2.6 +0.0 
    Check School Permissions       2.4 +2.0  1 sql 0.9 
    Controller: SchoolAdmin.LunchGroupsController... 4.0 +4.5 
    Find: Index          0.4 +8.6 
    Render : Index         70.0 +9.1  2 sql 13.0 
    Controller: SchoolAdmin.LunchGroupsController... 2.6 +12.3 
    Find: BuildingTree        0.4 +14.9 
    Render partial: BuildingTree      4.4 +15.4 1 sql 3.2 
    Controller: SchoolAdmin.LunchGroupsController... 3.3 +20.2 
    Find: Teachers         0.6 +23.6 
    Render partial: Teachers       4.3 +24.3 1 sql 2.4 
    Find: DisplayTemplates/String     409.3 +31.9 
    Render partial: _UserContext      0.0 +441.3 
    Find: _LoginPartial        1.2 +441.4 
    Render partial: _LoginPartial      0.2 +442.6 
                    3.9 % in sql 

Jakieś myśli?

Edit

miałem 4 obszarów konfiguracji, więc pomyślałem, że była przemierzając wszystkie katalogi w poszukiwaniu meczu, więc usunąłem 2 obszarów i mają takie samo zachowanie.

+0

Po prostu wykonałem test po podobnym problemie.Wydaje się, że znaczna część pracy jest odkładana do pierwszego połączenia z DisplayFor, więc czas się nadęty. –

Odpowiedz

2

Po umieszczeniu bloku profilowania wokół wiązek w <head> mogłem zobaczyć, gdzie naprawdę spędził czas. Mini-profiler wprowadzał mnie w błąd, pierwotnie: czas był nie spędzony w DisplayTemplates/String, ale gdzie indziej!

W moim przypadku opóźnienie miało miejsce w pakiecie skryptowym MVC4 RC.

Usunąłem tobołki i wszystko jest w porządku.

zobacz sekcję problem poniżej:

MVC4 RC script bundling very slow

+1

Ważne jest, aby problem mógł być związany z czymś innym niż DisplayFor. Problem z wydajnością, którego szukałem, to wyszukiwanie AD dla każdego elementu w naszym menu. Kluczową lekcją z tej odpowiedzi jest poszerzenie wyszukiwania, inaczej domyślna kategoryzacja MiniProfilera może sprowadzić Cię na manowce. –

3

miałem dokładnie ten sam problem ... po jakimś wyszukiwanie wokół znalazłem używałem:

@DisplayFor(x => x.StringProperty);

Po tym myśleć i dowiedzenie się, jak wszystkie metody DisplayFor/EditorFor działają od samego tworzenia szablonów, nie miało to sensu.

(Trochę wyjaśnienia, w jaki sposób Displayfor/EditorFor działa)

Podczas korzystania Displayfor/edytor, MVC dostaje type obiektu, a następnie przeszukuje katalog Views/ControllerName/DisplayTemplates dla widoku o tej samej nazwie jak ten type, w tym przypadku wyszukuje Views/ControllerName/DisplayTemplates/String.cshtml. Ponieważ nie istnieje, robi to samo w katalogu widoków Shared/DisplayTemplates, znowu nie będzie istnieć.

(To następny bit jest spekulacja)

Chciałbym założyć, że ponieważ nie może znaleźć odpowiedni szablon Wyświetlacz/redaktor, to wtedy wykonuje toString() na obiekcie, jako awaryjna.

Jak jesteś tylko wyświetlanie String wpisać tak, że to ma sens, aby nie używać DisplayFor(x => StringProperty) i po prostu użyć @Model.StringProperty, który nie spowoduje MVC aby wyszukać DisplayTemplate, i po prostu uczynić go jako ciąg znaków, który to będzie i tak zrobić.

+3

Szkoda, że ​​nie jest to przyjęta odpowiedź, ponieważ jest to dobra rada. Pliki 'Find: DisplayTemplates' są bardzo powolne i jeśli nie wykonujesz skomplikowanych renderingów szablonowych, używaj bezpośrednio wartości z modelu. Unikaj 'Html.DisplayFor' jak zarazy. – Jez

+2

Pozdrawiam - Dobre umiejętności na 'Html.DisplayFor ', Widziałem tam również kilka problemów z szybkością! Jak mówisz, unikaj tego, chyba że używasz własnych szablonów! –