- 论坛徽章:
- 0
|
这个是我做磁盘预读时的代码:其中第一个int代表磁盘偏移量,第二个int代表读取长度,如果找到有连续的数就说明要预读.没有就不管,因为本身是为了提高磁盘的读效率,所以这里的查找本身效率也要非常的高,我下面的算法就有缺陷,为了效率抛弃了一些满足要求的值,但是也没办法,所有想问问坛子里的各位兄弟有更好的想法没有~~~希望不吝赐教哈
- #include <iostream>
- using namespace std;
- typedef struct _ReadAheadInf
- {
- int QuadPart;
- int Length;
- }ReadAheadInf, *P_ReadAheadInf;
- const int ReadAheadInfArryNum=9;
- const int SeriesNum=3;
- ReadAheadInf pReadAheadInfArry[ReadAheadInfArryNum]={{1,1},{2,1},{3,2},{3,1},{12,3},{4,1},{8,1},{9,1},{11,1}};
- P_ReadAheadInf pReadAheadInfArryEdit=pReadAheadInfArry+8; //指向队列的尾巴
- int main(int argc, char *argv[])
- {
- int i=0,j=0,iCheckOk=1,len=0;
- P_ReadAheadInf pTempBase=NULL;
- P_ReadAheadInf pTempRun=NULL;
- while(1)
- {
- pTempBase=(pReadAheadInfArryEdit-SeriesNum<pReadAheadInfArry)? \
- (pReadAheadInfArry+ReadAheadInfArryNum-(SeriesNum-(pReadAheadInfArryEdit-pReadAheadInfArry))):(pReadAheadInfArryEdit-SeriesNum);
- for(i=0;i<ReadAheadInfArryNum-SeriesNum+1;++i)
- {
- pTempRun=pTempBase+1;
- iCheckOk=1;
- len=pTempBase->Length;
- for(j=0;j<i+SeriesNum-1;++j)
- {
- //判断越界
- if(pTempRun-pReadAheadInfArry>=ReadAheadInfArryNum)
- pTempRun=pReadAheadInfArry;
- //判断连续
- if(pTempBase->Length+pTempBase->QuadPart==pTempRun++->QuadPart)
- {
- pTempBase->Length+=(pTempRun-1)->Length;
- if(++iCheckOk==SeriesNum)
- {
- (pTempRun-1)->QuadPart=-1;//找到
- break;
- }
- }
- }
- pTempBase->Length=len;
- //判断越界
- if(--pTempBase<pReadAheadInfArry)
- pTempBase=pReadAheadInfArry+ReadAheadInfArryNum-1;
- }
- }
- }
复制代码 |
|