Debug和Release下程序性能的“巨大”差异问题

mltong 2011-01-21 11:22:24
情况是这样的:
Release下,右键菜单弹出一个对话框修改信息。发现需要等待1秒多对话框才出来,有明显的停顿。于是切换到Debug下,嘿,竟然很快,是那种正常的速度,一点也没有迟缓。

到对话框的OnInitDialog函数下(这里有比较多的数据初始化),开头是初始化组合框(CComboBox)_resetCombo(),于是进入_resetCombo(),加了简单的时间测试(已经注释掉的)。代码大致如下:

void CGADDialog::_resetComboBox()
{
// DWORD dwStartTime = GetTickCount();

m_comBox.ResetContent();
CString cstrText;

for(int i = 0; i < m_nMaxGADCount; i++)
{
cstrText.Format(_T("%d"), i);
m_comBox.AddString(strText);
}

m_comBox.LimitText(4);
m_comBox.SetCurSel(0);

// DWORD dwEndTime = GetTickCount();
// cstrText.Format(_T("m_nMaxGADCount = %d, %dms"), m_nMaxGADCount, dwEndTime - dwStartTime);
// AfxMessageBox(cstrText);
}


就是这个函数,发现Release下执行时间大概1200ms,而在Debug下只有100ms的样子。那应该就是这个函数的问题。

那我想是不是组合框的内容太多了(其中成员变量 m_nMaxGADCount 在此时是2000)?

于是单独写了一个对话框测试程序,在OnInitDialog里给组合框添加1万条信息(同样,也全是数字编号的),不管Release还是Debug下,都是很快很正常的速度。

于是,我纳闷了。。。
...全文
678 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
mltong 2011-02-09
  • 打赏
  • 举报
回复
可能由于程序太过庞大复杂了,一时难以找到根本的原因。

可能大家提到的,都存在。不过好在还是解决了这个问题(至少从表面上)。

谢谢了!
mltong 2011-02-09
  • 打赏
  • 举报
回复
PS:是比用CString快些,不过还是不够快,仍然能够感觉到有明显的停顿[Quote=引用 23 楼 mltong2008 的回复:]

按照你的方法,我测试了一下,速度的确快了很多。
另外,CString在Release和Debug下的不同也引起了我的兴趣。
谢谢!引用 21 楼 saimen 的回复:

CString cstrText;

for(int i = 0; i < m_nMaxGADCount; i++)
{
cstrText.Format(_T("%d"), i);
m_comBox.AddS……
[/Quote]
xiaohuh421 2011-01-24
  • 打赏
  • 举报
回复
对于Debug与Release有巨大差异的程序 ,就说明你程序本身存在很多的bug,与程序设计有关了. 程序要尽量做到debug与Release版本表现一样.
mltong 2011-01-24
  • 打赏
  • 举报
回复
按照你的方法,我测试了一下,速度的确快了很多。
另外,CString在Release和Debug下的不同也引起了我的兴趣。
谢谢![Quote=引用 21 楼 saimen 的回复:]

CString cstrText;

for(int i = 0; i < m_nMaxGADCount; i++)
{
cstrText.Format(_T("%d"), i);
m_comBox.AddString(strText);
}

在这里取消CString类的应用,完全没有必要让CString来操作内存……
[/Quote]
schlafenhamster 2011-01-22
  • 打赏
  • 举报
回复
好消息告诉一声
HuWenjin 2011-01-22
  • 打赏
  • 举报
回复
CString cstrText;

for(int i = 0; i < m_nMaxGADCount; i++)
{
cstrText.Format(_T("%d"), i);
m_comBox.AddString(strText);
}

在这里取消CString类的应用,完全没有必要让CString来操作内存。

char szIndex[32];
for(int i = 0; i < m_nMaxGADCount; i++)
{
sprintf(szIndex,"%d", i);
m_comBox.AddString(strText);
}


直接用sprintf操作,不分配内存。

CString在Debug和Release模式下运行是不同的,可以查看一下原码。

mltong 2011-01-22
  • 打赏
  • 举报
回复
刚师兄过来,给出了一招:
插入数据前禁止重绘功能,插入完毕后再开启重绘,通过调用基类CWnd::SetRedraw( BOOL bRedraw = TRUE )实现。这个方法之前也想到过,但是一直不相信2000条信息会浪费那么多的时间。

至于高度不一样的问题,勾选了“No integrial height”属性后也变得正常了。但是查看一些使用组合框的程序,几乎没有看到有勾选这个属性的。

嗨,现在只能怀疑是编译器的问题了。
mltong 2011-01-22
  • 打赏
  • 举报
回复
大哥,我想我说的已经够明白了:代码是一模一样的(根本就是一个程序),数据也是一样的。添加完后,组合框都是2000条信息[Quote=引用 18 楼 schlafenhamster 的回复:]

里面项太多了release
debug 呢?
[/Quote]
schlafenhamster 2011-01-22
  • 打赏
  • 举报
回复
里面项太多了release
debug 呢?
mltong 2011-01-22
  • 打赏
  • 举报
回复
已经设置了Vertical scroll属性,而且Debug下的下列高度和资源编辑器中的设置高度差不多的,就是Release下,就很高。。。[Quote=引用 16 楼 schlafenhamster 的回复:]

而Release下,则很高,已经超过了整个对话框的最下面
里面项太多了。
[/Quote]
varding 2011-01-21
  • 打赏
  • 举报
回复
不一定是这个函数的问题,release也可以调试,多设置几个断点看看哪个函数运行的时间长了
或者在每个函数前面都用GetTickCount得到当前时间然后保存到文件里或者显示到窗口上看看哪一个步骤耗时最大再一步步分析
Torch009 2011-01-21
  • 打赏
  • 举报
回复
realese下的变量你都要初始化一下
许文君 2011-01-21
  • 打赏
  • 举报
回复
m_nMaxGADCount是什么,看下两种情况下值是否相同,如同,定位下哪句代码操作耗时了。
Wang471981125 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 mltong2008 的回复:]
情况是这样的:
Release下,右键菜单弹出一个对话框修改信息。发现需要等待1秒多对话框才出来,有明显的停顿。于是切换到Debug下,嘿,竟然很快,是那种正常的速度,一点也没有迟缓。

到对话框的OnInitDialog函数下(这里有比较多的数据初始化),开头是初始化组合框(CComboBox)_resetCombo(),于是进入_resetCombo(),加了简单的时间测试(已经注释掉的……
[/Quote]
有同感呢。Realese和Debug有很大的差别呢
jyh_baoding 2011-01-21
  • 打赏
  • 举报
回复
一般,release更好,你的程序可能调用了一些非法的访问,在DEBUG下,容忍度更高
stonewater 2011-01-21
  • 打赏
  • 举报
回复
不正常啊,
你是只发现了一次,还是每次都这样,
如果只发生一两次,那可能性就太多了
没钱吃饭 2011-01-21
  • 打赏
  • 举报
回复
Debug 与 release 。。。。。。。。。。。。。
schlafenhamster 2011-01-21
  • 打赏
  • 举报
回复
而Release下,则很高,已经超过了整个对话框的最下面
里面项太多了。
mltong 2011-01-21
  • 打赏
  • 举报
回复
刚刚又发现一种表象。之所以说是表象,是因为不能确定和之前的所说是否有关:
就是这个组合框在点击展开的时候,高度是不一样的。
Debug下应该是和对话框资源中的高度一样,而Release下,则很高,已经超过了整个对话框的最下面。
mltong 2011-01-21
  • 打赏
  • 举报
回复
m_nMaxGADCount就是组合框中最大的信息条数。例如如果是100,组合框下就是0,1,2……99。
耗时,就是上面那个循环了。
[Quote=引用 5 楼 xuddk727 的回复:]

m_nMaxGADCount是什么,看下两种情况下值是否相同,如同,定位下哪句代码操作耗时了。
[/Quote]
加载更多回复(6)

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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