C++成员函数中的静态局部变量能不能提高程序的执行效率
现在有这个疑问,我有一个功能函数需要频繁调用,这个函数里面的临时变量比较多,我担心这么多的临时变量在这个高频调用的函数里面会影响程序执行的效率,我想将这些局部临时变量改为...
现在有这个疑问,我有一个功能函数需要频繁调用,这个函数里面的临时变量比较多,我担心这么多的临时变量在这个高频调用的函数里面会影响程序执行的效率,我想将这些局部临时变量改为局部静态变量,不知道这样做能不能提高程序执行效率?另外,在程序性能优化方面有什么好的建议可以说说?。。
展开
6个回答
2013-07-11
展开全部
首先,局部变量储存于栈中,栈是应用程序固定大小的CPU直接管理的一块内存,使用栈内存并不需要向系统申请分配,而是直接的读写,所有类型的内存当中,栈的速度是最快的,也就是说,局部变量的效率是最高的。所以使用局部变量通常要注意的不是效率,而是它的大小和生存期,因为栈的大小是程序编译后就已经确定下来了无法根据实际情况扩充,通常栈的大小只有1MB,这个容量可以从编译器的选项上面修改,但这样做通常是无益的。因为局部变量的生存期非常短暂,他只在一个函数的范围内有效,当退出这个函数时,变量就死亡了(也就是所有数据都出栈了),不能再使用,所以这样的临时空间没有必要定义得很大。
2013-07-11
展开全部
程序性能优化 有很多方面可以着手。我只谈 我能想到的部分。
1.你的这些所谓的局部变量是否可以提升到成员变量?若可以。你懂的。
2.你是否返回了这些局部变量,导致在返回的时候这些局部变量又被拷贝了一次导致的性能降低?若是 你是否可以 通过参数表的位置进行返回?使用引用或者指针?
3.你的这些局部变量 若改变成为了静态变量,若是常量 则 没有问题,若是变量 你每次调用这个函数时,这些静态变量是否 要初始化?若需要,则不建议你改成静态变量。
4.你是否可以通过调整整个程序结构来避免大量的临时变量的产生?
如上所说,若都不符合你的需求,那么我暂时没有好的办法。
我给个改成静态变量的例子。
原先:
std::string GetNowTimeString(){
time_t tTime = time(NULL);
//一系列转换后 返回string。
}
优化后。
const std::string& GetNowTimeString(){
static time_t uLastTime=time(NULL);
static std::string sLastTimeString=//初始化;
time_t tNow = time(NULL);
if(tNow ==uLastTime)return sLastTimeString;
//一系列转换后 返回存入 sLastTimeString;并更新uLastTime
return sLastTimeString;
}
我们可以看到 程序调用的频率越是频繁 效率依然还是那么高。返回的是引用。速度远远比非引用快。
1.你的这些所谓的局部变量是否可以提升到成员变量?若可以。你懂的。
2.你是否返回了这些局部变量,导致在返回的时候这些局部变量又被拷贝了一次导致的性能降低?若是 你是否可以 通过参数表的位置进行返回?使用引用或者指针?
3.你的这些局部变量 若改变成为了静态变量,若是常量 则 没有问题,若是变量 你每次调用这个函数时,这些静态变量是否 要初始化?若需要,则不建议你改成静态变量。
4.你是否可以通过调整整个程序结构来避免大量的临时变量的产生?
如上所说,若都不符合你的需求,那么我暂时没有好的办法。
我给个改成静态变量的例子。
原先:
std::string GetNowTimeString(){
time_t tTime = time(NULL);
//一系列转换后 返回string。
}
优化后。
const std::string& GetNowTimeString(){
static time_t uLastTime=time(NULL);
static std::string sLastTimeString=//初始化;
time_t tNow = time(NULL);
if(tNow ==uLastTime)return sLastTimeString;
//一系列转换后 返回存入 sLastTimeString;并更新uLastTime
return sLastTimeString;
}
我们可以看到 程序调用的频率越是频繁 效率依然还是那么高。返回的是引用。速度远远比非引用快。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有限储备下的一点点建议:
1、提高代码执行效率的关键是使用CPU的姿势;
2、多线程外,现代CPU为提高代码执行速率主要采取两个方法:其一,增加CPU内部缓存(IO访问远慢于CPU内部存储器访问速度),主要是增加层级、扩大容量;其二,“并行化”流水线,如多发射、乱序、预测等等。
3、于是,代码(MachineCode)想要获得更高速率,就要尽量使用CPU内部缓存,降低CPU预测失误概率。
所以,就题主目前的问题有这样的建议:
1、能不能减少中间变量,比如增加内存复用率(做好注释,指针类型强转),这样更可能放入CPU缓存中。
2、静态变量与局部变量存储区是不一样的,一个在bss段,一个在stack区,但与代码段并不在一起。个人感觉,可能差别不大,题主可以测试一下。但是,静态变量在程序加载时便会被分配空间,而局部变量默认下每次调用时从栈区申请。若函数高频被调用,建议使用静态变量。但就CPU缓存内存到内部的概率,个人感觉应该是差不多的。
3、简化该函数复杂度,即尽可能的减少分支判断,更要减少分支嵌套。同时,尽可能的使用位运算等转换除法、取余的运算。数据是否可以顺序排列。尽可能预先排序数据。如果运算与顺序无关,但读取与保存有关,可以先排序并记录原始顺序,计算后再按照原顺序列出,等等。尽量提高CPU内部并行成功率。
1、提高代码执行效率的关键是使用CPU的姿势;
2、多线程外,现代CPU为提高代码执行速率主要采取两个方法:其一,增加CPU内部缓存(IO访问远慢于CPU内部存储器访问速度),主要是增加层级、扩大容量;其二,“并行化”流水线,如多发射、乱序、预测等等。
3、于是,代码(MachineCode)想要获得更高速率,就要尽量使用CPU内部缓存,降低CPU预测失误概率。
所以,就题主目前的问题有这样的建议:
1、能不能减少中间变量,比如增加内存复用率(做好注释,指针类型强转),这样更可能放入CPU缓存中。
2、静态变量与局部变量存储区是不一样的,一个在bss段,一个在stack区,但与代码段并不在一起。个人感觉,可能差别不大,题主可以测试一下。但是,静态变量在程序加载时便会被分配空间,而局部变量默认下每次调用时从栈区申请。若函数高频被调用,建议使用静态变量。但就CPU缓存内存到内部的概率,个人感觉应该是差不多的。
3、简化该函数复杂度,即尽可能的减少分支判断,更要减少分支嵌套。同时,尽可能的使用位运算等转换除法、取余的运算。数据是否可以顺序排列。尽可能预先排序数据。如果运算与顺序无关,但读取与保存有关,可以先排序并记录原始顺序,计算后再按照原顺序列出,等等。尽量提高CPU内部并行成功率。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-11
展开全部
我想是可以提高效率的,静态局部变量只在第一次调用定义该局部静态变量的函数中初始化,在这之后即使重复调用该函数,该静态变量不再初始化,这可以节省下重新分配内存并初始化的开销。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-07-11
展开全部
不管是静态变量还是普通变量,只要不是用指针new的堆内存,它都分配在栈上,一般而言不会对性能有什么影响,静态变量主要让它能够在应用程序运时自动分配栈内存,生命周期与整个应用程序一致。通常一些用于计数的变量会这样做,防止重复。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询