Время выполнения (пусто для цикла против цикла с одним оператором) - PullRequest
1 голос
/ 07 марта 2011

У меня есть следующая программа, и я запускаю ее в режиме отладки VS 2010.К моему удивлению, пустой цикл for занимает больше времени, чем цикл for с оператором сложения.Время пустого цикла составляет 2371 мс, а для сложения цикла - 2043 мс.И я запускал его несколько раз, и каждый раз, когда цикл пуст, цикл выполняется быстрее.Что происходит?

#include <Windows.h>
#include <iostream>

using namespace std;

int main(){
    DWORD start = GetTickCount();
    for(int i = 0; i < 1000000000; i++){

    }
    DWORD finish = GetTickCount();
    cout<<finish - start<<" ms."<<endl;


    start = GetTickCount();
    for(int i = 0; i < 1000000000; i++){
        int x = i + 1;
    }
    finish = GetTickCount();
    cout<<finish - start<<" ms."<<endl;
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 07 марта 2011
  1. Создайте свое приложение с включенной оптимизацией.
  2. Используйте лучший метод синхронизации, чем GetTickCount, например QueryPerformanceCounter
  3. Обнаружение переключений контекста путем частого измерения прошедшего времени и отбрасывания аномально больших выборок.

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

При измерении производительности используйте профилировщик для реального кода.

0 голосов
/ 07 марта 2011

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

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Const loops As Integer = 100000000
    ListBox1.Items.Clear()

    Dim precTM As Long = Stopwatch.GetTimestamp
    For x As Integer = 1 To loops
        'nothing
    Next
    precTM = Stopwatch.GetTimestamp - precTM

    ListBox1.Items.Add(precTM / Stopwatch.Frequency)
    ListBox1.Refresh()

    Dim foo As Integer
    precTM = Stopwatch.GetTimestamp
    For x As Integer = 1 To loops
        foo = x + 1
    Next

    precTM = Stopwatch.GetTimestamp - precTM
    ListBox1.Items.Add(precTM / Stopwatch.Frequency)


End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...