Thinking Different




어느 블로그에서 ifstream getline 이 fgets보다 빠르다고 썰이 올라왔길래 말도 안되는 소리라 생각하고 소스를 간단히 짠 후 테스트 해보았다..  역시나 ifstream은 쓸것은 못되더라는.......;;


테스트 파일은 약 15MB 정도의 일반적인 로그파일 데이터로 테스트 하였다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// ConsoleApplication1.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include "CodeTimer.h"
#include 
 
#define TEST_FILE "c:\\1.log"
#define BUF_SIZE 1024
 
/*
-----------------------------------
    ifstream getline() 함수
-----------------------------------
*/
void IFSTREAM_GETLINE() 
{
    ifstream inFile(TEST_FILE, ios::in | ios::binary);
    if (!inFile.is_open())
        exit(1);
 
    char buf[BUF_SIZE] = { 0, };
    while (!inFile.getline(buf, sizeof(buf)).eof())
    {
    }
 
    inFile.close();
}
 
/*
-----------------------------------
           fread() 함수
-----------------------------------
*/
void FREAD_TEST() 
{
    FILE *fp = fopen(TEST_FILE, "rb");
    if (NULL == fp)
        exit(1);
 
    char buf[BUF_SIZE] = { 0, };
 
    size_t len = 0;
    while (!feof(fp))
    {
        len = fread(buf, sizeof(buf[0]), sizeof(buf) / sizeof(buf[0]), fp);
    }
 
    fclose(fp);
}
 
/*
-----------------------------------
            fgets() 함수
-----------------------------------
*/
void FGET_TEST() 
{
    FILE *fp = fopen(TEST_FILE, "rb");
    if (NULL == fp) 
        exit(1);
 
    char buf[BUF_SIZE] = { 0, };
    while (NULL != fgets(buf, sizeof(buf), fp)) 
    {
    }
 
    fclose(fp);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    CodeTimer timer;
 
    timer.Begin();
    IFSTREAM_GETLINE();
    timer.End();
    printf("ifstream::getline() : %f\n", timer.GetCodeTime() );
 
    timer.Begin();
    FGET_TEST();
    timer.End();
    printf("fgets() : %f\n", timer.GetCodeTime());
 
    timer.Begin();
    FREAD_TEST();
    timer.End();
    printf("fread() : %f\n", timer.GetCodeTime());
 
    getchar();
 
    return 0;
}



코드 구동 시간 측정 클래스 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
#include 
 
class CodeTimer
{
public:
    VOID Begin()
    {
        QueryPerformanceFrequency(&frequency); // 주파수(1초당 증가되는 카운트수)를 구한다.
        QueryPerformanceCounter(&startCounter); // 코드 실행 전 카운트를 구한다.
    }
 
    VOID End()
    {
        QueryPerformanceCounter(&endCounter); // 코드 실행 후 카운트를 구한다.
    }
 
    double GetCodeTime()
    {
        return (double)(endCounter.QuadPart - startCounter.QuadPart) / (double)frequency.QuadPart;
    }
 
private:
    LARGE_INTEGER startCounter, endCounter, frequency;
};




<normal read>




<binary read>