2010-11-20 4 views
13

Während ich in diesen Tagen viel Benchmarking mache, stolperte ich über etwas sehr beunruhigendes/interessantes/neues für mich. Nach einigen Recherchen, die immer mehr auf den Punkt kommen (was ich nicht glauben konnte), scheint Windows XP (und wahrscheinlich auch alle anderen Versionen) Programme ungefähr dreimal so langsam auszuführen wie im abgesicherten Modus.Windows abgesicherten Modus führt einfache Programme (mindestens) 3 mal schneller?

Nehmen Sie dieses kleine Programm als Beispiel:

#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; 
} 

Auf meinem 2,4 Ghz Computer dauert es ~ 2,5 Sekunden im abgesicherten Modus auszuführen, während es ~ 8 Sekunden dauert im Normalmodus auszuführen. (ThreadPriorität = TIMECRITICAL, ProcessClass = REALTIME). EVEN, wenn ich kompilieren und starten Sie diesen Code innerhalb einer vmware-Linux-Sitzung in diesem normalen Windows-Modus wird es schneller ausgeführt (ca. 5,5 Sekunden).

Ich habe auch eine Menge CPU-Zyklus Messung und tatsächlich die Ergebnisse aus dem abgesicherten Modus scheinen viel mehr wie das, was Sie erwarten sollten angesichts der Menge der Anweisungen verarbeitet.

Also was habe ich vermisst? Kann mir jemand das rätseln?

Alle Hinweise und Hinweise geschätzt, Danke.

Gelöst! Es tut mir leid, Jungs, dieses Problem ist mit meiner beschissenen Alienware m15x, die aus irgendeinem Grund auf scheinbar 1/3 seiner CPU-Leistung Drosselung - es sei denn, Sie böse Werkzeuge (ThrottleStop.exe) verwenden, um es normal zu bringen Geschwindigkeit. Es tut mir leid, dass du deine Zeit verschwendet hast. :(

+1

Wie messen Sie die Zeit? Es gibt keinen Messcode drin. Sind Sie sicher, dass die gesamte Schleife sowieso nicht optimiert ist? Der Compiler könnte den Wert von k zur Kompilierzeit berechnen Wie auch immer ... – AshleysBrain

+0

Ja, ich habe das aus Gründen der Einfachheit verlassen, aber ich vertraute auch nichts mehr, also habe ich die Schleife groß genug gemacht um mit einer Stoppuhr in der Hand zu sitzen, es sind wirklich 2,5 Sekunden gegen 8 - 8,5 Sekunden. und ich habe mir den Maschinencode angeschaut - also nein, es ist nicht wegoptimiert - auch: der gleiche Code läuft 1 mal im normalen Modus - 1 mal im abgesicherten Modus –

+0

@Roman Pfneudl, das ist interessant, zumal du das schon bist Sie haben versucht, Ihren Antiviren-/Anti-Malware-Dienst zu stoppen und zu sehen, ob das einen Unterschied macht? –

Antwort

2

Ziemlich sicher, dass dies etwas Besonderes mit Ihren Computern ist.

Ich lief diesen Code, kompiliert mit MSVC 10 im Release-Modus, auf einem alten XP-Netbook und es ist ein wenig schneller im normalen Modus als im abgesicherten Modus für mich, nicht sehr sorgfältig zu messen, aber es dauerte etwa 8 Sekunden normal Modus und 10 Sekunden im abgesicherten Modus.

Ein wenig überraschend auch, dass es auf Ihrem Computer im normalen Modus so lange dauert wie auf einer alten Single-Core-Atom-CPU. Sie erwähnen nicht, welcher Computer es ist, aber ich nehme an, dass es schneller als ein Netbook sein sollte, damit Sie ein Problem damit haben könnten.

+0

Sie haben Recht - ich dachte gerade, dass meine Alienware m15x diese Probleme LOL hat. Es tut uns leid. –

+0

Siehe "Gelöst !!!" –

0

Ich denke, seine weil im abgesicherten Modus gibt es weit weniger Prozesse im Hintergrund laufen, damit weniger Belastung der CPU & Speichernutzung

+5

Nein, das ist definitiv nicht der Punkt, den ich schätze. Windows kann 2 Drittel der gesamten Verarbeitungsleistung auf einer stabilen Rate essen. –

+0

Aber warum kleine Programme brauchen mehr Zeit? –

+0

Es ist nicht wirklich die kleinen Programme - ich habe nur ein sehr kleines Programm als Beispiel genommen, um es leicht zu rekonstruieren - meine verrückte Ahnung ist, dass Windows den Prozessor in eine Art "über Debugging" -Modus versetzt, um weitere Ausnahmen zu erfassen oder was auch immer. –

2

Einige Punkte:.

  • Sie sagen, Sie die Zeit mit einer Stoppuhr gemessen, das sind Sie nicht die Echtzeit auf Ihren Prozess ausgegeben werde geben Sie den Code richtig
  • Haben Sie versucht, alle anderen Programme zum Profil benötigen?
  • diesem Test geben Sie einen Schuss, zwei XP VMs, eins VM startet im abgesicherten Modus und einem im normalen Modus, um die gleiche Zeit, um das Programm in beiden VM starten und die CPU-Zeit messen jeweils eine (nicht die Uhrzeit)
+0

Ich benutzte rdtsc, um die CPU-Zyklen zu messen. Ich habe die ProcessAffinity so eingestellt, dass ich nur einen Prozessor benutze, weil ich weiß, dass rdtsc manchmal komisch ist, wenn sie das nicht tut. Ich habe kleine Teile einfachen Codes gemessen, was zu diesem 33%/100% Verhalten führte. Ich habe sogar einen einfachen Schlaf gemessen (2000), was in beiden Fällen zu ~ 1952 ms führte. Also, das bewies, dass die Rdtsc zumindest irgendwie korrekt funktionierte -> es lieferte nur diese wahnsinnige Diskrepanz. Starten von komplexen Programmen wird nicht helfen, ich fürchte. Ich werde daraus keine nützliche Information erhalten. –

+0

Ich habe nicht gesagt, ein komplexes Programm zu starten, nur ein anderes. Es wird Ihnen sagen, ob es etwas Spezifisches mit dieser Anwendung oder allgemeiner ist. Sie müssen auch die richtige Profilerstellung vornehmen, um zu wissen, wo die Zeit verbracht wird. – hhafez

0

Wenn Ihr mit C nimmt ++ Sie Queryperformance verwenden könnte und Queryperformancecounter, um genau ein Stück Code zum Beispiel Zeit:

#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

Der OP weiß, wie man ein Stück Code timen kann, er interessiert, warum es im normalen Modus langsamer ist als im abgesicherten Modus. – darioo

2

Ist DEP Lauf unter abgesicherten Modus? Ich frage mich, ob es irgendeine Form von Sicherheit/Sandboxing oder etwas ähnliches ist. Interesse Trend obwohl.

+0

Nein, nicht wahrscheinlich - es ist nur für Windows-Prozesse eingeschaltet (zumindest auf meiner Maschine). –

3

Haben Sie das auf mehr als einem Computer reproduziert? (Ich nehme an, wenn Sie sagen, dass Sie in VMware/Linux versuchten, den gleichen Windows-Computer wie der VMware-Host zu verwenden, Linux als Gast darin laufen.)

Wenn Sie diesen Effekt nur auf einem Computer dann gesehen haben Möglicherweise verlangsamen Sie durch einen Treiber, der im abgesicherten Modus nicht geladen wird.

(Oder eine andere Software, aber wahrscheinlich ein Treiber von dem, was Sie über die CPU im Leerlauf und der Code nicht viel mit dem Betriebssystem interagieren gesagt, wenn etwas die tatsächliche printf-Ausgabe verzögert, die ist möglich.)

z Bei einigen Treibern kann es sich um Low-Level-Sperren handeln, die einen ordnungsgemäßen Taskwechsel verhindern, oder bei etwas, das möglicherweise eine Ressource verwendet, die den printf-Aufruf verzögert. Beides wäre in Bezug auf die CPU-Nutzung nicht unbedingt sichtbar.

+0

Ich setze das printf völlig aus der Gleichung heraus, denn dies ist eine weitere komplexe Funktion zum Sperren/Entsperren, und es wurde mit mehreren Funktionen getestet, die nur Rechenaufgaben erledigen und Blöcke nur bis zu 4 Assembler-Anweisungen messen. Ok, ich denke, ich muss hier ein besseres Beispiel geben, um besser darzustellen, was ich meine. –

2

Wie Leo Davidson sagte, wird es wahrscheinlich von einem Treiber verursacht, der nicht im abgesicherten Modus geladen ist.

1) Es könnte ein Hardware-Treiber sein: Haben beide Computer die gleiche Hardware-Konfiguration?

2) Oder sogar Malware (mit Rootkit!): Dies bedeutet, dass der bösartige Treiber sich im normalen Modus versteckt, so dass Sie die Listen der Dateien in system32 \ drivers \ mit ihren Größen/MD5s vergleichen konnten, sichere und normale Modi. Sie können http://www.virustotal.com/ verwenden, um eine Datei zu scannen.

+0

Nun nein, es sollte das Programm nicht um mehr oder weniger genau 66% verlangsamen. Treiber und Malware sind auch nur Prozesse, die manchmal ihre CPU-Zyklen erhalten. Dies sollte höchstens zu instabilen Ergebnissen führen. –

+1

Treiber sind keine Prozesse; Sie laufen in jedem Prozess und können die Dinge drastisch ändern. Ein weiterer Punkt, der nichts mit Treibern zu tun hat, ist sicherzustellen, dass Sie bei der Überprüfung der Ressourcennutzung nach Prozessen für alle Benutzer suchen. –

6

Gelöst! Es tut mir leid, Jungs, dieses Problem ist mit meiner beschissenen Alienware m15x, die aus irgendeinem Grund auf scheinbar 1/3 seiner CPU-Leistung Drosselung - sofern Sie böse Werkzeuge (ThrottleStop.exe) verwenden, um es auf normale Geschwindigkeit bringen . Es tut mir leid, dass du deine Zeit verschwendet hast. :(

+1

ausgezeichnet. Ich habe diesen Thread beobachtet, sehr interessiert zu wissen, was rauskommt. Ich bin froh, dass es erklärt werden kann. –

+0

Ja, ich auch. Das Ding hat mich fast aus meinem verschwörerischen Verstand vertrieben. :) –

+0

Danke für das Zurückkommen und erklären, auch wenn es nicht das war, was Sie erwartet haben. – AshleysBrain

Verwandte Themen