2011-03-07 4 views
1

다음 프로그램이 있으며 VS 2010 디버그 모드에서 실행 중입니다. 놀랍게도 for for 빈 루프는 for 문보다 더 많은 시간이 걸린다. 빈 for 루프의 시간은 2371ms이고 루프의 추가 시간은 2043ms입니다. 그리고 나는 그것을 여러 번 돌렸고 루프를위한 빈 시간은 빠릅니다. 무슨 일 이니? 최적화가 켜져와러닝 타임 (하나의 명령문으로 루프 대 루프에 대해 비어 있음)

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

디버그 모드의 타이밍은 꽤 신뢰할 수 없습니다. 성능의 크기에 대한 아이디어를 얻을 수 있지만 그보다 훨씬 나아지기는 꽤 어렵습니다. –

답변

2
  1. 앱을 구축 할 수 있습니다.
  2. GetTickCount보다 나은 타이밍 방법을 사용하십시오 (예 : QueryPerformanceCounter
  3. 경과 시간을 자주 측정하고 비정상적으로 큰 샘플을 삭제하여 컨텍스트를 검색합니다. 위를 할 경우 x는 컴파일러 가능성이 단지 완전히 문을 무시합니다 사용하지 않는 때문에

는 두 개의 루프는 동일한 시간이 소요됩니다. 루프가 완전히 삭제 된 경우 놀라지 않을 것입니다.

성능을 측정 할 때는 실제 코드에서 프로파일 러를 사용하십시오.

+0

+1 - 예, 어디서나 x를 사용하지 않으면 컴파일러가 두 루프를 최적화하는 것을 보지 않을 것입니다. –

0

문제가 귀하의 근무 시간으로 판단됩니다. 다음 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 
관련 문제