编译后程序首次运行缓慢、后续提速的原因咨询
编译后首次运行缓慢?栈程序的细节优化?看这里!
一、为啥编译后第一次跑慢,后续就快了?
这完全是操作系统的**页缓存(page cache)**机制在起作用,属于正常现象:
- 第一次运行新编译的可执行文件时,系统需要从硬盘把整个程序的二进制数据读取到内存中——硬盘IO本身就是相对耗时的操作,所以你会感觉到明显延迟。
- 等你跑完一次后,操作系统会把这份程序数据暂时存储在内存的缓存区域里。下次再运行时,直接从内存缓存读取数据,速度自然大幅提升。
- 重新编译后,生成的是一个全新的可执行文件(哪怕代码改动极小,文件的标识信息也会发生变化),系统缓存里没有这个新文件的数据,所以首次运行又得重新从硬盘读取,也就再次出现缓慢的情况。
顺带提一句:如果你的程序依赖大量动态库,首次运行时加载这些库也会占用部分时间,但从你的描述来看,核心原因肯定是磁盘缓存的问题。
二、你的栈程序情况分析
先看你的代码输出:b然后a,这完全符合栈“后进先出”的逻辑,功能上没有异常!不过有几个小细节可以优化:
- 你声明了
pop函数但没有实现,目前没调用还好,后续如果要使用的话会引发问题,要么补上函数实现,要么删掉这个无用的声明。 - 你用
calloc分配内存,它会把内存区域清零,对于这个栈节点来说没问题,但如果不需要内存清零的话,用malloc会稍微高效一点(不过这点差异在这个小程序里可以忽略)。 - 程序结束后没有释放栈节点的内存,虽然程序退出后操作系统会自动回收内存,但养成手动释放的习惯很重要,避免在大型程序中出现内存泄漏。比如可以补充一个清理函数:
void freeStack(Mychar **tPtr) { Mychar *temp; while (*tPtr != NULL) { temp = *tPtr; *tPtr = (*tPtr)->nextPtr; free(temp); } }
然后在main函数的最后调用freeStack(&topPtr);即可。
总结
- 首次运行慢是系统缓存的正常优化机制,不是代码bug,无需担心。
- 你的栈程序功能正常,只是存在几个可以完善的小细节。
内容的提问来源于stack exchange,提问作者Mnkisd
相关产品推荐
相关产品推荐

