2011-12-21 11 views
5

Jak wszyscy wiemy, w oprogramowaniu można zadawać bardzo ambitne rzeczy związane z technologią.Uruchamianie zadania obciążającego procesor/pamięć - jakie podejście do kodowania jest najbardziej wydajne?

Ostatnio zapytano mnie o najszybszy sposób konwersji 4000 dokumentów z word na pdf. Kod/oprogramowanie do konwersji jest na miejscu i działa na dedykowanym serwerze, więc sprzęt również tam jest (to jest powtarzające się zadanie). Ale z perspektywy wydajności C#, jaki jest najlepszy sposób na zrobienie tego?

Ciągle myślę o tym, aby podzielić je na kawałki (tj. 40 dokumentów) i przekonwertować je (tj. 40 unikatowych dokumentów x 1000 zadań parellelowych), które działają w tym samym czasie. Czy to jest właściwy pomysł, pod względem wydajności? Najprostszy (i najdłuższy) to seryjna pętla, która przechodzi przez każdy dokument.

Co byś polecił? Nie ma ograniczeń językowych, więc C# 4.0, LINQ itd. Są dostępne.

+1

Czy wiesz, jakie byłyby wąskie gardła? IO? PROCESOR? Pamięć? – Oded

+5

Nie ma sensu mówić o optymalizacjach, chyba że masz * zmierzone * i dokładnie wiesz, gdzie jest wąskie gardło. – Jon

+0

To byłaby pamięć, kiedy widziałem uruchamiane zadanie (I dysk). Proces nie je CPU. – dotnetdev

Odpowiedz

2

1000 równoległych zadań? Chcesz jednocześnie uruchomić 1000 wątków? Spędzasz więcej czasu na przełączaniu wątków niż na rzeczywistej pracy. Jeśli masz czterordzeniowy komputer, powinieneś uruchomić cztery wątki, z których każdy konwertuje pojedynczy dokument na raz.

Najprawdopodobniej najlepszym sposobem na rozpoczęcie jest użycie prostego Parallel.ForEach i niech biblioteka środowiska uruchomieniowego przejmuje się planowaniem zadań. Coś jak:

List<string> DocumentsToConvert = new List<string>(); 
// here, load the file names of all the documents you want to convert. 
// Then, process them with: 
Parallel.Foreach(DocumentsToConvert, (doc) => { ConvertDocument(doc); }); 

Można zrobić tego samego rodzaju rzeczy z OC i zadań:

foreach (var doc in DocumentsToConvert) 
{ 
    // Create and start a task to convert that document 
} 

W każdym razie, niech postać biblioteki wykonawcze, jak wiele zadań do wykonania równolegle.

+0

Czy mógłbyś rozwinąć swoje drugie podejście: "Możesz zrobić to samo z TPL i zadaniami:". Nie widzę, jaki kod będzie następował (nieobeznany z TPL i co można z nim zrobić) – MedicineMan

+0

@MedicineMan: Zobacz http://msdn.microsoft.com/en-us/library/dd460717.aspx. w tym przypadku "Parallel.ForEach" jest prawdopodobnie lepszym rozwiązaniem. –

2

Zrób trzy dokumenty i przetwarzaj je sekwencyjnie. Weź średni czas i pomnóż go przez całkowitą liczbę dokumentów. Jeśli ten czas jest rozsądny, przestań kodować i publikuj na serwerze. Właśnie zaoszczędzisz koszty rozwoju firmy w swoim tempie rozwoju, ponieważ zaoszczędzony czas może w rzeczywistości być bardziej oszczędny niż wygaśnięcie 30 minut od uruchomienia serwera, które zajęło Ci osiągnięcie tygodniowej wartości kodowania.

W przeciwnym razie zacznij szukać programowania równoległego z .Net four i przetestuj na 30 dokumentach i podobnych obliczeniach jak powyżej, aby sprawdzić, czy jest to uzasadnione. Jeśli ten czas jest rozsądny, przestań kodować i publikuj na serwerze.

Jeśli ten czas nie jest rozsądny, należy przedyskutować użycie większej liczby serwerów w celu dalszego podziału pracy.

HTH

Powiązane problemy