2009-06-20 10 views
39

Zawsze podziwiałem oryginalny program uTorrent. Wyglądało świetnie, było mniej niż 64kb, było niezwykle szybkie i miało wszystkie funkcje, których potrzebowałem. Niestety program jest zamknięty źródło (i coraz bardziej nadęty z dnia na dzień), więc przychodzę do Stackoverflow dla inspiracji.Programowanie cienkich programów w C++ (np. UTorrent) dla Windows

Jakie metody zalecają Ci szybkie pisanie szybkich, wydajnych pamięciowo i eleganckich programów w systemie Windows?

Podczas gdy C# (i cała koncepcja .NET) są fajnymi pomysłami, jestem bardziej zainteresowany "purystycznymi" odpowiedziami i wyzwaniem napisania wydajnego, szybkiego oprogramowania dla platformy Windows, podobnie jak oryginalny klient uTorrent. Nie mam nic przeciwko przydzielaniu własnej pamięci, robieniu własnego zbierania śmieci i tworzeniu własnych struktur danych.

Zalecenia dotyczące książek, artykułów, bibliotek, IDE (nawet skuteczne sposoby na zwiększenie kofeiny w moim systemie) mile widziane.

+1

haha, część o kofeinie rozśmieszyła mnie. Cóż, nie wydaje mi się, żebym miał odpowiedź, ale wiem, że póki co hardcorowi purystowie zwrócą się w kierunku montażu, ale programowanie czegoś tak skomplikowanego, jak klient torrenta w montażu, byłoby prawie niemożliwe. Myślę, że jeśli napisałeś swój własny kod (powstrzymałeś się od używania jakichkolwiek bibliotek), możesz łatwo uzyskać program C/C++ poniżej 64kb. Jeśli pisałeś w zespole, prawdopodobnie mógłbyś go ściągnąć poniżej 1kb. – ldog

+0

AFAIK uTorrent jest wyposażony w kompresor, więc jego masa fizyczna jest niewielka. Ale w czasie wykonywania jest dekompresowany i zużywa znacznie więcej pamięci. Mały rozmiar pliku wykonywalnego uzyskuje się przez unikanie korzystania z wielu bibliotek, w szczególności ze standardowej biblioteki C++ i urządzeń strumieniowych, oraz tworzenia zamienników napisanych specjalnie dla tego programu. (zobacz artykuł na Wikipedii) – Vanuan

+0

Vanuan: "dużo więcej pamięci" jest trochę naciągane. Pakiety wykonywalne zazwyczaj osiągają współczynniki kompresji do 50%, niewiele więcej. Tak więc, podczas gdy μTorrent musi zostać rozpakowany w pamięci, aby go uruchomić, zajmie to około 500 KiB. Niewiele dla dzisiejszych maszyn. – Joey

Odpowiedz

17

Biblioteka szablonów systemu Windows jest ukierunkowana na to, co chcesz zrobić. Jest to lekkie, oparte na szablonach opakowanie C++ dla Win32 API. Dzięki niemu nie musisz przechodzić przez ból bezpośredniego kodowania Win32, ale nie dodaje on dużo narzutów, takich jak MFC.

8

Jeśli chcesz zoptymalizować dla najmniejszego możliwego śladu pamięci i nie masz nic przeciwko skakaniu przez kilka kółek, które wymyśliło .NET CLR, aby zająć się tobą, a następnie napisanie bezpośredniej aplikacji Win32API i podpięcie do GDI+ to droga. Petzold było ostatecznym odniesieniem.

Naprawdę, to coś w rodzaju zadania głupiego, ponieważ środowisko wykonawcze .NET będzie ładowane do pamięci systemu operacyjnego, niezależnie od tego, czy aplikacja go używa, czy też nie, więc równie dobrze można do niego linkować.

+0

Methought .NET framework jest ładowany do każdego procesu osobno, w taki sam sposób, jak każdy inny zbiór bibliotek DLL. Czy to się ostatnio zmieniło? –

+8

@Pontus Gagge: Twoje zrozumienie jest nieprawidłowe. Cała idea bibliotek DLL z powrotem w Windows 3.x dni polegały na tym, aby uniknąć ładowania tego samego kodu więcej niż raz do pamięci. Zarówno Win16, jak i Win32 dzielą kod DLL pomiędzy procesy (choć poprzez różne mechanizmy). Biblioteki DLL pojawiają się w każdej przestrzeni adresowej procesu dzięki magii pamięci wirtualnej, ale w rzeczywistości istnieje tylko jedno wystąpienie kodu DLL w pamięci. –

+1

.NET nadal ponosi nakład na pamięć ze względu na automatyczne zarządzanie pamięcią. Dlaczego warto korzystać z GDI +, chyba że chcesz coś narysować (powoli)? – Joey

5

Ogólne: dla mniejszych plików wykonywalnych #define WIN32_LEAN_AND_MEAN i VC_EXTRALEAN (przy założeniu VS). Nie kompiluj z symbolami debugowania (prawdopodobnie to wiedziałeś). Użyj mniejszej liczby bibliotek i poproś użytkownika, aby łączył tylko części bibliotek, których potrzebujesz (linker VC jest całkiem niezły, ale nie dotykaj optlink, jeśli możesz pomóc).

Usunąć nagłówki relokacji: Przejdź do http://www.paehl.de/cms/oldtools i wyszukaj "ReduceEXE" (bezpośredni link do pobrania: http://www.paehl.de/reduce.zip).

Uruchom plik wykonywalny: http://upx.sourceforge.net/ ... Wykorzystuje więcej pamięci w środowisku wykonawczym i uruchamia się nieco wolniej, ale plik jest DUŻO mniejszy.

Jeśli zależy ci na rozmiarze pliku większym niż szybkość, VC ma opcję "optymalizacji pod kątem rozmiaru", co wyłącza pewne funkcje, takie jak rozwijanie pętli i inling funkcji.

Jeśli chcesz przejść do trybu Hardcore (i nie przejmuj się wszystkimi zaletami inżynierii oprogramowania), spróbuj użyć mniejszej liczby klas, zamiast tego preferuj typy POS bez funkcji wirtualnych. Wikipedia sugeruje, że 6-13% czasu wykonania programu spędza na wykonywaniu połączeń wirtualnych. Ponadto, vtables same pobierają (LITTLE) pamięć, a size_t wartośc pamięci na początku każdej instancji klasy (która ma funkcję wirtualną) jest przydzielana dla wskaźnika vtable. IOW, "czysty C" może być nieco szybszy (jeśli jednak emulujesz klasy za pomocą wskaźników funkcji, wróć do C++).

+0

"Nie kompiluj z symbolami debugowania" - symbole debugowania są tworzone w zewnętrznym pliku PDB. Nie ma absolutnie żadnego powodu, aby nie generować ich nawet dla wersji wydań (patrz http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/06/19/do-pdb-files-affect-performance.aspx) "Jeśli zależy Ci na rozmiarze pliku większym niż szybkość, VC ma opcję" optymalizacji pod kątem rozmiaru "" - to w rzeczywistości często zmienia się w szybkość pracy - mniejszy rozmiar powoduje mniejszy brak pamięci podręcznej i błędy stronicowania. –

+3

@Nowy Freund - Niekoniecznie - Nie wspomniał konkretnie o VC++. VC implementuje informacje debugowania jako PDB, jednak jeśli kompilujesz z, powiedzmy DMC lub MinGW GCC, informacja o debugowaniu jest zawarta w plikach obiektowych. –

7

The Demo Scene to grupa ludzi, którzy spędzają wolny czas próbując tworzyć imponujące i bardzo małe pliki wykonywalne, które zwykle renderują coś w 3d do muzyki. Często całe demo (kod, muzyka, dane 3D) kompiluje się w jeden plik wykonywalny, który jest skompresowany do 64k lub imponująco mały rozmiar dla treści.

Możesz czerpać inspirację z pokazów i poznawać, jak są tworzone, poinformuje twoją obsesję o tworzeniu małych plików wykonywalnych.

Często kluczem jest wykorzystanie jak największej liczby bibliotek DLL zewnętrznych, które są instalowane z oknami. Wymagane jest również niskie, niestandardowe kodowanie wszystkiego.

10

uTorrent jest napisany w C++ i używa staroświeckiego Win32 API. Google Chrome jest również napisany w ten sposób, więc dlaczego nie pobrać kodu źródłowego i nie uczyć się z jego kodu?

+1

tak, zgadzam się z tobą. spróbuj nauczyć się Win32 API, a następnie możesz stworzyć małą i szybką aplikację. w przeszłości korzystałem z Delphi, mogłem również tworzyć małe aplikacje i bardzo łatwo się go nauczyć (język Pascal) – nightingale2k1

+0

+1 dla Pascala;) –

1

Notepad++ to również bardzo szybki, wysoce zoptymalizowany i bardzo przydatny program, który może zainspirować twoją inspirację. Jego filozofia jest podobna do filozofii uTorrent. Używa starego, dobrego api-a Win32, który powinien być najszybszy, aby przejść do wersji w systemie Windows.

Jeśli chcesz zagrać naprawdę artystycznie, scena demo to idealne miejsce na . Chociaż ich kod nie zawsze jest otwarty.

+1

Nie można w pełni zgodzić się z "Notepad ++ jest bardzo szybki, wysoce zoptymalizowany" . Czasami na dużych plikach jest wystarczająco wolny. A ostatnie wydania były trochę błędne. Kolejny lite i szybki edytor to AkelPad - http://akelpad.sf.net/ (Jest to ~ 100k w zapakowanym exe i ~ 250K w spakowanych wtyczkach) – zxcat

5

Stara sztuczka "LIBCTiny" nadal działa. W nowoczesnych wydaniach VC++ może być konieczne włączenie kilku funkcji.

Kolejną dobrą rzeczą, którą należy wiedzieć, jest zbiór funkcji dostępnych w jądrze Kernel32 lstr*. To już jest w pamięci, więc te funkcje mogą być mniejszym wyborem.

Powiązane problemy