函数执行结束后,执行很久的问题

灰灰君呀 2014-05-04 12:00:59
很奇怪的问题:函数结束执行后,为什么消耗那么久的运行时间?

MFC 对话框工程
class b
{
public:
void b1(const CSting &name); // 2.000s
~b() // 0.146s
{
m_WorkBook.close();
m_WorkBooks.close();
m_ExcelApp.Quit();

m_Range.RealeaseDispatch();
……
m_ExcelApp.RealeaseDispatch();
}
}

void xxxDlg::a1(const CString &sname, int index = 1)
{
clock_t x3, x4;
x3 = clock();
b bb;
bb.b1(sname);
x4 = clock();
// x4 - x3: 2.002s
}

void xxxDlg::a()
{
clock_t x1, x2;
x1 = clock();
a1(sname);
x2 = clock();
// x2 - x1: 7.056s
}

类b里面封装的是MFC 中COM的Excel表格操作方法,析构函数就是关闭句炳的操作 。
内存中存储表格用的是c++的vector.
问题: xxxDlg::a1 执行结束后消耗的时间是(x4 - x3),约2.002s的时间。
xxxDlg::a() 执行结束后消耗的时间是(x2 - x1),约7.052s的时间。
xxxDlg::a() 执行结束后只调用了b的析构函数一次,而b的析构函数执行时间0.146s。
函数a和函数a1,中间的时间差5s是如何产生的?

...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 tujiaw 的回复:
b bb;的析构函数你没计算进去
++
ningto.com 2014-05-04
  • 打赏
  • 举报
回复

               clock_t  x3, x4;
                    x3 = clock();
                    b bb;
                    bb.b1(sname);                              
                    x4 = clock();
改成:
               clock_t  x3, x4;
                    x3 = clock();
{
                    b bb;
                    bb.b1(sname);                              
}
                    x4 = clock();
ningto.com 2014-05-04
  • 打赏
  • 举报
回复
b bb;的析构函数你没计算进去
ningto.com 2014-05-04
  • 打赏
  • 举报
回复
m_WorkBook m_WorkBooks m_ExcelApp m_Range. m_ExcelApp 这些成员变量在b析构之后也都要被析构的。
ningto.com 2014-05-04
  • 打赏
  • 举报
回复
引用 6 楼 onlyfunboy 的回复:
[quote=引用 1 楼 tujiaw 的回复:] b bb;的析构函数你没计算进去
xxxDlg::a() 执行结束后只调用了b的析构函数一次,而b的析构函数执行时间0.146s。 把这时间算进去也只是增加了这么一点时间。多出的5s时间,包含的应该是函数结束时,栈内部处理的时间。这期间,到底干了什么。。。[/quote] 加大括号是作用域,让b在出作用域的时候析构; 你不能只看析构函数,还有可能是b类的成员变量的析构函数
灰灰君呀 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 tujiaw 的回复:
b bb;的析构函数你没计算进去
xxxDlg::a() 执行结束后只调用了b的析构函数一次,而b的析构函数执行时间0.146s。 把这时间算进去也只是增加了这么一点时间。多出的5s时间,包含的应该是函数结束时,栈内部处理的时间。这期间,到底干了什么。。。
赵4老师 2014-05-04
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
灰灰君呀 2014-05-04
  • 打赏
  • 举报
回复
引用 2 楼 tujiaw 的回复:

               clock_t  x3, x4;
                    x3 = clock();
                    b bb;
                    bb.b1(sname);                              
                    x4 = clock();
改成:
               clock_t  x3, x4;
                    x3 = clock();
{
                    b bb;
                    bb.b1(sname);                              
}
                    x4 = clock();
哥,你这加个大括号什么意思啊?

65,208

社区成员

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

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