首页
社区
课程
招聘
[求助]工作中遇到的一个追求速度的算法,国外有人控制在30秒内,我却要6分钟.
发表于: 2011-10-12 18:57 36307

[求助]工作中遇到的一个追求速度的算法,国外有人控制在30秒内,我却要6分钟.

2011-10-12 18:57
36307
收藏
免费 0
支持
分享
最新回复 (85)
雪    币: 1123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
76
黑盒中每一种数值连续出现的次数不一定是相同的.但即使不同,也不会相差太远.
例如:
不会出现的情况: 某处有10000个连续的1,紧接着出现50个连续的2.
常见的情况 : 某处有10000个连续的1,紧接着出现的2可能在7654--13456之间.

我的意思就是利用这个信息来加速。
还有,你写数据时怎么写的?如果先把数据缓存到一定程度再写会比一点一点写快不少。磁盘一次读写的数据
量越大性能越好(速度快而且对硬盘伤害小)。这个也是瓶颈。
当今对于大型系统来说,CPU,内存的速度都不是什么瓶颈了,主要瓶颈在于磁盘和网络的IO操作。
2011-12-25 20:37
0
雪    币: 120
活跃值: (160)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
77
我知道黑盒中的数据总数,然后内存映射文件。。写的时候,发现在x处是分界了,于是
memset(pBuf + pos, byVal,  x2 - x1);  这个应该不影响速度,,
那个连续数只能确定在2W左右。但没有一个具体的范围,想动态调整的话,怕意义不大。
2011-12-25 23:24
0
雪    币: 264
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
78
都是高手,膜拜。
2011-12-27 14:50
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
79
看完这么多高手,小弟深受启发啊啊
2011-12-28 19:02
0
雪    币:
能力值: (RANK: )
在线值:
发帖
回帖
粉丝
80
临时用户好像发不了PM的, 你还是直接PM邀请码给他吧.
2011-12-28 20:50
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
81
看不太懂C++,要求都还不太明白,我想用D写试试
2011-12-29 01:26
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
82
VOID ReadAll(DWORD m_BoxLength)//遍历并保存到文件或内存
{
DWORD dwPos = 0;
DWORD m_Current = 0;
int m_FileLength=0;
char*pFileMem=pFile; //pFile是内存映射的文件缓冲指针
while(m_Current < m_BoxLength)
{  
  BOOL IsEnd = FALSE;
  DWORD m_HeiPos = m_Current + 20000;      //20000为最少重复字符数值
  if(m_HeiPos > m_BoxLength)
  {
   m_HeiPos = m_BoxLength;
   IsEnd = TRUE;
  }
  BYTE m_Vaule = GetPosValue(m_Current);
  if(IsEnd == FALSE)
  {
   while(m_Vaule == GetPosValue(m_HeiPos))
   {
    m_HeiPos += 20000;
    if(m_HeiPos > m_BoxLength)
    {
     m_HeiPos = m_BoxLength;
     IsEnd = TRUE;
     break;
    }  
   }
  }
  if(IsEnd == FALSE)
  {  
   int m_LowPos = m_HeiPos - 20000;
   while(1)
   {
    int m_MidPos = (m_LowPos+m_HeiPos) / 2; //取中间值
    if(m_Vaule == GetPosValue(m_MidPos))
     m_LowPos = m_MidPos;  
    else
     m_HeiPos = m_MidPos;
    if(m_HeiPos = m_LowPos + 1) //修改后代码
    break;
   }
  }
  
  *pFileMem++=m_Vaule;//这一句和下一句完成压缩保存将时间缩短
  *((int*)pFileMem)=m_HeiPos - m_Current
  pFileMem+=4;
  dwPos += (m_HeiPos - m_Current);
  m_Current = m_HeiPos;
}
SaveToFile(pFile,pFileMem-pFile);//在这里一次性保存文件,pFileMem-pFile是文件长度
}

还有你不必将 int m_MidPos = (m_LowPos+m_HeiPos) / 2; //取中间值
修改为int m_MidPos = m_LowPos + (m_HeiPos - m_LowPos) / 2; //修改:取中间值
因为这两者的结果完全相等,而前者速度快

更没必要将  if(m_HeiPos = m_LowPos + 1) //修改后代码

修改为  if (GetPosValue(m_LowPos) != GetPosValue(m_LowPos + 1))//修改这里的退出条件
因为只有高低端数据不相等时才能进入while(1)这个循环,用前者判断足矣,况且你这样一修改,如果GetPosValue非常耗时,就可能使时间慢两倍
自己好好想想吧
2011-12-29 02:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
83
不知问题解决没有?
我是不会..
2011-12-29 12:22
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
84
*pFileMem++=m_Vaule;//这一句和下一句完成压缩保存将时间缩短
  *((int*)pFileMem)=m_HeiPos - m_Current;
他这两句将时间大幅缩短,将文件长度由原来的1G压缩为4000分之一以下,因此读写磁盘的时间缩短了许多,总时间毫无疑问缩短许多,并且遍历方法非常高效,问题应该已经解决
2012-1-8 02:22
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
85
你可以用哈希表,试试!
2012-1-8 21:54
0
雪    币: 62
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
86
慢慢看  慢慢学习  多谢大牛辛勤付出。。。
2012-1-8 22:17
0
游客
登录 | 注册 方可回帖
返回
//