c语言优化,有满意答案给100分

有时候,我会需要优化一种情况比如在某个函数中判断某个状态,若否则这在后面的大循环中重复调用它,若是则不执行问题是判断该状态需要很多时间,且该循环很大即使保存判断结果,然后... 有时候,我会需要优化一种情况
比如在某个函数中判断某个状态,若否则这在后面的大循环中重复调用它,若是则不执行
问题是判断该状态需要很多时间,且该循环很大即使保存判断结果,然后再循环中判断都是不希望的

因为我只会一点c语言,所以我有个想法:把代码保存在缓冲空间中,如果判断成立,则插入函数调用的指令,然后运行时跳到缓冲空间运行,结束后返回

请高手给出该方案的实例或者一种时空复杂度都耕地的方案
还有该状态在这这个过程中是不变的,该函数调用的是某个子函数,既然有人回答先+20分
展开
 我来答
█╬卍╬█
2013-02-24 · TA获得超过162个赞
知道小有建树答主
回答量:115
采纳率:0%
帮助的人:177万
展开全部
我路过,说一句:程序执行时代码是保存在代码区的,这个区是只读的,也就是说你不能在运行时改变你的代码!所以你的想法是不现实的!当然高手有办法实现,通过程序该exe文件然后加多进程的方式,但你说你只会一点C语言,那这个方法就~~~难于上那什么天了哈!!!

不过我提醒你一下

ID鸡蛋炒韭菜 正解,别听anan640925瞎扯,故作高深!!!只是 ID鸡蛋炒韭菜 没说详细而已!

把大循环做成两个版本的代码,版本1,加入那一段你要重复调用的代码,版本2,不加你要重复调用的代码,这样,当那个什么状态为否的时候,调用版本1,为是的时候呢,就调用版本2!下面是伪代码:
if(状态为是)
{
for(i=0;i<10000;i++)
{
版本2;//调用了和状态相关的代码

}
}
else
{
for(i=0;i<10000;i++)
{
版本1;//不调用和状态相关的代码

}
}

这样其实也就是实现了你的那个想法!当然咯,会在内存空间上带来那么一点点浪费!!!

你要想继续优化内存空间呢,那么就做三个函数,也就是把你大循环中要做的事拆成3部分:
第一个,你大循环中要在调用的那个和条件关的部分的前面那部分,然后是相关部分,然后是后面部分,对应的伪代码是

if(a==0)
{
for(i=0;i<10000;i++)
{
前部分
相关代码
后部分

}
}
else
{
for(i=0;i<10000;i++)
{
前部分
后部分

}
}

这样是不是就更贴合你的想法了呢?

不过你继续看下去,我又要泼冷水了,呵呵!
虽然这样子看起来既省时间又省空间,但是不可忽视的一个耗时部分就是函数调用时的堆栈操作,最开始的方案中会有1n个调用,第二个方案中会有3n或者2n个调用!!!这个算起来,远远 ID鸡蛋炒韭菜 说的设一个标志再判断这个标志的时间要多!!!懂了吗?

再回过头看看你的想法,你觉得插入一段函数代码,再跳到这个缓冲区不要花时间吗?你绝对这个时间花费比一句if(flag==0)要少么?

我告诉你,一句if(flag==0),编译器之后也就一句JNE指令,而你说的那个想法,至少要一对MOV指令再加一句JMP指令,你现在说 哪个更省时?

再啰嗦一句,程序优化是比较高级的东西,没看到你代码,不好发言!时间和空间是矛盾的,要么选第一个方案,以空间换时间,要么选判断标志,以时间换空间!

跟你说个例子,我的一个老师做的单片机程序,我用C语言做的 编译出来700多字节,他改成了汇编的 13条指令完美解决 空间优化了几十倍!!! 那设计,太巧妙了。所以说优化无止境,量力而行。

回归正题:答案还是 ID鸡蛋炒韭菜 正解!标准的以少量时间换空间的方法。

我说的第一个方案是以空间换时间的方法!

你自己斟酌用那个方法!
更多追问追答
追问
当然,循环的话需要用空间代替时间
果然c不好优化,我还是换成汇编来实现吧
可是你的答案并不算完美,我把分数提到60,你告诉我什么工具能把c程序换成3元表达式的就给100,不是汇编,是编译器换成汇编之前用于优化的那种语言啊,
追答
好吧~这个我还真不知道~~
anan640925
2013-02-23 · TA获得超过5421个赞
知道大有可为答主
回答量:4868
采纳率:51%
帮助的人:1312万
展开全部
没太明白你的意图
你是想时间上更快更加有效?
还是想内存方面的管理更加到位,
也不知道你的运行环境和语言

如果是为了更快,可以把程序放到通信中断里,然后适时启动通信。这样程序就会优先运行你的程序,
更多追问追答
追问
都要考虑,不过主要考虑时间,给出伪代码就行了,还有通信中断是什么我也不清楚啊
追答
之前在用C做控制的时候,定时去扫描端口,并比较,如果发现有变化,就需要马上上传变化位置,
做法就是直接利用计算机的一个RS232端口,直接输出某字节。
而232输出完成的时候,就会触发一个通信中断,然后就把处理程序调用了,尽快的安排了事件的处理,
而其他的程序也在同步运行。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ID鸡蛋炒韭菜
2013-02-23 · TA获得超过391个赞
知道小有建树答主
回答量:570
采纳率:50%
帮助的人:111万
展开全部
你把那大循环单独写个函数不完了吗
更多追问追答
追问
不管该状态怎么样,该循环都要执行,只是在循环的某处是否执行该函数由该状态决定
追答
用个标志位记录判断情况,然后循环中只判断该标志位不行吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式