dotnetomaniak.pl

Strona głównaUżytkownik

pzielinski | użytkownik

pzielinski
pzielinski
27 178,29
1957 dni, 12 godzin, 5 minut temu
21 lutego, 2010
dotnetomaniak.pl

Chciałbym rozpocząć nowy cykl na blogu, tym razem o PLINQ.  Dzisiaj zaczniemy od podstaw czyli czym jest LINQ oraz kiedy z niego korzystać. PLINQ to skrót od Parallel Linq czyli są to zapytania wykonywane równolegle. W dzisiejszym świecie, programiści starają się zrównoleglić co tylko jest możliwe. Samodzielne pisanie LINQ w sposób równoległy jest dość niewygodne i dlatego Microsoft wprowadził PLINQ. Należy oczywiście zawsze pamiętać, że próba zrównoleglenia operacji, które muszą po prostu zostać wykona...

Tagi: Linq, Parallel, PLINQ
Dziel się z innymi:
Piotr Zieliński » PLINQ – wprowadzenie

Sztuka programowania 2126 dni, 21 godzin, 43 minuty temu pzielinski 218 rozwiń

Wielokrotnie pisałem o różnych metodach definiowania sekcji krytycznej w kodzie. Do dyspozycji mamy spinning, który nie usypia wątku. Tak naprawdę dla systemu Windows, taki wątek wciąż istnieje i wykonuje pracę – innymi słowy marnuje  czas CPU. Jeśli chcemy zatrzymać wątek na krótko wtedy jest to bardzo wydajne ponieważ nie musimy zmieniać kontekstu (BARDZO kosztowne), korzystać z funkcji Windows (spinning to czysta metoda .NET) czy planować (scheduling) następnych wątków. Jeśli mechanizmy takie jak spin...

Dziel się z innymi:
Piotr Zieliński » Wydajność: spinning a synchronizacja kernel

Sztuka programowania 2128 dni, 20 godzin, 54 minuty temu pzielinski 80 rozwiń

Operacje na plikach mogą być bardzo czasochłonne. Z tego względu, dobrym zwyczajem jest umieszczenie kodu w osobnym wątku. Często popełnianym błędem jest samodzielne tworzenie wątku:internalstaticclass Sample { publicstaticvoid Main() { var reader =new FileStream(@"c:\setup\1.txt", FileMode.Open); Task.Factory.StartNew(()=>ReadAsync(reader)); } privatestaticvoid ReadAsync(Stream reader) { byte[]buffer=newbyte[100]; reader.Read(buffer, 0, 100); reader.Clos...

Dziel się z innymi:
Piotr Zieliński » Code Review: Asynchroniczne strumienie danych

Sztuka programowania 2131 dni, 18 godzin, 41 minut temu pzielinski 161 rozwiń

Kolejna część cyklu – zapraszam do lektury: http://msdn.microsoft.com/pl-pl/library/optymalizacja-kodu-c-sharp–czesc-3

Tagi: wydajność
Dziel się z innymi:
Piotr Zieliński » Artykuł- Optymalizacja kodu C# – część III

Sztuka programowania 2134 dni, 19 godzin, 49 minut temu pzielinski 212 rozwiń

W celu optymalizacji każdy procesor posiada swój cache. Temat jest dosyć rozbudowany bo zwykłe cache jest podzielony na kilka warstw aby przyśpieszyć dostęp do niego. W dzisiejszym w poście chciałbym wprowadzić pojęcie cache line co jest tak naprawdę po prostu wpisem w pamięci podręcznej. Jeśli procesor czyta jakieś dane to umieszcza je w cache line. Cache line to nie tylko jedna, pojedyncza zmienna a na przykład 64 bajty. Jeśli zatem czytamy pojedynczą zmienną Int32,  w rzeczywistości procesor przeczyta...

Dziel się z innymi:
Piotr Zieliński » CPU, caching a wydajność.

Sztuka programowania 2138 dni, 4 godziny, 55 minut temu pzielinski 196 rozwiń

Czasami zachodzi potrzeba serializacji obiektów, które powinny mieć  maksymalnie jedną kopie w tym samym AppDomain. Klasycznym przykładem jest System.DBNull, którego deklaracja wygląda następująco:[SerializableAttribute] [ComVisibleAttribute(true)] publicsealedclass DBNull : ISerializable, IConvertible Załóżmy, że mamy klasę, w której jedna z właściwości ma wartość System.DBNull. Oczywiście podczas serializacji i potem deserializacji nie chcemy tworzyć nowej instancji DBNull – jest to sprzeczne z ...

Dziel się z innymi:
Piotr Zieliński  » Blog Archive   » Serializacja obiektów typu singleton\NULL object

Sztuka programowania 2141 dni, 4 godziny, 18 minut temu pzielinski 104 rozwiń

Załóżmy, że mamy następujący kod:[Serializable] class Person { publicstring Name { get; set; } } Atrybut Serializable mówi, że będzie wspierana serializacja za pomocą IFormatter (np. BinaryFormatter). Jeśli chcemy wspierać ten mechanizm, zawsze powinniśmy tworzyć jawnie backing-field. Kompilator w końcu może wygenerować tak naprawdę dowolną nazwę. Zajrzyjmy do Reflector, aby zobaczyć jak wygląda wewnętrzna struktura:   Wygenerowane pole to:[CompilerGenerated] privatestring

Tagi: serializacja
Dziel się z innymi:
Piotr Zieliński » Code Review: serializacja a właściwości

Sztuka programowania 2143 dni, 17 godzin, 22 minuty temu pzielinski 143 rozwiń

W celu wykonania jakiegoś kodu za pomocą refleksji, należy najpierw zebrać informację o danym polu. Załóżmy, że mamy następującą klasę:class Sample { publicvoid PrintSomething() { Console.WriteLine("Something"); } } W celu wykonania metody za pomocą refleksji można:object sample =new Sample(); MethodInfo info=sample.GetType().GetMethod("PrintSomething"); info.Invoke(sample, null); Generalnie obiekty takie jak MemberInfo czy MethodInfo pożerają mnóstwo pamięci – są one dość ciężk...

Tagi: refleksja
Dziel się z innymi:
Piotr Zieliński » Reflection: optymalizacja MemberInfo

Sztuka programowania 2145 dni, 20 godzin, 15 minut temu pzielinski 125 rozwiń

GC nic nie wie o zasobach niezarządzanych. Nie wie ile pamięci one zajmują oraz oczywiście nie jest w stanie zwolnić takich zasobów. O zarządzaniu taką pamięcią pisałem już wiele razy. Opisywałem również zasadę działania GC. Zwykle jest on odpalany po przekroczeniu pewnego progu zużycia pamięci. Niestety, jak wspomniałem, GC nie wie nic o niezarządzanych zasobach. Co w przypadku gdy wrapper zużywa bardzo mało pamięci a zasoby niezarządzane w nim konsumują bardzo wiele pamięci? Dzięki metodom AddMemoryPre...

Dziel się z innymi:
Piotr Zieliński » Zasoby niezarządzane, optymalizacja GC

Sztuka programowania 2149 dni, 17 godzin, 34 minuty temu pzielinski 133 rozwiń

Czasami zachodzi potrzeba wykonania krytycznego kodu, który zużywa dużo zasobów. Podobnie jak w CER, nie chcemy wykonywać kodu jeśli wiemy, że nie ma wystarczającej pamięci. W .NET istnieje klasa MemoryFailPoint, która potrafi z góry “zaalokować” określoną pamięć.publicsealedclass MemoryFailPoint : CriticalFinalizerObject, IDisposable { public MemoryFailPoint(Int32 sizeInMegabytes); ~MemoryFailPoint(); publicvoid Dispose(); } MemoryFailPoint sprawdzi czy jest dostępna pamięć. Jeśli jej nie...

Dziel się z innymi:
Piotr Zieliński » MemoryFailPoint: alokowanie dużej ilości pamięci

Sztuka programowania 2154 dni, 11 godzin, 33 minuty temu pzielinski 98 rozwiń

W ostatnim poście pisałem jak prawidłowo wykonać finalizację obiektu jeśli mowa o zasobach niezarządzanych, których zwolnienie jest krytyczne. Dzisiaj o obiekcie, który jest bardzo często wykorzystywany w sytuacjach gdzie należy przechowywać wskaźnik do zasobów niezarządzanych. Zacznijmy od jego definicji:[SecurityPermissionAttribute(SecurityAction.InheritanceDemand, UnmanagedCode =true)] publicabstractclass SafeHandle : CriticalFinalizerObject, IDisposable Co to oznacza? Wszystkie rzeczy jakie daje n...

Dziel się z innymi:
Piotr Zieliński » Obiekt SafeHandle

Sztuka programowania 2160 dni, 17 godzin, 31 minut temu pzielinski 102 rozwiń

Funkcja Array.Sort sortuje tablicę elementów. Niestety algorytm jest niestabilny co nie zawsze jest dobrym rozwiązaniem. Rozważmy poniższy kod:publicclass Person { publicint Age { get; set; } publicstring Name { get; set; } } internalclass Program { publicstaticvoid Main() { var persons =new[] { new Person { Age =1, Name ="a" }, new Person { Age =2, Name ="b" }, new Person { Age =3, Name ="c" }, new Person { Age =2, Name ="e" }, new Person { Age =1,...

Tagi: sortowanie
Dziel się z innymi:
Piotr Zieliński » Array.Sort a stabilność sortowania

Sztuka programowania 2161 dni, 4 godziny, 37 minut temu pzielinski 134 rozwiń

O destruktorach pisałem już kilka razy na blogu. W wielkim skrócie – zawsze należy przemyśleć decyzje o implementacji Finalize ponieważ wiąże to się z spadkiem wydajności (obiekt może być nawet “wypromowany” do drugiej generacji GC). Czasami jednak zachodzi taka potrzeba – głównie w przypadku użycia niezarządzanych zasobów. CriticalFinalizerObject daje nam jeszcze kilka dodatkowych gwarancji. Przed przeczytaniem tego wpisu, polecam zapoznanie się z poprzednim postem o CER. Co zatem da nam dziedziczenie ...

Dziel się z innymi:
Piotr Zieliński » Implementacja Finalize oraz CriticalFinalizerObject

Sztuka programowania 2163 dni, 4 godziny, 24 minuty temu pzielinski 81 rozwiń

Kolejna cześć artykułu o wydajności w C#. Zapraszam do lektury!

Dziel się z innymi:
Piotr Zieliński » Optymalizacja kodu C# – część II

Sztuka programowania 2164 dni, 2 godziny, 32 minuty temu pzielinski 187 rozwiń

Z pewnością każdy z Was odpowiedziałby, że pisze solidny kod. Oczywiście zależy to od przyjętych metryk i definicji “solidny kod”. Nie zawsze warto skupiać uwagę na drobiazgach  i pułapach, których jest na prawdę wiele. Czasami jednak jest to konieczność, głównie w aplikacjach serwerowych, które muszą działać, nawet, gdy dostarczone dane są np. nieprawidłowe. W przypadku awarii, niedopuszczalne jest wtedy zepsucie stanu aplikacji. Rozważmy, taką sytuację:try { // jakaś logika} catch(IOException e) { ...

Tagi: CER, solidny kod
Dziel się z innymi:
Piotr Zieliński » Pisanie solidnego kodu: Constrained Execution Regions (CERs)

Sztuka programowania 2168 dni, 23 godziny, 43 minuty temu pzielinski 185 rozwiń

Zadanie jest następujące. Mamy w pliku tekstowym dane zawierające m.in datę  z góry w zdefiniowanym formacie a mianowicie 2012/10/05 (piąty październik 2012). Dla uproszczenia, ograniczymy się tylko do dnia, miesiąca i roku, bez czasu. Pierwsze podejście, najgorsze mogłoby wyglądać następująco:string timestamp =""; DateTime dateTime = DateTime.Parse(timestamp); Console.WriteLine(dateTime); Dlaczego jest to niepoprawne? W niektórych ustawieniach regionalnych (np. USA) format jest następujący “yyyy/dd/M...

Tagi: DateTime
Dziel się z innymi:
Piotr Zieliński » Code Review: Parsowanie daty

Sztuka programowania 2169 dni, 23 godziny, 13 minut temu pzielinski 196 rozwiń

Rozpocząłem pisanie nowego cyklu artykułów, tym razem o wydajności w C#. Pierwsza część właśnie została opublikowana i zawiera przede wszystkim wprowadzenie do tematu oraz kilka konkretnych przykładów. Kolejne części już wkrótce i będą prezentowały poszczególne konstrukcje w C#. Na blogu już pisałem niejednokrotnie o wydajności w C#, ale artykuł oprócz tego co już tutaj zostało napisane, zawiera dodatkowe informacje i przykłady. Dla tych co nie czytali blog’a myślę, że taki cykl stanowi po prostu kompend...

Dziel się z innymi:
Piotr Zieliński » Artykuł: Optymalizacja kodu C# – część I

Sztuka programowania 2173 dni, 16 godzin, 45 minut temu pzielinski 323 rozwiń

Opisywałem już mechanizm konwersji zdarzeń .NET do IObservable. W RX istnieje dodatkowo nowy mechanizm, mający na celu zastąpić standardowe zdarzenia  .NET – przynajmniej w części przypadków. Zastanówmy się, co jest złego tak naprawdę w obsłudze zdarzeń w .NET? 1. Dość często programiści zapominają usunąć zdarzenie co może skutkować memory leak. Czasami jest ciężko zdefiniować moment, w którym należy usunąć zdarzenie. Pewnym rozwiązaniem problemu może być zastosowanie wzorca weak event pattern ale jak w...

Dziel się z innymi:
Piotr Zieliński » Reactive Extensions: Zdarzenia w RX

Sztuka programowania 2180 dni, 3 godziny, 15 minut temu pzielinski 41 rozwiń

Kilka postów wcześniej, pokazałem jak narysować linię za pomocą RX oraz przechwytywania zdarzeń. Dla przypomnienia udało nam się narysować prostą linie z punktu (0,0) do aktualnej pozycji kursora:publicclass MyCanvas : Canvas { private Point _endPoint; public MyCanvas() { var eventsSource = Observable.FromEventPattern

Dziel się z innymi:
Piotr Zieliński » Reactive Extensions: TakeUntil, Repeat, dalsza cześć przykładu obsługi zdarzeń

Sztuka programowania 2180 dni, 3 godziny, 15 minut temu pzielinski 30 rozwiń

W dzisiejszym wpisie znów wracamy do tematu RX. Postaram się wyjaśnić jak można ze sobą połączyć kilka IObservable. W RX istnieje naprawdę wiele metod umożliwiających wykonanie tego i na początku może wydawać się to dość skomplikowane, ze względu na liczbę sposobów w jaki można to wykonać. 1. Observable.Amb – zawsze zwraca wyłącznie tą sekwencje, która została jako pierwsza wygenerowana. Jeśli zatem mamy MouseMove i MouseUp wtedy zostanie zwrócone te zdarzenie, które jako pierwsze miało miejsce. Przykł...

Tagi: Rx
Dziel się z innymi:
Piotr Zieliński » Reactive Extensions: Scalanie źródeł danych

Sztuka programowania 2182 dni, 3 godziny, 1 minutę temu pzielinski 37 rozwiń

1 2 3 4 5 6 7... 19 20