プロファイラー gprofの使い方
スポンサーリンク
このドキュメントの内容は、以下の通りです。
はじめに
少し忘れかけてきたので、 gprof の覚書を書くことにしました。
main.c
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/fcntl.h> #include <sys/types.h> #include <err.h> const unsigned long max = 65530; #define MAX_BUF 1024 void Write () { int fd = open ("/dev/null", O_WRONLY); if (fd == -1) err (1, "can not open /dev/null"); unsigned long i; char buf[MAX_BUF] = { 0 }; for (i = 0; i < max; i++) if (write (fd, buf, sizeof (buf) ) == -1) err (1, "write error"); close (fd); } void Fwrite () { FILE *fp = fopen ("/dev/null", "w"); if (NULL == fp) err (1, "can not fopen /dev/null"); unsigned long i; char buf[MAX_BUF] = { 0 }; for (i = 0; i < max; i++) if (fwrite (buf, 1, sizeof (buf), fp) == -1) err (1, "fwrite error"); fclose (fp); } // Function int main(int argc, char *argv[]) {{{ int main(int argc, char *argv[]) { puts ("Write"); Write (); puts ("Fwrite"); Fwrite (); puts ("done"); exit (EXIT_SUCCESS); } // }}}
コンパイル、実行
gcc -O -Wall -g -pg main.c ./a.out gprof ./a.out
結果
書き込みサイズが小さいとバッファリングする fwrite のほうが write より早い。gprof ./a.out None call graph profile: The sum of self and descendents is the major sort for this listing. function entries: index the index of the function in the call graph listing, as an aid to locating it (see below). %time the percentage of the total time of the program accounted for by this function and its descendents. self the number of seconds spent in this function itself. descendents the number of seconds spent in the descendents of this function on behalf of this function. called the number of times this function is called (other than recursive calls). self the number of times this function calls itself recursively. name the name of the function, with an indication of its membership in a cycle, if any. index the index of the function in the call graph listing, as an aid to locating it. parent listings: self* the number of seconds of this function's self time which is due to calls from this parent. descendents* the number of seconds of this function's descendent time which is due to calls from this parent. called** the number of times this function is called by this parent. This is the numerator of the fraction which divides up the function's time to its parents. total* the number of times this function was called by all of its parents. This is the denominator of the propagation fraction. parents the name of this parent, with an indication of the parent's membership in a cycle, if any. index the index of this parent in the call graph listing, as an aid in locating it. children listings: self* the number of seconds of this child's self time which is due to being called by this function. descendent* the number of seconds of this child's descendent's time which is due to being called by this function. called** the number of times this child is called by this function. This is the numerator of the propagation fraction for this child. total* the number of times this child is called by all functions. This is the denominator of the propagation fraction. children the name of this child, and an indication of its membership in a cycle, if any. index the index of this child in the call graph listing, as an aid to locating it. * these fields are omitted for parents (or children) in the same cycle as the function. If the function (or child) is a member of a cycle, the propagated times and propagation denominator represent the self time and descendent time of the cycle as a whole. ** static-only parents and children are indicated by a call count of 0. cycle listings: the cycle as a whole is listed with the same fields as a function entry. Below it are listed the members of the cycle, and their contributions to the time and call counts of the cycle. granularity: each sample hit covers 4 byte(s) for 2.38% of 0.06 seconds called/total parents index %time self descendents called+self name index called/total children 0.00 0.06 1/1 _start [2] [1] 100.0 0.00 0.06 1 main [1] 0.00 0.04 1/1 Write [4] 0.00 0.03 1/1 Fwrite [5] 0.00 0.00 3/3 puts [12] 0.00 0.00 1/1 exit [27] ----------------------------------------------- <spontaneous> [2] 100.0 0.00 0.06 _start [2] 0.00 0.06 1/1 main [1] ----------------------------------------------- 0.01 0.00 16386/81916 _swrite [10] 0.04 0.00 65530/81916 Write [4] [3] 71.4 0.05 0.00 81916 _write [3] ----------------------------------------------- 0.00 0.04 1/1 main [1] [4] 57.1 0.00 0.04 1 Write [4] 0.04 0.00 65530/81916 _write [3] 0.00 0.00 1/2 open [24] 0.00 0.00 1/3 memset [15] 0.00 0.00 1/2 close [18] ----------------------------------------------- 0.00 0.03 1/1 main [1] [5] 42.9 0.00 0.03 1 Fwrite [5] 0.00 0.03 65530/65530 fwrite [6] 0.00 0.00 1/1 fclose [13] 0.00 0.00 1/1 fopen [28] 0.00 0.00 1/3 memset [15] ----------------------------------------------- 0.00 0.03 65530/65530 Fwrite [5] [6] 42.9 0.00 0.03 65530 fwrite [6] 0.00 0.02 65530/65533 __sfvwrite [7] ----------------------------------------------- 0.00 0.00 3/65533 puts [12] 0.00 0.02 65530/65533 fwrite [6] [7] 40.5 0.00 0.02 65533 __sfvwrite [7] 0.01 0.00 81918/81918 memcpy [8] 0.00 0.01 16385/16385 __fflush [11] 0.00 0.00 6/6 memchr [14] 0.00 0.00 2/2 __swsetup [236] ----------------------------------------------- 0.01 0.00 81918/81918 __sfvwrite [7] [8] 21.4 0.01 0.00 81918 memcpy [8] ----------------------------------------------- 0.00 0.00 1/16386 fclose [13] 0.00 0.01 16385/16386 __fflush [11] [9] 14.3 0.00 0.01 16386 __sflush [9] 0.00 0.01 16386/16386 _swrite [10] ----------------------------------------------- 0.00 0.01 16386/16386 __sflush [9] [10] 14.3 0.00 0.01 16386 _swrite [10] 0.01 0.00 16386/81916 _write [3] 0.00 0.00 16386/16386 __swrite [233] ----------------------------------------------- 0.00 0.01 16385/16385 __sfvwrite [7] [11] 14.3 0.00 0.01 16385 __fflush [11] 0.00 0.01 16385/16386 __sflush [9] ----------------------------------------------- 0.00 0.00 3/3 main [1] [12] 0.0 0.00 0.00 3 puts [12] 0.00 0.00 3/65533 __sfvwrite [7] ----------------------------------------------- 0.00 0.00 1/1 Fwrite [5] [13] 0.0 0.00 0.00 1 fclose [13] 0.00 0.00 1/16386 __sflush [9] 0.00 0.00 1/1 free [29] 0.00 0.00 1/2 close [18] 0.00 0.00 1/1 __sclose [240] ----------------------------------------------- 0.00 0.00 6/6 __sfvwrite [7] [14] 0.0 0.00 0.00 6 memchr [14] ----------------------------------------------- 0.00 0.00 1/3 Write [4] 0.00 0.00 1/3 Fwrite [5] 0.00 0.00 1/3 __sfp [242] [15] 0.0 0.00 0.00 3 memset [15] ----------------------------------------------- 0.00 0.00 1/3 free [29] 0.00 0.00 2/3 malloc [22] [16] 0.0 0.00 0.00 3 pubrealloc [16] 0.00 0.00 2/2 imalloc [20] 0.00 0.00 1/1 ifree [30] ----------------------------------------------- 0.00 0.00 2/2 malloc_pages [23] [17] 0.0 0.00 0.00 2 brk [17] ----------------------------------------------- 0.00 0.00 1/2 Write [4] 0.00 0.00 1/2 fclose [13] [18] 0.0 0.00 0.00 2 close [18] ----------------------------------------------- 0.00 0.00 2/2 __swhatbuf [235] [19] 0.0 0.00 0.00 2 fstat [19] ----------------------------------------------- 0.00 0.00 2/2 pubrealloc [16] [20] 0.0 0.00 0.00 2 imalloc [20] 0.00 0.00 2/2 malloc_pages [23] ----------------------------------------------- 0.00 0.00 2/2 __smakebuf [234] [21] 0.0 0.00 0.00 2 isatty [21] 0.00 0.00 2/2 tcgetattr [26] ----------------------------------------------- 0.00 0.00 2/2 __smakebuf [234] [22] 0.0 0.00 0.00 2 malloc [22] 0.00 0.00 2/3 pubrealloc [16] ----------------------------------------------- 0.00 0.00 2/2 imalloc [20] [23] 0.0 0.00 0.00 2 malloc_pages [23] 0.00 0.00 2/2 sbrk [25] 0.00 0.00 2/2 brk [17] ----------------------------------------------- 0.00 0.00 1/2 Write [4] 0.00 0.00 1/2 fopen [28] [24] 0.0 0.00 0.00 2 open [24] ----------------------------------------------- 0.00 0.00 2/2 malloc_pages [23] [25] 0.0 0.00 0.00 2 sbrk [25] 0.00 0.00 1/1 __error_unthreaded [239] ----------------------------------------------- 0.00 0.00 2/2 isatty [21] [26] 0.0 0.00 0.00 2 tcgetattr [26] 0.00 0.00 2/2 __sys_ioctl [237] ----------------------------------------------- 0.00 0.00 1/1 main [1] [27] 0.0 0.00 0.00 1 exit [27] 0.00 0.00 1/1 __cxa_finalize [238] ----------------------------------------------- 0.00 0.00 1/1 Fwrite [5] [28] 0.0 0.00 0.00 1 fopen [28] 0.00 0.00 1/1 __sflags [241] 0.00 0.00 1/1 __sfp [242] 0.00 0.00 1/2 open [24] ----------------------------------------------- 0.00 0.00 1/1 fclose [13] [29] 0.0 0.00 0.00 1 free [29] 0.00 0.00 1/3 pubrealloc [16] ----------------------------------------------- 0.00 0.00 1/1 pubrealloc [16] [30] 0.0 0.00 0.00 1 ifree [30] ----------------------------------------------- 0.00 0.00 1/1 _mcleanup (245) [31] 0.0 0.00 0.00 1 moncontrol [31] 0.00 0.00 1/1 profil [32] ----------------------------------------------- 0.00 0.00 1/1 moncontrol [31] [32] 0.0 0.00 0.00 1 profil [32] ----------------------------------------------- 0.00 0.00 1/1 _mcleanup (245) [33] 0.0 0.00 0.00 1 sysctl [33] ----------------------------------------------- 0.00 0.00 16386/16386 _swrite [10] [233] 0.0 0.00 0.00 16386 __swrite [233] ----------------------------------------------- 0.00 0.00 2/2 __swsetup [236] [234] 0.0 0.00 0.00 2 __smakebuf [234] 0.00 0.00 2/2 __swhatbuf [235] 0.00 0.00 2/2 malloc [22] 0.00 0.00 2/2 isatty [21] ----------------------------------------------- 0.00 0.00 2/2 __smakebuf [234] [235] 0.0 0.00 0.00 2 __swhatbuf [235] 0.00 0.00 2/2 fstat [19] ----------------------------------------------- 0.00 0.00 2/2 __sfvwrite [7] [236] 0.0 0.00 0.00 2 __swsetup [236] 0.00 0.00 2/2 __smakebuf [234] 0.00 0.00 1/1 __sinit [243] ----------------------------------------------- 0.00 0.00 2/2 tcgetattr [26] [237] 0.0 0.00 0.00 2 __sys_ioctl [237] ----------------------------------------------- 0.00 0.00 1/1 exit [27] [238] 0.0 0.00 0.00 1 __cxa_finalize [238] 0.00 0.00 1/1 _mcleanup (245) ----------------------------------------------- 0.00 0.00 1/1 sbrk [25] [239] 0.0 0.00 0.00 1 __error_unthreaded [239] ----------------------------------------------- 0.00 0.00 1/1 fclose [13] [240] 0.0 0.00 0.00 1 __sclose [240] ----------------------------------------------- 0.00 0.00 1/1 fopen [28] [241] 0.0 0.00 0.00 1 __sflags [241] ----------------------------------------------- 0.00 0.00 1/1 fopen [28] [242] 0.0 0.00 0.00 1 __sfp [242] 0.00 0.00 1/3 memset [15] ----------------------------------------------- 0.00 0.00 1/1 __swsetup [236] [243] 0.0 0.00 0.00 1 __sinit [243] ----------------------------------------------- 0.00 0.00 1/1 _mcleanup (245) [244] 0.0 0.00 0.00 1 __sysctl [244] ----------------------------------------------- flat profile: % the percentage of the total running time of the time program used by this function. cumulative a running sum of the number of seconds accounted seconds for by this function and those listed above it. self the number of seconds accounted for by this seconds function alone. This is the major sort for this listing. calls the number of times this function was invoked, if this function is profiled, else blank. self the average number of milliseconds spent in this ms/call function per call, if this function is profiled, else blank. total the average number of milliseconds spent in this ms/call function and its descendents per call, if this function is profiled, else blank. name the name of the function. This is the minor sort for this listing. The index shows the location of the function in the gprof listing. If the index is in parenthesis it shows where it would appear in the gprof listing if it were to be printed. granularity: each sample hit covers 4 byte(s) for 1.32% of 0.11 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 44.7 0.05 0.05 .mcount (34) 39.5 0.10 0.05 81916 0.00 0.00 _write [3] 11.8 0.11 0.01 81918 0.00 0.00 memcpy [8] 2.6 0.11 0.00 65533 0.00 0.00 __sfvwrite [7] 1.3 0.11 0.00 65530 0.00 0.00 fwrite [6] 0.0 0.11 0.00 16386 0.00 0.00 __sflush [9] 0.0 0.11 0.00 16386 0.00 0.00 __swrite [233] 0.0 0.11 0.00 16386 0.00 0.00 _swrite [10] 0.0 0.11 0.00 16385 0.00 0.00 __fflush [11] 0.0 0.11 0.00 6 0.00 0.00 memchr [14] 0.0 0.11 0.00 3 0.00 0.00 memset [15] 0.0 0.11 0.00 3 0.00 0.00 pubrealloc [16] 0.0 0.11 0.00 3 0.00 0.00 puts [12] 0.0 0.11 0.00 2 0.00 0.00 __smakebuf [234] 0.0 0.11 0.00 2 0.00 0.00 __swhatbuf [235] 0.0 0.11 0.00 2 0.00 0.00 __swsetup [236] 0.0 0.11 0.00 2 0.00 0.00 __sys_ioctl [237] 0.0 0.11 0.00 2 0.00 0.00 brk [17] 0.0 0.11 0.00 2 0.00 0.00 close [18] 0.0 0.11 0.00 2 0.00 0.00 fstat [19] 0.0 0.11 0.00 2 0.00 0.00 imalloc [20] 0.0 0.11 0.00 2 0.00 0.00 isatty [21] 0.0 0.11 0.00 2 0.00 0.00 malloc [22] 0.0 0.11 0.00 2 0.00 0.00 malloc_pages [23] 0.0 0.11 0.00 2 0.00 0.00 open [24] 0.0 0.11 0.00 2 0.00 0.00 sbrk [25] 0.0 0.11 0.00 2 0.00 0.00 tcgetattr [26] 0.0 0.11 0.00 1 0.00 27.03 Fwrite [5] 0.0 0.11 0.00 1 0.00 36.03 Write [4] 0.0 0.11 0.00 1 0.00 0.00 __cxa_finalize [238] 0.0 0.11 0.00 1 0.00 0.00 __error_unthreaded [239] 0.0 0.11 0.00 1 0.00 0.00 __sclose [240] 0.0 0.11 0.00 1 0.00 0.00 __sflags [241] 0.0 0.11 0.00 1 0.00 0.00 __sfp [242] 0.0 0.11 0.00 1 0.00 0.00 __sinit [243] 0.0 0.11 0.00 1 0.00 0.00 __sysctl [244] 0.0 0.11 0.00 1 0.00 0.00 _mcleanup (245) 0.0 0.11 0.00 1 0.00 0.00 exit [27] 0.0 0.11 0.00 1 0.00 0.00 fclose [13] 0.0 0.11 0.00 1 0.00 0.00 fopen [28] 0.0 0.11 0.00 1 0.00 0.00 free [29] 0.0 0.11 0.00 1 0.00 0.00 ifree [30] 0.0 0.11 0.00 1 0.00 63.06 main [1] 0.0 0.11 0.00 1 0.00 0.00 moncontrol [31] 0.0 0.11 0.00 1 0.00 0.00 profil [32] 0.0 0.11 0.00 1 0.00 0.00 sysctl [33] Index by function name (34) .mcount [237] __sys_ioctl [1] main [5] Fwrite [244] __sysctl [22] malloc [4] Write (245) _mcleanup [23] malloc_pages [238] __cxa_finalize [10] _swrite [14] memchr [239] __error_unthreaded [3] _write [8] memcpy [11] __fflush [17] brk [15] memset [240] __sclose [18] close [31] moncontrol [241] __sflags [27] exit [24] open [9] __sflush [13] fclose [32] profil [242] __sfp [28] fopen [16] pubrealloc [7] __sfvwrite [29] free [12] puts [243] __sinit [19] fstat [25] sbrk [234] __smakebuf [6] fwrite [33] sysctl [235] __swhatbuf [30] ifree [26] tcgetattr [233] __swrite [20] imalloc [236] __swsetup [21] isatty
main.cc の buf サイズ 255 を 65535 にしてみると
gprof -l -b a.out
書き込むバッファサイズが大きいほうが write は fwrite よりも早くなる。
None granularity: each sample hit covers 4 byte(s) for 0.10% of 1.48 seconds % cumulative self self total time seconds seconds calls ms/call ms/call name 52.2 0.77 0.77 1113998 0.00 0.00 _write [6] 36.9 1.32 0.55 .mcount (35) 8.6 1.45 0.13 131035 0.00 0.00 memcpy [8] 1.1 1.47 0.02 1048468 0.00 0.00 _swrite [7] 1.0 1.48 0.02 65533 0.00 0.01 __sfvwrite [3] 0.1 1.48 0.00 1048468 0.00 0.00 __swrite [12] 0.0 1.48 0.00 65530 0.00 0.01 fwrite [5] 0.0 1.48 0.00 65518 0.00 0.00 __sflush [9] 0.0 1.48 0.00 65517 0.00 0.00 __fflush [10] 0.0 1.48 0.00 6 0.00 0.00 memchr [15] 0.0 1.48 0.00 3 0.00 0.00 memset [16] 0.0 1.48 0.00 3 0.00 0.00 pubrealloc [17] 0.0 1.48 0.00 3 0.00 0.01 puts [13] 0.0 1.48 0.00 2 0.00 0.00 __smakebuf [234] 0.0 1.48 0.00 2 0.00 0.00 __swhatbuf [235] 0.0 1.48 0.00 2 0.00 0.00 __swsetup [236] 0.0 1.48 0.00 2 0.00 0.00 __sys_ioctl [237] 0.0 1.48 0.00 2 0.00 0.00 brk [18] 0.0 1.48 0.00 2 0.00 0.00 close [19] 0.0 1.48 0.00 2 0.00 0.00 fstat [20] 0.0 1.48 0.00 2 0.00 0.00 imalloc [21] 0.0 1.48 0.00 2 0.00 0.00 isatty [22] 0.0 1.48 0.00 2 0.00 0.00 malloc [23] 0.0 1.48 0.00 2 0.00 0.00 malloc_pages [24] 0.0 1.48 0.00 2 0.00 0.00 open [25] 0.0 1.48 0.00 2 0.00 0.00 sbrk [26] 0.0 1.48 0.00 2 0.00 0.00 tcgetattr [27] 0.0 1.48 0.00 1 0.00 889.82 Fwrite [4] 0.0 1.48 0.00 1 0.00 45.58 Write [11] 0.0 1.48 0.00 1 0.00 0.00 __cxa_finalize [238] 0.0 1.48 0.00 1 0.00 0.00 __error_unthreaded [239] 0.0 1.48 0.00 1 0.00 0.00 __sclose [240] 0.0 1.48 0.00 1 0.00 0.00 __sflags [241] 0.0 1.48 0.00 1 0.00 0.00 __sfp [242] 0.0 1.48 0.00 1 0.00 0.00 __sinit [243] 0.0 1.48 0.00 1 0.00 0.00 __sysctl [244] 0.0 1.48 0.00 1 0.00 0.00 _mcleanup (245) 0.0 1.48 0.00 1 0.00 0.00 exit [28] 0.0 1.48 0.00 1 0.00 0.00 fclose [14] 0.0 1.48 0.00 1 0.00 0.00 fopen [29] 0.0 1.48 0.00 1 0.00 0.00 free [30] 0.0 1.48 0.00 1 0.00 0.00 ifree [31] 0.0 1.48 0.00 1 0.00 935.44 main [1] 0.0 1.48 0.00 1 0.00 0.00 moncontrol [32] 0.0 1.48 0.00 1 0.00 0.00 profil [33] 0.0 1.48 0.00 1 0.00 0.00 sysctl [34] Index by function name (35) .mcount [237] __sys_ioctl [1] main [4] Fwrite [244] __sysctl [23] malloc [11] Write (245) _mcleanup [24] malloc_pages [238] __cxa_finalize [7] _swrite [15] memchr [239] __error_unthreaded [6] _write [8] memcpy [10] __fflush [18] brk [16] memset [240] __sclose [19] close [32] moncontrol [241] __sflags [28] exit [25] open [9] __sflush [14] fclose [33] profil [242] __sfp [29] fopen [17] pubrealloc [3] __sfvwrite [30] free [13] puts [243] __sinit [20] fstat [26] sbrk [234] __smakebuf [5] fwrite [34] sysctl [235] __swhatbuf [31] ifree [27] tcgetattr [12] __swrite [21] imalloc [236] __swsetup [22] isatty
スポンサーリンク
スポンサーリンク
いつもシェア、ありがとうございます!
もっと情報を探しませんか?
関連記事
最近の記事
- パナソニック ジェットウォッシャードルツ EW-DJ61-Wのホースの修理
- LinuxセキュリティモジュールIntegrity Policy Enforcement
- アマゾンのEcho Show 5を買ったのでレビューします
- アマゾンのサイバーマンデーはAlexa Echo Show 5が安い
- Android スマートフォン OnePlus 7T と OnePlus 7の違い
- Android スマートフォン OnePlus 7 をAndroid10にアップデートしてみた
- クレジットカードのバーチャルカードの比較のまとめ
- 活動量計 Xiaomi Mi Band 4を買ってみたのでレビュー
- Android スマートフォン OnePlus 7 のレビュー
- AliExpressでスマートフォンを買い物してみた
- パソコンのホコリ対策 レンジフードフィルターと養生テープ
- 80PLUS GOLDのPC電源ユニットAntec NeoEco 750 Goldのレビュー
- イギリスの付加価値税 VAT は払い戻しを受けられる
- イギリスのロンドンでスーツケースなど荷物を預けられる場所は
- イギリスのロンドンで地下鉄やバスに乗るならオイスターカードを使おう
- イギリスのヒースロー空港からロンドン市内への行き方
- 航空便でほかの航空会社に乗り継ぎがある場合のオンラインチェックイン
- SFC会員がANA便ではなくベトナム航空のコードシェアを試して解ったこと
- ベトナムの入国審査でeチケットの掲示が必要だった話
- シアトルの交通ICカードはオルカカード(Orca)です
人気のページ
- Windows7 IME 辞書ツールで単語の登録に失敗しました
- C言語 popen()でコマンドを実行して出力を読み込む
- Windows7で休止状態にする方法
- CentOS MySQLの起動、停止、再起動
- loggerコマンドでsyslogにエラーを出力する方法
- パソコンパーツの買取をしてくれる店のまとめ
- Java Mapの使い方 get(),put(),remove(),size(),clear()
- 楽天のRポイントカードを作ってみた
- iPhone 5 から iPhone 6 に乗り換えたのでレビュー
- netstatコマンドのステータスの意味
スポンサーリンク
過去ログ
2020 : 01 02 03 04 05 06 07 08 09 10 11 122019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12