2010-11-20 7 views
13

Podczas wykonywania wielu testów porównawczych ostatnio natknąłem się na coś bardzo niepokojącego/interesującego/nowego dla mnie. Po przeprowadzeniu niektórych badań coraz bardziej do punktu (w co nie mogłem uwierzyć), wydaje się, że Windows XP (i prawdopodobnie wszystkie inne wersje również) uruchamia programy około 3 razy tak wolno, jak w trybie awaryjnym.Windows Safe Mode uruchamia proste programy (przynajmniej) 3 razy szybciej?

Weź to mały program, jako przykład:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char **argv) 
{ 

    long i,j,k; 

    printf ("Starting...\n"); 

    k = 12; 

    for (i = 0; i < 20000; i++) 
     for (j = 100000; j > 0; j--) 
      k = k * 12; 

    printf ("Done... k =%d", k);  // just using k here to prevent the whole block isn't optimized away. 

    return 0; 
} 

Na moim 2.4 GHz komputera trwa ~ 2,5 sek do wykonania w trybie awaryjnym, a to trwa ~ 8 sekund, aby wykonać w trybie normalnym. (ThreadPriority = TIMECRITICAL, ProcessClass = REALTIME). NAWET gdy kompiluję i uruchamiam ten kod w sesji vmware-linux w tym bardzo normalnym trybie Windows uruchamia się szybciej (około 5,5 s).

Wykonałem również wiele pomiarów w cyklu procesora, a wyniki w trybie bezpiecznym wydają się znacznie bardziej zgodne z oczekiwaniami, biorąc pod uwagę liczbę przetwarzanych instrukcji.

Więc, co przegapiłem? Czy ktoś może mi to zagadnąć?

Wszystkie wskazówki i porady zostały docenione, Thanx.

SOLVED! Przykro mi, chłopaki, ten problem jest związany z moim brzydkim alienware m15x, który z jakiegoś powodu dławi się do pozornie 1/3 mocy procesora - chyba że użyjesz złych narzędzi (ThrottleStop.exe), aby dostosować go do normalności prędkość. Wyjątkowo przykro z powodu marnowania czasu. :(

+1

Jak mierzysz czas? Nie ma tam kodu pomiarowego i czy na pewno cała pętla nie jest tak zoptymalizowana? Kompilator może być w stanie wyliczyć wartość k w czasie kompilacji – AshleysBrain

+0

Tak, opuściłem to, próbując dla uproszczenia, w rzeczywistości i tak nie ufałem niczemu więcej, więc zrobiłem pętlę wystarczająco dużą, by usiąść tam ze stoperem w dłoni, to naprawdę 2,5 sekundy na 8 - 8,5 sekundy. i ja obejrzałem kod maszynowy - więc nie, nie został zoptymalizowany - także: jego ten sam kod uruchomiono 1 raz w trybie normalnym - 1 raz w trybie bezpiecznym –

+0

@Roman Pfneudl, to jest interesujące, zwłaszcza, że ​​jesteś nie robi nic intensywnego dysku, ale czy próbowałeś zatrzymać antywirusa/anty-malware i zobaczyć, czy to robi różnicę? –

Odpowiedz

2

Dość pewność, że jest to coś specjalnego dla komputerów.

Uruchomiłem ten kod, skompilowany z MSVC 10 w trybie Release, na starym netbooku XP i jest trochę szybszy w trybie normalnym niż w trybie bezpiecznym dla mnie, nie mierząc bardzo uważnie, ale trwało to około 8 sekund w normalnym tryb i 10 sekund w trybie awaryjnym.

Trochę zaskakujące, że wydaje się zajmować tak długo na komputerze w trybie normalnym, jak na starym jednordzeniowym procesorze Atom. Nie wspominasz o tym, jaki to komputer, ale zakładam, że powinien być szybszy niż netbook, więc możesz mieć z tym problem.

+0

Masz rację - właśnie pomyślałem, że mój alienware m15x ma te problemy LOL. Przepraszam. –

+0

Zobacz "SOLVED !!!" –

0

Chyba jego ponieważ w trybie awaryjnym są znacznie mniej procesów działających w tle, a więc mniej stresu na użycie pamięci CPU &

+5

Nie, to na pewno nie o to chodzi. Windows nie może spożywać 2 3rds całej mocy obliczeniowej na stabilnym poziomie. –

+0

Dlaczego małe programy wymagają więcej czasu? –

+0

To naprawdę nie są małe programy - po prostu wziąłem mały program jako przykład do łatwej rekonstrukcji - moim zwariowanym przeczuciem jest to, że Windows umieszcza procesor w jakimś trybie "nadmiernego debugowania", aby móc złapać więcej wyjątków lub cokolwiek. –

2

Kilka punktów:.

  • mówisz Mierzysz czas za pomocą stopera, który nie da ci czasu spędzonego na twoim procesie, musisz poprawnie profilować kod
  • Czy próbowałeś już innych programów?
  • Wypróbuj ten test, dwa XP VM, jeden VM uruchamia się w trybie awaryjnym, a drugi w trybie normalnym, należy uruchomić program zarówno VM w tym samym czasie i zmierzyć czas procesora każdy zaczyna (nie czas)
+0

Użyłem programu rdtsc do pomiaru cykli procesora. Ustawiłem ProcessAffinity tak, aby używał tylko jednego procesora, ponieważ wiem, że rdtsc może czasami zachowywać się śmiesznie, kiedy tego nie robi. Zmierzyłem małe porcje prostego kodu, co spowodowało zachowanie 33%/100%. Zmierzyłem nawet prosty sen (2000), który w obu przypadkach zaowocował ~ 1952 ms. Tak więc to udowodniło, że rdtsc przynajmniej działał poprawnie -> po prostu ciągle dostarczał tej obłędnej rozbieżności. Rozpoczęcie złożonych programów nie pomoże, obawiam się. Nie otrzymam z tego żadnych użytecznych informacji. –

+0

Nie powiedziałem, że zaczynam złożony program, tylko inny. Powie Ci, czy jest to coś konkretnego w tej aplikacji lub bardziej ogólne. Trzeba również zrobić odpowiednie profilowanie, aby wiedzieć, gdzie spędza się czas. – hhafez

0

Jeśli używasz C++ można użyć QueryPerformanceFrequency i QueryPerformanceCounter dokładnie razem kawałek kodu na przykład:

#include <time.h> 
#include <windows.h> 

LARGE_INTEGER startTimer, endTimer, frequency;//declare some big numbers to use in timers 
double timeTakenInSeconds; 

int main() 
{ 
    //start timer: 
    QueryPerformanceFrequency(&frequency);//retrieves the frequency of the high-resolution performance counter(if exsists on this hardware) 
    QueryPerformanceCounter(&startTimer);//retrieves the current value of the high-resolution performance counter(in counts) 

    //do something that you want to time here eg call a sorting method 


    QueryPerformanceCounter(&endTimer);//endtimer 
    timeTakenInSeconds = (endTimer.QuadPart-startTimer.QuadPart)/(double)frequency.QuadPart;//Work out time difference 
    cout <<"somthing took: \t" << timeTakenInSeconds << " seconds" <<endl;//print the time takken 

    return 0; 
} 
+2

OP wie, jak wyciąć kod, interesuje go, dlaczego jest wolniejszy w trybie normalnym niż w trybie awaryjnym. – darioo

2

Czy DEP prowadzony pod trybie awaryjnym? Zastanawiam się, czy jest to jakaś forma bezpieczeństwa/sandboxing lub coś podobnego. Trend odsetkowy.

+0

Nie, nie jest prawdopodobne - jest włączony tylko dla procesów Windows (przynajmniej na moim komputerze). –

3

Czy powtórzyłeś to na więcej niż jednym komputerze? (Przypuszczam, że kiedy mówisz, że próbowałeś w VMware/Linux, masz na myśli używanie tego samego komputera Windows, co host VMware, z systemem Linux jako gościem w środku).

Jeśli widzisz ten efekt tylko na jednym komputerze, możesz mieć spowolnienie sterownika, który nie jest ładowany w trybie awaryjnym.

(Albo jakaś inna część oprogramowania, ale prawdopodobnie sterownik z tego, co powiedziałeś o procesorze, który wydaje się być bezczynny, a kod nie współdziała zbytnio z OS, chyba że coś opóźnia faktyczne wyjście printf, które jest możliwe.)

np. Niektóre sterowniki mogą posiadać blokady niskiego poziomu, które uniemożliwiają właściwe przełączanie zadań lub coś może wykorzystywać zasób, który opóźnia wywołanie printf. Żadne z nich nie musi być widoczne pod względem wykorzystania procesora.

+0

Całkowicie usunąłem wydruk z równania, ponieważ jest to kolejna złożona funkcja blokowania/odblokowywania io i przetestowałem je z kilkoma funkcjami wykonującymi tylko obliczenia, mierząc bloki do zaledwie 4 instrukcji asemblera. Ok, myślę, że muszę tu podać lepszy przykład, żeby lepiej pokazać, co mam na myśli. –

2

Tak jak powiedział Leo Davidson, jest to prawdopodobnie spowodowane przez sterownik, który nie jest załadowany w trybie awaryjnym.

1) Może to być sterownik sprzętowy: czy oba komputery mają tę samą konfigurację sprzętową?

2) Lub nawet złośliwe oprogramowanie (z rootkitem!): Oznacza to, że złośliwy sterownik ukryje się w trybie normalnym, abyś mógł porównać wykazy plików w sytem32 \ drivers \ z ich rozmiarami/MD5s wziął oba, tryby bezpieczne i normalne. Możesz użyć http://www.virustotal.com/, aby zeskanować dowolny plik.

+0

No nie, to nie powinno spowolnić programu o mniej więcej dokładnie 66%. Sterowniki i złośliwe oprogramowanie są również po prostu procesami, które czasami otrzymują swoją liczbę cykli operacyjnych. To powinno prowadzić do niestabilnych wyników co najwyżej. –

+1

Sterowniki nie są procesami; działają w każdym procesie i mogą całkiem drastycznie zmienić sytuację. Inną kwestią, niezwiązaną z kierowcami, jest upewnienie się, że patrzysz na procesy dla wszystkich użytkowników podczas sprawdzania użycia zasobów. –

6

SOLVED! Przykro mi, chłopaki, ten problem jest związany z moim głupim alienware m15x, który z jakiegoś powodu dławi się do pozornie 1/3 mocy procesora - chyba że użyjesz złych narzędzi (ThrottleStop.exe), aby dostosować go do normalnej prędkości . Wyjątkowo przykro z powodu marnowania czasu. :(

+1

doskonała. Oglądałem ten wątek, bardzo zainteresowałem się tym, co wychodzi. Cieszę się, że można to wyjaśnić. –

+0

Tak, ja też. Ta rzecz niemal wypędziła mnie z mojego zapachu spiskującego. :) –

+0

Dzięki za powrót i wyjaśnienie, nawet jeśli nie było to, czego się spodziewałeś. – AshleysBrain

Powiązane problemy