«   2024/04   »
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
Archives
Today
Total
관리 메뉴

Code Run

C, C++ 빠른 입출력 본문

코딩 tip

C, C++ 빠른 입출력

comkiwer 2018. 1. 5. 12:12
[GCC 에서 좀더 빠른 입출력 01]

 ※ 파일 디스크립터( fd - File Descriptor) : 참고 페이지
0 => stdin
1 => stdout
2 => stderr


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
/**
faster IO test
https://www.acmicpc.net/problem/10989
comkiwer
use GCC unistd.h - read(fd, buffer, nbyte), write(fd, buffer, nbyte)
*/
#include <cstdio>
#include <unistd.h>
#include <cstring>
 
const int LM = 10001;
const int NBYTE = 2<<20;
char number[10= "00000000\n";     /// 정수를 문자열로 변환하여 저장할 배열
char *np = number+8;                /// number배열의 '\n'의 위치 포인터
char bufferIn[NBYTE + 32];          /// 입력 버퍼로 사용할 배열
char *isp = bufferIn + NBYTE;       /// 입력 버퍼 시작 포인터, 초기값은 iep.
char *iep = isp;                    /// 입력 버퍼 종료 포인터
char bufferOut[NBYTE + 32];         /// 출력 버퍼로 사용할 배열
char *osp = bufferOut;              /// 출력 버퍼 시작 포인터
char *oep = osp + NBYTE;            /// 출력 버퍼 종료 포인터
int count[LM];
 
//inline void bufferSet(){          /// 버퍼 세팅하기
//    setvbuf(stdin, bufferIn, _IOFBF, NBYTE + 32);
//    setvbuf(stdout, bufferOut, _IOFBF, NBYTE + 32);
//}
 
inline char get(){                  /// 입력 버퍼로 입력받기, 문자단위 반환
                                    /// 입력버퍼가 다 비워졌다면 다시 채우기
    if(isp==iep) read(0, isp=bufferIn, NBYTE);
    return *isp++;                  /// 현재위치의 문자를 반화하고 포인터 증가
}
 
inline int scan(){                  /// 한 개의 정수 단위로 입력받는 함수
    register int d = 0, c = get();  /// 첫 문자 입력
    /// while(c<48) c = get();      /// 숫자가 아닌 동안 반복 입력
    for(;c>47;c = get())
        d = d*10 + c - 48;          /// 문자열을 정수로 Hornor's method
    return d;
}
 
inline void print(int n, int c){
    register char*= np;
    for(;n;n/=10)
        *--= n%10 + 48;           /// 정수를 digit문자로
    int len = np - p + 1;           /// 변환된 문자열의 길이('\n'포함하여)
    for(;c--;){
        memcpy(osp, p, len);        /// 출력 버퍼에 추가하기
        osp += len;
        if(osp>=oep){               /// 출력 버퍼가 가득찼다면 출력하기
            write(1, bufferOut, osp-bufferOut);
            osp = bufferOut;
        }
    }
}
 
int main(){
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    int N = scan(), i;
    while(N--) count[scan()]++;
    for(i=0;i<LM;++i) if(count[i])
        print(i, count[i]);
    write(1, bufferOut, osp-bufferOut);
    return 0;
}
 
cs


[C 에서 좀더 빠른 입출력 01]

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
/**
faster IO test
comkiwer
use stdio.h :
    size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
    size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
*/
#include <stdio.h>
#include <string.h>
 
const int LM = 10001;
const int NBYTE = 2<<20;
char number[10= "00000000\n"*np = number+8;
char bufferIn[NBYTE + 32], bufferOut[NBYTE + 32];
char *isp = bufferIn + NBYTE, *iep = isp;
char *osp = bufferOut, *oep = osp + NBYTE;
int count[LM];
 
inline char get(){
    if(isp==iep) fread(isp=bufferIn, 1, NBYTE, stdin);
    return *isp++;
}
 
inline int scan(){
    register int d = 0, c = get();
    /// while(c<48) c = get();
    for(;c>47;c = get()) d = d*10 + c - 48;
    return d;
}
 
inline void print(int n, int c){
    register char*= np;
    while(n) *--= n%10 + 48, n/=10;
    register int len = np - p + 1;
    for(;c--;){
        memcpy(osp, p, len);
        osp += len;
        if(osp>=oep){
            fwrite(bufferOut, 1, osp-bufferOut, stdout);
            osp = bufferOut;
        }
    }
}
 
int main(){
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    int N = scan(), i;
    while(N--) count[scan()]++;
    for(i=0;i<LM;++i) if(count[i])
        print(i, count[i]);
    fwrite(bufferOut, 1, osp-bufferOut, stdout);
    return 0;
}
 
cs