2013-04-21 3 views
1

2 개의 입력 파일을 읽는 프로그램이 있습니다. 첫 번째 파일에는 BST 및 AVL 트리에 입력되는 임의의 단어가 포함되어 있습니다. 그런 다음 프로그램은 두 번째 읽기 파일에 나열된 단어를 찾고 트리에 존재하는지 말한 다음 수집 된 정보가있는 출력 파일을 작성합니다. 이것을하는 동안 프로그램은 특정 항목을 찾는 데 소비 된 시간을 인쇄합니다. 그러나이 프로그램은 소비 된 시간을 측정하는 것으로 보이지 않습니다.C++ 클럭이 시간을 잘못 측정합니다.

BST* b = new BST(); 
AVLTree* t = new AVLTree(); 

string s; 

ifstream in; 
in.open(argv[1]); 

while(!in.eof()) 
{ 
    in >> s; 
    b->insert(s); 
    t->insert(s); 
} 

ifstream q;  
q.open(argv[2]); 

ofstream out; 
out.open(argv[3]); 

int bstItem = 0; 
int avlItem = 0; 
float diff1 = 0; 
float diff2 = 0; 

clock_t t1, t1e, t2, t2e; 

while(!q.eof()) 
{ 
    q >> s; 

    t1 = clock(); 
    bstItem = b->findItem(s); 
    t1e = clock(); 

    diff1 = (float)(t1e - t1)/CLOCKS_PER_SEC;   

    t2 = clock(); 
    avlItem = t->findItem(s); 
    t2e = clock(); 

    diff2 = (float)(t2e - t2)/CLOCKS_PER_SEC; 

    if(avlItem == 0 && bstItem == 0) 
     cout << "Query " << s << " not found in " << diff1 << " microseconds in BST, " << diff2 << " microseconds in AVL" << endl; 

    else 
     cout << "Query " << s << " found in " << diff1 << " microseconds in BST, " << diff2 << " microseconds in AVL" << endl; 

    out << bstItem << " " << avlItem << " " << s << "\n"; 
} 

입력하기 직전에 입력 한 clock() 값과 입력 한 직후에 얻은 clock() 값은 완전히 같습니다. 그래서 마치 프로그램이 while 루프를 전혀 실행하지 않는 것처럼 보입니다. 따라서 0으로 인쇄됩니다. 프로그램 마무리를 위해 약 10 초 정도 걸리므로 그렇지 않습니다. 또한 출력 파일에 올바른 결과가 포함되어 있으므로 잘못된 findItem() 함수를 가질 가능성도 사실이 아닙니다.

나는 Stack Overflow에서 약간의 연구를했고, 많은 사람들이 저와 같은 문제를 경험한다는 것을 알았습니다. 그러나 내가 읽은 답 중 어느 것도 그것을 풀어주지 못했습니다.

+0

표준 시계는 매우 조잡한 해상도입니다. 개별 라운드가 없다면, 10ms라고 말하면 측정 할 수 없습니다. 또한'eof()'는 항상 잘못되었다는 것에주의하십시오. –

+0

위에서 언급했듯이 프로그램을 끝내는 데 약 10 초 정도 걸리므로 시계의 해상도와 관련이 있다고는 생각하지 않습니다. 따라서 실행 시간이 엄청나게 짧지는 않습니다. 또한 eof()가 항상 잘못되었다는 이유에 대해 더 구체적으로 설명 할 수 있습니까? – harbinger

+0

귀하의 플랫폼은 무엇이며 귀하의 플랫폼에서 CLOCKS_PER_SEC의 가치는 무엇입니까? – evilruff

답변

1

클럭 해상도가 내 문제는 아니지만 더 높은 해상도의 클럭을 사용하여 문제를 해결했습니다. time.h에서 clock_gettime()을 사용했습니다. 내가 아는 한 clock()보다 높은 클럭 해상도는 플랫폼에 따라 다르며 필자가 사용하는이 코드는 Linux에서만 사용할 수 있습니다. 나는 아직도 clock()에서 건강한 결과를 얻을 수 없었던 이유를 알지 못했지만 플랫폼 의존성을 다시 의심합니다.

clock_gettime()을 사용하면 코드를 컴파일 할 때 POSIX 실시간 확장을 포함해야합니다. 그래서 당신은 수행해야합니다

g++ a.cpp b.cpp c.cpp -lrt -o myProg 

을 -lrt는 POSIX 확장을 포함하는 매개 변수입니다.

+0

다음은 clock_gettime()의 windows 포트에 대한 링크입니다. http://stackoverflow.com/a/5404467/1911235 – Meep

0

(t1e - t1)이 < 인 경우 CLOCKS_PER_SEC 정수 나누기가 잘 리므로 결과는 항상 0입니다. CLOCKS_PER_SEC을 (를) 플로트하여 전송합니다.

diff1 = (t1e-t1)/((float) CLOCKS_PER_SEC);

+1

문제는 나누기에서 발생하지 않습니다.명령을 실행하기 직전에 얻은 clock() 값은 항상 동일합니다. – harbinger