Piszę do menedżera renderowania siatki i pomyślałem, że dobrym pomysłem byłoby zgrupowanie wszystkich siatek, które używają tego samego modułu cieniującego, a następnie renderowanie ich, gdy jestem w tej przepustce do cieniowania.
Obecnie używam foreach
pętli, ale zastanawiałem się, czy użycie LINQ może dać mi wzrost wydajności?
c#
performance
linq
foreach
Neil Knight
źródło
źródło
Odpowiedzi:
Dlaczego LINQ powinien być szybszy? Używa również pętli wewnętrznie.
W większości przypadków LINQ będzie nieco wolniejszy, ponieważ wprowadza narzut. Nie używaj LINQ, jeśli zależy Ci na wydajności. Użyj LINQ, ponieważ potrzebujesz krótszego, bardziej czytelnego i łatwego w utrzymaniu kodu.
źródło
LINQ-to-Objects generalnie doda pewne marginalne narzuty (wiele iteratorów itp.). Nadal musi zrobić pętle, i ma powołuje delegata i generalnie trzeba zrobić kilka dodatkowych dereferencing dostać na przechwyconych zmiennych itd. W większości kodu będzie to praktycznie niewykrywalne, a więcej niż zapewniana przez prostsze do zrozumienia kodu.
Z innych dostawców LINQ jak LINQ-SQL, a następnie od kwerendy można filtrować na serwerze powinno być znacznie lepiej niż mieszkania
foreach
, ale najprawdopodobniej nie zrobiłby koc"select * from foo"
i tak , więc nie jest to koniecznie uzasadniona porównanie.Re PLINQ; równoległość może skrócić czas, który upłynął , ale całkowity czas procesora zwykle nieco wzrośnie ze względu na narzuty związane z zarządzaniem wątkami itp.
źródło
List<Foo>
; zamiast tego powinienem użyćforeach
bloku na tych kolekcjach. Rekomendacja użyciaforeach
w tych kontekstach ma sens. Mój problem: czy powinienem zastępować zapytania LINQ tylkoforeach
wtedy, gdy wykryję problem z wydajnością? Idąc dalej, rozważęforeach
pierwszy.Myślę, że LINQ lepiej jest używać w
foreach
pętli, ponieważ zapewnia znacznie czystszy i łatwy do zrozumienia kod. Ale LINQ jest wolniejszy niżforeach
. Aby uzyskać więcej, przeczytaj artykuł LINQ vs FOREACH vs FOR Loop Performance .źródło
LINQ jest teraz wolniejszy, ale w pewnym momencie może stać się szybszy. Zaletą LINQ jest to, że nie musisz przejmować się tym, jak to działa. Jeśli zostanie wymyślona nowa metoda, która jest niewiarygodnie szybka, ludzie w firmie Microsoft mogą ją wdrożyć, nawet nie mówiąc Tobie, a Twój kod byłby znacznie szybszy.
Co ważniejsze, LINQ jest po prostu znacznie łatwiejszy do odczytania. To powinien być wystarczający powód.
źródło
Należy prawdopodobnie zauważyć, że
for
pętla jest szybsza niżforeach
. Tak więc w przypadku oryginalnego postu, jeśli martwisz się o wydajność krytycznego komponentu, takiego jak renderer, użyjfor
pętli.Odniesienie: W .NET, która pętla działa szybciej, „for” czy „foreach”?
źródło
Możesz uzyskać wzrost wydajności, jeśli używasz równoległego LINQ dla wielu rdzeni. Zobacz Parallel LINQ (PLINQ) (MSDN).
źródło
Zainteresowało mnie to pytanie, więc przed chwilą zrobiłem test. Korzystanie z .NET Framework 4.5.2 na procesorze Intel (R) Core (TM) i3-2328M @ 2,20 GHz, 2200 MHz, 2 rdzenie z 8 GB pamięci RAM i systemem Microsoft Windows 7 Ultimate.
Wygląda na to, że LINQ może być szybsze niż dla każdej pętli. Oto wyniki, które otrzymałem:
Byłoby interesujące, gdyby niektórzy z was mogli skopiować i wkleić ten kod w aplikacji konsolowej i również przetestować. Przed testowaniem na obiekcie (pracownik) wykonałem ten sam test z liczbami całkowitymi. LINQ również tam był szybszy.
źródło
Exists=True Time=184 Exists=True Time=135
to na laptopie Apache Gaming (Win 10, C # 7.3). Skompilowany i uruchomiony w trybie debugowania. Jeśli odwrócę otrzymane testyExists=True Time=158 Exists=True Time=194
. Wydaje mi się, że Linq jest bardziej zoptymalizowany.W rzeczywistości jest to dość złożone pytanie. Linq bardzo ułatwia pewne rzeczy, więc jeśli zaimplementujesz je sam, możesz się o nie potknąć (np. Linq .Except ()). Dotyczy to w szczególności PLinq, a zwłaszcza agregacji równoległej wdrożonej przez PLinq.
Ogólnie rzecz biorąc, dla identycznego kodu linq będzie wolniejsze ze względu na narzut wywołania delegata.
Jeśli jednak przetwarzasz dużą liczbę danych i stosujesz stosunkowo proste obliczenia do elementów, uzyskasz ogromny wzrost wydajności, jeśli:
Używasz pętli for, aby uzyskać dostęp do każdego elementu (w przeciwieństwie do foreach lub linq).
źródło