无意中发现的一个性能问题

千树之影 2013-03-07 03:03:26
char* buf;
class A
{
public:
int width;
int height;
void test2();
};
void A::test2()
{
for(int j=0;j<height;j++)
for(int i=0;i<width;i++)
{
buf[j*width+i]=0;
}
}
void test1(int height,int width)
{
for(int j=0;j<height;j++)
for(int i=0;i<width;i++)
{
buf[j*width+i]=0;
}
}
void main()
{
A ma;
ma.width=10000;
ma.height=10000;
buf=new char[ma.width*ma.height];
//test1和test2两个函数代码相同,但test2的耗时比test1多15%
test1(ma.height,ma.width);
ma.test2();
}

有人知道为什么吗?
...全文
286 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-03-21
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
紫夜精灵 2013-03-08
  • 打赏
  • 举报
回复
因为局部变量是要压栈和出栈的,所以有额外的时间消耗啊
dingqiang107 2013-03-08
  • 打赏
  • 举报
回复
先别急着下结论,15%的差别通常不能说明什么问题。你先确定你是否把优化都打开了。然后把循环次数加大,多运行几次,看能不能得到稳定的明显的差异。
AnYidan 2013-03-07
  • 打赏
  • 举报
回复
得到了复用性,损失了性能
  • 打赏
  • 举报
回复
成员函数多了访问一次this的操作。
赵4老师 2013-03-07
  • 打赏
  • 举报
回复
汇编面前,了无秘密。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
千树之影 2013-03-07
  • 打赏
  • 举报
回复
引用 2 楼 buringBlade 的回复:
因为局部变量是要压栈和出栈的,所以有额外的时间消耗啊
是test2这个使用成员变量的函数的耗时更长。
MoreWindows 2013-03-07
  • 打赏
  • 举报
回复
楼主用Release编译下再运行看看。
buringBlade 2013-03-07
  • 打赏
  • 举报
回复
因为局部变量是要压栈和出栈的,所以有额外的时间消耗啊
图灵狗 2013-03-07
  • 打赏
  • 举报
回复
操作局部变量所需的指令会多一些。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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