2012-08-16 11 views
16

Sprawdzam, ile czasu potrzeba na wykonanie danej operacji. Operacja jest tak:Aplikacja działa szybciej z analizą wydajności studia wizualnego

Parallel.ForEach(items, item => SaveScheme(item)); 

Sposób SaveScheme współpracuje z bazą danych: wykonuje kilka zapytań i współpracuje z informacji. Ilość elementów w kolekcji items może być wystarczająco duża.

Po uruchomieniu tej operacji ukończenie jej zajmuje około 20-40 sekund. Ale kiedy uruchomię go z włączonym profilowaniem, zajmuje to tylko 3 sekundy!

Nie znalazłem żadnych informacji na temat tego problemu. Przypuszczam tylko, że dzięki profilowaniu Parallel.ForEach tworzy więcej wątków niż bez niego, ale nie wiem na pewno, a nawet jeśli to prawda, nie wiem, co z tym zrobić.

Dlaczego tak się dzieje i jak mogę archiwizować tę wydajność, gdy uruchamiam aplikację bez profilowania?


UPD. Parallel nie ma nic wspólnego z tym: testowałem z prostym foreach, a operacja nadal kończy się w 3 sekundy!

+0

hmm Dziwne, faktycznie spowolni ... – Anuraj

+0

Czy próbowałeś wizualizatora Concurrency? – h1ghfive

+0

Próbowałem Wizualizatora Concurrency, ale to, co tam zobaczyłem, nic mi nie mówi. Wiem, ile wątków jest i tak dalej, ale bez profilera nie wiem, co się stanie, gdy operacja zajmie 40 sekund. Więc nie mogę tego porównać. – STiLeTT

Odpowiedz

30

znalazłem odpowiedź:

Powodem jest to, ponieważ po uruchomieniu aplikacji w programie Visual Studio , debugger jest z nim związane. Po uruchomieniu go przy użyciu profilera debugger nie jest dołączony.

Jeśli spróbuj uruchomić plik .exe przez siebie, lub uruchamiając program poprzez IDE z „Debug> Start Without Debugging” (lub po prostu naciśnij Ctrl + F5) aplikacja powinna działać tak szybko, jak to robi z profiler.

https://stackoverflow.com/a/6629040/1563172

nie znalazłem go wcześniej, bo myślałem, że powodem jest współbieżności.

+0

Pamiętaj, że jeśli chcesz uruchamiać skrypty w konsoli interaktywnej (np. W celu uzyskania korzyści z IPythona), możesz odłączyć debugger za pomocą Python Tools -> Interactive Okno -> odznacz "Włącz dołączanie do okna interaktywnego" i uzyskaj taką samą prędkość. – Leo

0

może być, że w profilowaniu zostały spowolnione (i zmniejszyło współbieżność) rzeczywistej generacji roboczej bazy danych, które zostały skutecznie przepustnicy samego wąskiego gardła - tak baza danych (lub ....).

+0

Uaktualniłem pytanie - współbieżność nie jest powodem ... – STiLeTT

0

Wynik ten sugeruje, że aplikacja jest chyba stara się być zbyt współbieżne: twoje wątki są w rzeczywistości uzyskiwanie w sposób eachothers' lub napowietrznej tworzenia wątków jest większa niż jakikolwiek przyrost wydajności. Dowodem na to jest fakt, że twoja wersja nie współbieżna działa szybciej!

Użycie profilera wpłynie na wydajność aplikacji; być może spowalnia twój kod na tyle, że uzyskasz pewną korzyść z wielu wątków.

Bez większej szczegółowości kodu za twoją metodą wydaje się, że jest to najbardziej prawdopodobna odpowiedź.

Powiązane problemy