看流星社区

 找回密码
 注册账号
查看: 2263|回复: 0

C++ 读取二进制文件速度测试

[复制链接]

该用户从未签到

发表于 2015-3-31 14:25:08 | 显示全部楼层 |阅读模式
一个二进制文件里有n 个数据,我想要随机读取K个 数据,并存储在内存中。

void  CDataToPyramid::CompareReadingSpeed()
{


    time_t rawtime;
    struct tm*timeinfo;
    time(&rawtime);
    timeinfo=localtime(&rawtime);
    char *nowtime=asctime(timeinfo);
    TCHAR Name[100];

   MultiByteToWideChar(CP_ACP, 0, nowtime, -1, Name, 100);
     OutputDebugString(Name);
     //Sleep(3000);
    int pensity=5;
    float proportion=(float)pensity/10;

    char *path1="D:\\Data\\ReadSpeedTest\\10_14806_132001.dat";
    FILE *mfile=fopen(path1,"rb+");
    if(mfile!=NULL)
    {
        Head head;
        fread(&head,sizeof(Head),1,mfile);
        int count=head.count;
        int Knum=proportion*count;
         CPoints *Cdata=(CPoints*)malloc(sizeof(CPoints)*Knum);
        int* Iarray=new int[Knum];
        ChouXi(Iarray,Knum,count);
        for(int j=0;j<Knum;j++)
        {
            //*****测试一 随机读取  所需时间20 s
            /*
            int xuhao=Iarray[j];
            if(j==0)
            {

            }
            else
            {
                int offset=(Iarray[j]-Iarray[j-1])*sizeof(CPoints);
                fseek(mfile,offset,1);  //文件指针 偏移量  时间差主要消耗在这里!!!!!!!!!!!
            }
            CPoints Ipt;
            fread(&Ipt,sizeof(CPoints),1,mfile);
            memcpy((CPoints*)Cdata+j,&Ipt,sizeof(CPoints));
            */
            //******测试二 顺序读取  所需时间6s
            CPoints Ipt;
            fread(&Ipt,sizeof(CPoints),1,mfile);
            memcpy((CPoints*)Cdata+j,&Ipt,sizeof(CPoints));

        }

        fclose(mfile);

    }
    time_t rawtime1;
    struct tm*timeinfo1;
    time(&rawtime1);
    timeinfo1=localtime(&rawtime1);
    char *nowtime1=asctime(timeinfo1);
    TCHAR Name1[100];

   MultiByteToWideChar(CP_ACP, 0, nowtime1, -1, Name1, 100);
     OutputDebugString(Name1);
    MessageBox(NULL,_T("OVER"),_T("OVER"),NULL);
}
int  CDataToPyramid::bigrand()
{

    return RAND_MAX*rand()+rand();

}
void CDataToPyramid::ChouXi(int* cc,int K,int totalcount)
{
    // 在totalcount 数中,随机产生K个不相同的数
    int index=0;
    if(K!=totalcount)
    {
        for(int i=0;K>0&&i<totalcount;i++)
        {
            if((bigrand()%(totalcount-i))<K)
            {
                cc[index]=i;
                index++;
                K--;
            }
        }
    }
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-27 01:28

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表