执行累加语句会使得运行时间变长?

myownroc 2015-12-06 09:24:18
正在研究LZW压缩算法,用listid表示词典的当前下标。
向词典内添加内容后,需要listid++来增加下标的值(40行),但是只要有listid进行累加的语句都会使得运行时间变长(近3000ms),将其注释掉之后程序就快很多了(<400ms),循环中同样有过count计数器用于计算循环次数却不会使程序变慢,求解原因。
其中MAX_VAL = 4096,CHAR_COUNT = 256,测试时文件大小29.7M,循环31233732次。
void LZWCompress::Encode()
{
int i;
int prev; BYTE ch;
int chid = 1;
Entry list[MAX_VAL];
int indexlist[MAX_VAL][CHAR_COUNT];
int listid = TAG_BEGIN, codeid = 0;
memset(list, -1, sizeof(Entry) * MAX_VAL);
memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
code = (int*)malloc(sizeof(int) * size);
DWORD t1 = GetTickCount();
int count = 0;
if (size < 3)
for (i = 0; i < size; i++)
code[codeid++] = (int)stream[i];
else
{
prev = (int)stream[0];
while (true)
{
count++;
if (chid >= size)
{
code[codeid++] = prev;
code[codeid++] = TAG_END;
break;
}
if (listid >= MAX_VAL)
{
code[codeid++] = TAG_NEW;
memset(list, -1, sizeof(Entry) * MAX_VAL);
memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
listid = TAG_BEGIN;
}
ch = stream[chid];
if (indexlist[prev][ch] == -1)
{
list[listid].prev = prev; list[listid].ch = ch;
indexlist[prev][ch] = listid++; // This process must be advanced.
code[codeid++] = prev;
prev = (int)stream[chid];
}
else
prev = indexlist[prev][ch];
chid++;
}
}
printf("%d\n", codeid);
DWORD t2 = GetTickCount();
printf("%d times.\n", count);
printf("Encoding time: %d.\n", t2 - t1);
}
...全文
151 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-12-07
  • 打赏
  • 举报
回复
无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
chehw_1 2015-12-07
  • 打赏
  • 举报
回复
因为这并不是简单的累加。 listid++; 当(listid >= MAX_VAL) 时,就会执行上面第29~35行的代码,其中的两个memset会很耗时。

           if (listid >= MAX_VAL)
            {
                code[codeid++] = TAG_NEW;
                memset(list, -1, sizeof(Entry) * MAX_VAL);
                memset(indexlist, -1, sizeof(int) * MAX_VAL * CHAR_COUNT);
                listid = TAG_BEGIN;
            }
myownroc 2015-12-07
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
你是用什么编译器,作一下性能效率分析,看是什么操作比较耗时间,你代码没具体看,你改变了这一句可能导致提前退出循环等,具体原因你先分析一下
编译器就是vs2005自带的……耗时间的就是累加变量的过程。从逻辑上说,改动那句代码并不会直接跳出循环。
paschen 版主 2015-12-06
  • 打赏
  • 举报
回复
你是用什么编译器,作一下性能效率分析,看是什么操作比较耗时间,你代码没具体看,你改变了这一句可能导致提前退出循环等,具体原因你先分析一下

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧