测试结果:
1
Path: /Program/ReadSpeed/data.txt
Size: 2097152(Byte)
API: 61
MFC: 182
C Language: 845
2
Path: /ResidentFlash/ReadSpeed/data.txt
Size: 2097152(Byte)
API: 312
MFC: 2341
C Language: 1388
//API
DWORD SamsungAPI_ReadTest(CString szFileName)
{
//Test data
const DWORD READ_BUF_SIZE = 4096*4;
unsigned char *sReadBuf;
sReadBuf = new unsigned char[(int)READ_BUF_SIZE];
memset(sReadBuf, 0x00, (int)READ_BUF_SIZE);
//---------------- read --------------------------------
HANDLE hFile;
WIN32_FIND_DATA wfd;
DWORD dwReadTicks = 0;
hFile = CreateFile(szFileName,GENERIC_READ,0,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING,NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return dwReadTicks;
}
FindFirstFile(szFileName,&wfd);//大于4G的文件才用到高位
DWORD nSize = wfd.nFileSizeLow;
DWORD dwRead = 0;
long CountTick = 0;
while(nSize>0)
{
CountTick = GetTickCount(); // Start!
ReadFile(hFile, sReadBuf, (int)READ_BUF_SIZE, &dwRead, NULL); // To move the file pointer is not needed for performance.
dwReadTicks += GetTickCount() - CountTick; // End!
nSize -= dwRead;
};
CloseHandle(hFile);
delete []sReadBuf;
return dwReadTicks;
}
// MFC
long MFC_ReadTest(CString szPath)
{
long lStartTime = 0, lReadTimeTotal = 0;
const int READ_TIMES = 1;
for (int m = 0; m < READ_TIMES; m++) //多读几次
{
long lTotalLen = 0;
//读出数据
CFile file;
file.Open(szPath, CFile::modeRead);
if (!file)
{
AfxMessageBox(_T("读取文件失败!"));
return lReadTimeTotal;
}
const int READ_BUF_SIZE = 4096*4;
char sReadBuf[READ_BUF_SIZE];
//读时测试
lStartTime = GetTickCount();
int iReadLen = file.Read(sReadBuf, READ_BUF_SIZE);
lReadTimeTotal += GetTickCount() - lStartTime;
while (iReadLen > 0)
{
lTotalLen += iReadLen;
//看是否还有剩余数据
lStartTime = GetTickCount();
iReadLen = file.Read(sReadBuf, READ_BUF_SIZE);
lReadTimeTotal += GetTickCount() - lStartTime;
}
file.Close();
}
return lReadTimeTotal;
}
//C
DWORD CLanguage_ReadTest(char szPath[MAX_PATH])
{
FILE *f = fopen(szPath,"r");
DWORD dwReadTicks = 0;
if(f)
{
const DWORD READ_BUF_SIZE = 4096*4;
char *sReadBuf = new char[(int)READ_BUF_SIZE];
memset(sReadBuf, 0, (int)READ_BUF_SIZE);
long CountTick = 0;
CountTick = GetTickCount();
while( fgets(sReadBuf,READ_BUF_SIZE,f))//按行读取
{
dwReadTicks += GetTickCount() - CountTick;
CountTick = GetTickCount();
}
delete []sReadBuf;
fclose(f);
}
return dwReadTicks;
}