关于CFile.Read读写速度会大幅度变换的问题,有遇到的吗?
本帖最后由 asjmasjm 于 2012-10-25 13:04:31 编辑 用CFile试图将8幅一组,每幅2.25MB的BMP图片依次读入内存中,再调用OleLoadPicture进行显示,是通过按钮实现的,每按一次,重新读入新的8幅一组,同样大小的图片;
在读入的过程中通过测试,发现在读前几十幅图片的时候,每幅不到1ms,每组大概10ms,就能读入内存中;而一旦达到一定的读入量(比如30组),耗时会突然增加到40-50ms一幅,每组需要500ms左右,并且之后再读就一直保持这个速度;
而且有个现象的是 比如1-30组图片都是每组10ms的速度,继续读30-40开始变成每组500ms,如果此时再调入10-40之间的任何一组图片,读入时间又变成每组10ms左右;感觉像是有个内部缓冲,会把之前一定量的数据(大概是35组图片 500MB左右的空间)保存起来 而一旦调用的图片数据不在其中 速度就会减慢;
不像是内存泄露之类的问题 因为速度之后也一直是每组500ms 运行了很久 也没有死机之类的
代码如下:
void OnBtnFunc(......)//是个按钮事件响应函数
{
(顺序执行8次)//
{
try
{
CFile File;
if( !File.Open(strFileName, CFile::modeRead) )
return;
CFileStatus Status;
CFile::GetStatus(strFileName, Status);
int iSize = Status.m_size;
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, iSize);
LPVOID pvData = NULL;
if (hGlobal == NULL)
return;
if ( (pvData = ::GlobalLock(hGlobal) ) == NULL)
return;
//start = clock();
File.Read(pvData, iSize);//这里读入单幅数据,先是耗时1ms,之后会变为50ms左右
//end = clock();
::GlobalUnlock(hGlobal);
::CreateStreamOnHGlobal(hGlobal, TRUE, &m_pStm);
if( m_pPic != NULL )
{
m_pPic->Release();
}
if (!SUCCEEDED(::OleLoadPicture(m_pStm, iSize, TRUE, IID_IPicture, (LPVOID*)&m_pPic)))
{
return;
}
::GlobalFree(hGlobal);
m_pStm->Release();
}
catch (...)
{
//......
}
}
}
[解决办法]
用内存映射文件读图片数据试试
[解决办法]
不会是磁盘上一个扇区已经读完或写满,要换下一个扇区了?