Безопасный режим Windows запускает простые программы (по крайней мере) в 3 раза быстрее?

В то время, когда я делал много бенчмаркинга, я наткнулся на что-то очень тревожное/интересное/новое для меня. После того, как некоторые исследования стали все больше и больше (что я не мог поверить), кажется, что Windows XP (и, вероятно, все остальные версии) запускает программы примерно в 3 раза медленнее, чем в безопасном режиме.

Возьмите эту небольшую программу в качестве примера:

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

На моем компьютере 2,4 ГГц требуется 2,5 с для выполнения в безопасном режиме, а для нормального режима требуется ~ 8 секунд. (ThreadPriority = TIMECRITICAL, Processclass= REALTIME). EVEN, когда я компилирую и запускаю этот код в сеансе vmware-linux в этом обычном режиме Windows, он выполняется быстрее (около 5,5 секунд).

Я также сделал много циклов измерения цикла, и на самом деле результаты из безопасного режима кажутся больше похоже на то, что вы должны ожидать, учитывая количество обработанных инструкций.

Так что я пропустил? Может ли кто-нибудь меня загадить?

Все указатели и подсказки оценены, Thanx.

РЕШЕННО! Прошу прощения, ребята, эта проблема связана с моей дрянной alienware m15x, которая по какой-то причине дросселируется, по-видимому, на 1/3 ее мощности процессора - если вы не используете злые инструменты (ThrottleStop.exe), чтобы довести его до нормальной скорости. Поразительно жаль тратить ваше время.: (

Ответ 1

Довольно уверен, что это что-то особенное с вашими компьютерами.

Я запустил этот код, скомпилированный с MSVC 10 в режиме Release, на старый нетбук XP, и он немного быстрее в обычном режиме, чем в безопасном для меня режиме, но не очень тщательно, но потребовалось около 8 секунд в обычном режиме и 10 секунд в безопасном режиме.

Немного удивительно, что он, кажется, занимает так много времени на вашем компьютере в обычном режиме, как на старом одноядерном процессоре Atom. Вы не говорите, какой компьютер это, но я предполагаю, что он должен быть быстрее, чем нетбук, поэтому у вас может быть проблема с ним.

Ответ 2

РЕШИТЬ! Прошу прощения, ребята, эта проблема связана с моим дерьмовым alienware m15x, который почему-то сжимается, по-видимому, до 1/3 его мощности процессора - если вы не используете злые инструменты (ThrottleStop.exe), чтобы принести это до нормальной скорости. Поразительно жаль тратить ваше время.: (

Ответ 3

Вы воспроизвели это на нескольких компьютерах? (Я полагаю, что, когда вы говорите, что вы пытались использовать VMware/Linux, вы имеете в виду использование того же компьютера под управлением Windows, что и хост VMware, который запускает Linux в качестве гостевой системы внутри него.)

Если вы видели этот эффект только на одном компьютере, у вас может быть драйвер, замедляющий работу, которая не загружается в безопасном режиме.

(Или какой-то другой программный продукт, но, вероятно, драйвер от того, что вы сказали о том, что CPU не работает, и код не очень сильно взаимодействует с ОС, если только что-то не задерживает фактический вывод printf, что возможно.)

например. Некоторые драйверы могут содержать блокировки на низком уровне, которые предотвращают правильное переключение задач, или что-то может использовать ресурс, который задерживает вызов printf. Ни то, ни другое не будет видно с точки зрения использования ЦП.

Ответ 4

Несколько точек:

  • Вы говорите, что вы измерили время, используя секундомер, который не даст вам реального времени, потраченного на ваш процесс, вам нужно правильно профилировать код.
  • Вы пробовали какие-либо другие программы?
  • Дайте этому тесту выстрел, две виртуальные машины XP, одна виртуальная машина запускается в безопасном режиме и одна в обычном режиме, запустите программу в обеих виртуальных машинах примерно в одно и то же время и измерьте время процессора, которое требуется каждый (а не часы)

Ответ 5

Выполняется ли DEP в безопасном режиме? Мне интересно, если это какая-то форма безопасности/песочница или что-то подобное. Интересная тенденция.

Ответ 6

Как сказал Лео Дэвидсон, это, вероятно, вызвано тем, что драйвер не загружен в безопасном режиме.

1) Это может быть аппаратный драйвер: оба компьютера имеют одинаковую конфигурацию оборудования?

2) Или даже вредоносное ПО (с руткитом!): это означает, что вредоносный драйвер скроется в обычном режиме, поэтому вы можете сравнить списки файлов в sytem32\drivers\с их размерами /MD 5, взятыми как в безопасном режиме и нормальные режимы. Вы можете использовать http://www.virustotal.com/ для сканирования любого файла.

Ответ 7

Я предполагаю, что это связано с тем, что в безопасном режиме в фоновом режиме работает гораздо меньше процессов, поэтому меньше внимания уделяется использованию процессора и памяти.

Ответ 8

Если вы используете С++, вы можете использовать QueryPerformanceFrequency и QueryPerformanceCounter, чтобы точно указать фрагмент кода, например:

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