2017-03-11 5 views
0

이상해 : 함수 내에서 작업을 수행)기능 실행 시간이 나는이 두 가지 시나리오의 각 요소에 대한 조작과 연결리스트에 반복 사이의 시간 차이를 평가하기 위해 노력하고

1

2) 같은 장소에서 함수 호출없이 작업하기

나는 모든 호출에 대해 스택 프레임을 만들고 파괴하는 OS 오버 헤드로 인해 함수 호출의 변형이 훨씬 더 비용이 많이들 것이라고 예상했지만 결과는 다음과 같다. 그냥 정반대 였어. 나는 이유를 이해할 수 없었다. 누군가 일어난 일을 설명해 주시겠습니까?

내 프로그램입니다 :

// ConsoleApplication4.cpp : Defines the entry point for the console application. 


#include "stdafx.h" 
#include<iostream> 
#include<chrono> 
#include<stdlib.h> 
#define _CRT_SECURE_NO_WARNINGS 

class linked_list_node 
{ 
    int a; 

public : 
    std::string var; 
    bool eval() 
    { 
     if (var == "abc") 
      return true; 

     return false; 
    } 
    linked_list_node() { a = rand() % 100; if (a % 2 == 0) var = "abc"; } 
    linked_list_node* nxt; 
    std::string getVar() { return var; } 

    linked_list_node* getNext() 
    { 
     return nxt; 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    linked_list_node *head = new linked_list_node(); 
    linked_list_node *trav = head; 
    int len = 75000; 

    while (len != 0) 
    { 
     linked_list_node *n = new linked_list_node(); 
     trav->nxt = n; 
     trav = n; 
     len--; 
    } 
    trav->nxt = NULL; 

    //traversal with function 
    int length = 0; 

    trav = head; 
    std::chrono::steady_clock::time_point begin =   std::chrono::steady_clock::now(); 
    while (trav != NULL) 
    { 
     length++; 

     if (trav->eval()) 
      std::cout << ""; 
     trav = trav->nxt; 


    } 
    std::chrono::steady_clock::time_point end =  std::chrono::steady_clock::now(); 
     std::cout << "Time difference with function == " <<   std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() <<  std::endl; 

    //traversal without function 
    trav = head; 
    length = 0; 

    begin = std::chrono::steady_clock::now(); 

    while (trav != NULL) 
    { 
     length++; 
     if (trav->var =="abc") 
      std::cout << ""; 
     trav = trav->nxt; 

    } 
    end = std::chrono::steady_clock::now(); 

    std::cout << "Time difference without function = " <<  std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count() << std::endl; 

    getchar(); 

    return 0; 
} 

이 내 결과입니다 :

기능 == 18100

시차 기능이없는과

시간 차이 = 33700000

답변

0

당신은 측정하고 다른 단위로 시간 : std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin)std::chrono::duration_cast<std::chrono::microseconds>(end - begin).

+0

고마워, 실수 였어. –

+0

도와 줘서 고마워! 늦게 답변 – cbuchart

3

첫 번째 차이점 : 함수에서

, 당신은 "abc"var의 값을 비교한다.
비 함수 호출 코드에서 var의 값을 "ram"과 비교합니다.

두 번째 차이, 가장 중요한 : 첫 번째 경우

, 당신은 std::chrono::microseconds을 사용하고 있습니다.
두 번째 경우 사용중인 std::chrono::nanoseconds

이러한 오류를 수정 한 후에 첫 번째 숫자보다 두 번째 숫자의 값이 작아집니다.

+0

@ R Sahu, 죄송합니다, 내가 그것을 수정 .. 죄송합니다 .. 내가 확인하고 때로는 동등한 때로는 기능이 적고 때로는 기능이 더 다양한 결과를 얻을 다양한 결과를 얻을, 내 목표는 차이 ..하지만 대답 해줘서 고마워! –

+0

@s_s,이 경우 시계 샘플링 문제가 발생할 가능성이 큽니다. 'len'을 100 번이나 1000 번 늘려 문제를 해결하십시오. –

관련 문제