关于程序的效率.请大侠帮我看一下这段程序.
请各位帮我看一下这段程序的瓶颈在哪儿.
有没有什么优化的办法.
我测试了一下这段程序运行时间大概16ms左右.不知道算不算慢.
谢谢!
sbuffer =(char *)malloc(MAXLENGTH);//MAXLENGTH = 1024memset(sbuffer,0,MAXLENGTH);ebuffer =(char *)malloc(MAXLENGTH);memset(ebuffer,0,MAXLENGTH);for(csp=pHead;csp!=NULL;csp=csp->next)//重头开始遍历整个链表.暂时不超过100个节点.{ if(csp->enterFlag == TRUE && csp!=pHead) { GetTextExtentPoint32(hdc,csp->prior->str,strlen(csp->prior->str),&csize); ilength = csize.cx; for(i=1;i<strlen(csp->str);i++) { if(*(csp->str+i) == ' ' || i
sbuffer =(char *)malloc(MAXLENGTH);//MAXLENGTH = 1024memset(sbuffer,0,MAXLENGTH);ebuffer =(char *)malloc(MAXLENGTH);//(如果MAXLENGTH是常量)都知道长度了还动态分配干什么?
[解决办法]
把所有的strlen(csp->str)进行替换
这个开销很大
例如,申请一个临时变量nLenTemp = strlen(csp->str)
这会提高你的效率
[解决办法]
其实,要想提高效率,你这个设计本身就有问题,整个文本存储在一个固定的缓冲里不需要修改,csp那个链表的结点中只是保存一个格式
随便先改了一下:
for (csp = pHead->next; csp != NULL; csp = csp->next){ if(csp->enterFlag) { int curlen = strlen(csp->str); int prilen = strlen(csp->prior->str); GetTextExtentPoint32(hdc, csp->prior->str, prilen, &csize); ilength = csize.cx; char* pos = strstr(csp->str + 1, " "); if (pos) { GetTextExtentPoint32(hdc, csp->str, pos - csp->str, &csize); if (csize.cx + ilength <= sp.cxClient - sp.cxChar) { memcpy(csp->prior->str + prilen, csp->str, pos - csp->str); csp->prior->str[prilen + pos - csp->str] = '\0'; memmov(csp->str, pos, pos - csp->str); /* if(vp.iVertPos == 0 && csp->LineNum == vp.curRow && col >= vp.curCol) else if(vp.iVertPos == 0 && csp->LineNum == vp.curRow && col < vp.curCol) else if(vp.iVertPos > 0 && csp->LineNum == vp.curRow + vp.iVertPos && col >= vp.curCol) else if(vp.iVertPos > 0 && csp->LineNum == vp.curRow + vp.iVertPos && col < vp.curCol) */ } } if (curlen == 0) { temp = csp; csp = csp->prior; /* if(vp.iVertPos==0 && temp->LineNum < vp.curRow) else if(vp.iVertPos==0 && temp->LineNum >= vp.curRow) else if(vp.iVertPos>0 && vp.iVertPos<Range && temp->LineNum < vp.curRow+vp.iVertPos) else if(vp.iVertPos>0 && vp.iVertPos<Range && temp->LineNum >= vp.curRow+vp.iVertPos) else if(vp.iVertPos==Range && temp->LineNum < vp.curRow+vp.iVertPos) else if(vp.iVertPos==Range && temp->LineNum >= vp.curRow+vp.iVertPos) */ RowDelete(hwnd, pHead, temp->LineNum); } vp.iPage = sp.cxBuffer ; vp.iMaxLength = max(vp.iMaxLength, curlen); }}
[解决办法]
如果效率差距过大,还是考虑改变算法吧。
可以读一下开源的文本编译器,看看人家怎么写的~
嘿嘿