平台环境:
WinXP SP2 + VC2005 + Intel Core Duo T2400 @ 1.83GHZ + 1.5GB Mem
测试函数:
1. Run-Time Library
FILE *fopen(
const char *filename,
const char *mode
);
int fclose(
FILE *stream
);
2. Platform SDK
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
BOOL CloseHandle(
HANDLE hObject
);
3. Run-Time Library
FILE *tmpfile( void );
int fclose(
FILE *stream
);
测试方法:
各执行1000,5000,10000次,包括文件打开和文件关闭。
时间使用ftime函数获取。
1000 | AVG | |||
fopen | 406 | 407 | 438 | 417 |
CreateFile | 484 | 407 | 406 | 432 |
tmpfile | 547 | 500 | 516 | 521 |
5000 | ||||
fopen | 2453 | 2531 | 2437 | 2473 |
CreateFile | 2109 | 2313 | 2140 | 2187 |
tmpfile | 1828 | 1875 | 1875 | 1859 |
10000 | ||||
fopen | 6672 | 6719 | 6750 | 6713 |
CreateFile | 6281 | 6484 | 6484 | 6416 |
tmpfile | 3859 | 3750 | 3735 | 3781 |
可以看到tmpfile的效率很高,而且当执行fclose后,这个临时文件会自动被删除,比较适合那些暂时存在的文件。
如果没有fclose的话,直接使用_rmtmp()函数,就会删除当前temp文件夹下的所有由tmpfile创建的文件,但是tmpfile的个数是受限的,MSDN写着是取决与TMP_MAX = 32767,但是我实际测试中达到150左右就会被限制。
CreateFile返回的是Handle,适合用于Platform开发。
fopen比较傻瓜易用,但它已被废弃了,fopen_s是它的安全改进版。
From: http://www.wiskey86.cn/wordpress/?p=64