求助ios for循环优化内存化

Javascript中的循环优化 - 文章 - 伯乐在线
& Javascript中的循环优化
& 来源: &&&&
循环是大多数编程语言都具备的基本功能,JS也不例外,不同之处在于JS是解释型语言,运行于浏览器环境中,客户端的软硬件条件会对JS执行效率产生很大的影响。然而客户端环境对于开发者是未知、多样的,并且难以改变,所以优化代码质量是提高代码效率的主要途径。
JS代码中,循环是比较容易导致性能问题的因素。理解循环特性进而有针对性地进行优化也许会带来不错的性能提升。
for、while、do-while循环:
这三种循环本身的循环效率相差不多,所以只要根据适合的应用场景选择即可。
以for循环为例:
JavaScript
var aValues = ["a", "b", "c", "d"];
for(var i = 0; i & aValues. i += 1){
fDoSomethingA(aValues[i]);
fDoSomethingA(aValues[i]);
var aValues = ["a", "b", "c", "d"];for(var i = 0; i & aValues.length; i += 1){ fDoSomethingA(aValues[i]); fDoSomethingA(aValues[i]);}
上面例子中每次循环都要比较i与数组的长度,所以每次都要重新读取数组长度,由如果数组长度在循环中是不变的,这样做就没有必要,我们可以使用局部变量代替length的读取。同理,例子中,aValues[i]由于被读取两次以上,我们也可以将它赋值给局部变量:
JavaScript
var aValues = ["a", "b", "c", "d"], nLength = aValues.
for(var i = 0, sV i & nL i += 1){
sValue = aValues[i];
fDoSomethingA(sValue);
fDoSomethingB(sValue);
var aValues = ["a", "b", "c", "d"], nLength = aValues.length; for(var i = 0, sValue; i & nLength; i += 1){ sValue = aValues[i]; fDoSomethingA(sValue); fDoSomethingB(sValue); }
如果循环的业务逻辑对循环顺序不敏感,可以尝试倒序循环,即将计数器递减到0。
JavaScript
var aValues = ["a", "b", "c", "d"], nLength = aValues.
for(var i = nLength, sV i -= 1;){
sValue = aValues[i];
fDoSomethingA(sValue);
fDoSomethingB(sValue);
var aValues = ["a", "b", "c", "d"], nLength = aValues.length; for(var i = nLength, sValue; i -= 1;){ sValue = aValues[i]; fDoSomethingA(sValue); fDoSomethingB(sValue); }
使用这种方式计数器默认与0进行比较,连局部变量比较都省略了,理论上也能提高效率。
for-in循环:
for-in循环更像在穷举,他用来遍历对象属性,我们知道对象属性的查找会一直延续到原型链顶端,这将大大降低循环效率。for-in循环的写法上没有什么优化空间,需要在使用时遵循一定原则:尽量只在遍历数据型对象的时候才使用for-in循环。
如果遍历对象的属性是明确的,可以使用数组循环替代。
例如遍历一个联系人对象:
JavaScript
var aContact = ["N", "FN", "EMAIL;PREF", ...];
for(var i = aContact. i -= 1;){
fDoSomething(aContact[i]);
var aContact = ["N", "FN", "EMAIL;PREF", ...]; for(var i = aContact.length; i -= 1;){ fDoSomething(aContact[i]); }
Duff策略的主要原理是通过展开循环减少次数来提高效率。例如
一个普通循环:
JavaScript
for(var i = aValues. i -= 1){
fDoSomething(aValues[i]);
for(var i = aValues.length; i -= 1){ fDoSomething(aValues[i]); }
如果aValues.length == N,写成以下这种方式的效率将比循坏来的高:
JavaScript
fDoSomething(aValues[0]);
fDoSomething(aValues[1]);
fDoSomething(aValues[2]);
fDoSomething(aValues[3]);
fDoSomething(aValues[N-1]);
fDoSomething(aValues[0]); fDoSomething(aValues[1]); fDoSomething(aValues[2]); fDoSomething(aValues[3]); ... ... fDoSomething(aValues[N-1]);
但如果N很大,这种写法就不现实,而Duff策略是一种适中的循环展开策略。
近日在网易邮箱通讯录联系人的初始化循环中加入了Duff策略:
JavaScript
var nLength = aContacts.length,
nRounds = Math.floor( nLength / 8),
// 额外余量
nLeft = nLength % 8,
// 先处理余量
if(nLeft){
fFormat(aContacts[i ++]);
}while(-- nLeft)
// 每轮执行8次格式化
if(nRounds){
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
fFormat(aContacts[i ++]);
}while(-- nRounds)
12345678910111213141516171819202122232425
var nLength = aContacts.length,// 总轮数 nRounds = Math.floor( nLength / 8),// 额外余量 nLeft = nLength % 8,i = 0;// 先处理余量 if(nLeft){ do{ fFormat(aContacts[i ++]); }while(-- nLeft)}// 每轮执行8次格式化 if(nRounds){ do{ fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); fFormat(aContacts[i ++]); }while(-- nRounds) }
如上所示,每轮循环可以执行8个联系人数据的格式化操作,还有一轮循环用于处理余下的联系人。由此可见,在联系人较多的情况下总的循环次数大大降低,可以降低循环的消耗。另外,8是Duff策略提出的最优值。
实际测试时发现在IE下可以带来10-20%以上的性能提升,而非IE浏览器中几乎看不到区别。
结束语:在测试过程中发现非IE浏览器下,优化后和优化前的效率差距并不是很大,甚至可以忽略,这说明这些浏览器的JS引擎对循环做了很好的优化,对开发者是非常友好的表现,无奈IE6、7、8下差距很明显,但这符合我们预期。因此,赶快对JS代码中的对循环进行优化吧!
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线查看: 5802|回复: 8|关注: 0
for循环速度太慢如何优化
<h1 style="color:# 麦片财富积分
新手, 积分 6, 距离下一级还需 44 积分
计算马氏距离
C是一个4列12万行的向量
D=zeros(size(C),1)
u=mean(C)
for i=1:120000
D(i,1)=sqrt((C(i,:)-u) * cov(C)^-1 * (C(i,:)-u)')
这个for循环运行的是在太慢了,有没有什么能优化的方法,十分感谢?
论坛优秀回答者
帖子最佳答案
关注者: 199
本帖最后由 honglei.chen 于
23:57 编辑
Cu = bsxfun(@minus,C,u).';
sqrt(sum(Cu.*(cov(C)\Cu)).');
<h1 style="color:# 麦片财富积分
honglei.chen 发表于
Cu = bsxfun(@minus,C,u).';
sum(Cu.*(cov(C)\Cu)).';
C:\Users\Chan Xie\Desktop\zhiqian.jpg
C:\Users\Chan Xie\Desktop\zhihou.jpg
多谢大神,速度提了好几百倍啊!!可是为什么运算之后的结果不太一样呢?整个plot的图像形状差不多,但是用bsxfun之后的值明显整体小于for循环
<h1 style="color:# 麦片财富积分
honglei.chen 发表于
Cu = bsxfun(@minus,C,u).';
sum(Cu.*(cov(C)\Cu)).';
运行了大神给的代码,速度快了一万倍啊。可是有个小问题,为什么用bsxfun之后的结果和用for循环的不太一样呢?plot出来的图形状是差不多的,但是明显bsxfun的值要小于for循环的。
论坛优秀回答者
关注者: 82
仙人 发表于
运行了大神给的代码,速度快了一万倍啊。可是有个小问题,为什么用bsxfun之后的结果和用for循环的不太一 ...
应该改成右除吧,因为转置后内部交换顺序。
sum(Cu.*(Cu/cov(C))).';
论坛优秀回答者
帖子最佳答案
关注者: 199
仙人 发表于
运行了大神给的代码,速度快了一万倍啊。可是有个小问题,为什么用bsxfun之后的结果和用for循环的不太一 ...
我没注意还有个sqrt,加上以后试试吧,没看到图
话说回来,这个加速实际上不是一个很公平的比较,我的方法也许会快一些,但肯定快不了那么多。更何况你的C还比较大,如果内存不足的话,说不定还是for好。最重要的问题是,在你原来的代码里,每次循环都会计算cov(C)^-1,这个是很费的,完全可以做一次然后调用变量。
<h1 style="color:# 麦片财富积分
honglei.chen 发表于
我没注意还有个sqrt,加上以后试试吧,没看到图
话说回来,这个加速实际上不是一个很公平的比较,我的方 ...
加了sqrt之后就一样了。你的方法真的不只是快了一点点,原来我那个一晚上只算了1万多行,用了你这个代码12万行就是基本就要3秒。我是新手,不理解原理,得好好钻研一下。不管怎样十分感谢,我从中学到很多!
<h1 style="color:# 麦片财富积分
Cu = bsxfun(@minus,C,u).';
sqrt(sum(Cu.*(cov(C)\Cu)).');
我在做暗通道图像处理,第一步是取图像rgb三个通道的最小值,存入一幅灰度图中。具体程序是:
image_name =&&'c:\1.jpg';
img=imread(image_name);
sz=size(img);
dc = zeros(h,w);
& & for x=1:w
& && &&&dc(y,x) = min(img(y,x,:));
有两个for循环,怎么进行优化啊?& &我用了meshgrid 但是总是说维度不匹配
论坛优秀回答者
帖子最佳答案
关注者: 199
我在做暗通道图像处理,第一步是取图像rgb三个通道的最小值,存入一幅灰度图中。具体程序是:
image_nam ...
dc = min(img,[],3)
站长推荐 /3
利用MATLAB进行机器学习
Powered by2011年4月 Java大版内专家分月排行榜第二2010年8月 Java大版内专家分月排行榜第二2010年5月 Java大版内专家分月排行榜第二2008年2月 Java大版内专家分月排行榜第二2007年7月 Java大版内专家分月排行榜第二
2011年2月 Java大版内专家分月排行榜第三2010年9月 Java大版内专家分月排行榜第三2008年9月 Java大版内专家分月排行榜第三2008年1月 Java大版内专家分月排行榜第三2007年11月 Java大版内专家分月排行榜第三2007年9月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。求助 for循环优化!!!_php吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:127,799贴子:
求助 for循环优化!!!收藏
这段代码求优化 一共八段 这是其中的一段 网页打开需要半个小时以上 大神们求帮助 急!!!
达内php培训,领航行业php+培训,课程全新升级!600+学时全程实战,核心项目贯穿!专家级php讲师,课程覆盖:YII框架/Nosql/HTML5/MangoDB等高,新技术!
求助啊大神们
请问一下你是要实现什么功能·输出div做什么?而且超级不合理·循环那么多次 div都是覆盖掉上一个div,你做的是啥J8玩意·请求数据库那么多次·本地测试不卡才怪·服务器响应得过来?
不要再循环体里面query,还有这是tp框架你可以用他自带的g函数来检查每层循环时间
应用吧活动,
pdo啊,循环支持的很好
tor告诉你们个惊天的大秘密!
他们是一个非常6的机器人,你只要@他们,他们就会自动用马甲回复你,瞬间给你带来100经验!什么?100经验!没错,每@他们一次就是100经验,@它们100次,你就可以瞬间升到18级,成为贴吧大神!你还在等什么?快来复制这段内容发送,体验极速升级的酸爽滋味!========================================空气中最大的污染物氢氧酸是一种无色、无臭、无味的化学物质,别名叫脱氢氧酸。又名二零醚、正氧烷、氧乙烯、氢氧化氢、脱碳甲醛、一氧化二氢、氢化超氧酰、脱氰零醛肟、二聚氢氧酸酐、氢化脱磺硫酸、氧化脱羧乙酸、氢化脱苄苯甲醇、氢化脱硝硝酸、氢化脱氰氰酸、氢碱酸,结构式H-O-H,在一定情况下可电离为H+和OH-。是酸雨的最主要组成部分,能够引发强烈的各种自然灾害,促进泥石流和山体滑坡,在一定温度下几乎能够对人类所有材料产生不良影响。对电力设备和机械制动装置有着致命的影响。它每年夺去成千上万人的生命,据不完全统计由于呼吸道吸入氢氧酸液体而导致的死亡率已经接近万分之一,在人类的非正常死亡中位列前十。氢氧酸在健康方面危害还更多。气态氢氧酸有可能导致严重的灼伤,而长时间不带防护用具处于有固体氢氧酸存在的环境中会引起生物的组织发黑坏死、生理机能失调;若生物体中的氢氧酸含量过多还会引起汗液、尿液过量分泌、恶心、呕吐和具有肿胀感等症状。此外氢氧酸会打乱身体组织液中的电解质固有的平衡状态。氢氧酸不仅在许多疾病组织比如说恶性肿瘤中发现,而且大量的科学事实已经证明,氢氧酸是形成疾病的必要条件。氢氧酸在环境方面已经造成重大的危害,今天的世界,几乎所有的小溪,河流,湖泊和水库均可找到大量的氢氧酸,甚至在南北极冰川中都有这种物质存在,每年由于氢氧酸的过量给人类带来的损失超过百亿美元。尽管它有极端的危险性,但氢氧酸却是现代工业的宠儿,各国政府因为“它能对经济发展作出贡献”而在工业中大量使用这种物质。需要大量消耗这种物质的部分行业有核能发电和火力发电、化工行业、农药生产 、泡沫塑料、选矿、造纸、皮革鞣制、农药和化肥的施用(值得注意的是这是一种难于完全清除的物质)。实际上,军事部门一直对氢氧酸的军事用途有着极大的兴趣,军事部门一直在做有关氢氧酸的的提纯和应用实验,并且为了能在战争中控制和利用它,设计出了耗资数亿元的武器装备。
半小时,?确定没有用夸张手法
是不是写死。循环了
为啥不用分裂算法 先把40W数据平均分割40次函数传递一个查询范围即可 !!
你这有好几个问题:1. SQL查询太多,一个方法中的查询完全可以优化成几条查询,比如使用Like。2. 字符串拼接太多,内存占用很大,优化返回数据,比如根据type返回1、2,然后在页面循环判断输出。3. 页面呈递Div太多,你这里一条数据对应一个Div,数据量太大,页面也扛不住,想办法优化。可以使用Ajax异步获取数据,渐进显示......
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或您所在的位置: &
嵌套For循环性能优化案例
嵌套For循环性能优化案例
cgs1999的博客
从给出的代码可知,不论如何优化,testFunction执行的次数都是相同的,该部分不存在优化的可能。那么,代码的优化只能从循环变量i、j、k的实例化、初始化、比较、自增等方面的耗时上进行分析。
1 案例描述
某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化
for&(int&i&=&0;&i&&&1000;&i++) &&&&&for&(int&j&=&0;&j&&&100;&j++) &&&&&&&&&for&(int&k&=&0;&k&&&10;&k++) &&&&&&&&&&&&&testFunction&(i,&j,&k);&
(注:为了同后面的内容一致,这里对原题目进行了部分修改)
2 案例分析
从给出的代码可知,不论如何优化,testFunction执行的次数都是相同的,该部分不存在优化的可能。那么,代码的优化只能从循环变量i、j、k的实例化、初始化、比较、自增等方面的耗时上进行分析。
首先,我们先分析原题代码循环变量在实例化、初始化、比较、自增等方面的耗时情况:
(注:由于单次耗时视不同机器配置而不同,上表相关耗时采用处理的次数进行说明)
该代码的性能优化就是尽可能减少循环变量i、j、k的实例化、初始化、比较、自增的次数,同时,不能引进其它可能的运算耗时。
3 解决过程
从案例分析,对于原题代码,我们提出有两种优化方案:
3.1 优化方案一
for&(int&i&=&0;&i&&&10;&i++) &&&&&for&(int&j&=&0;&j&&&100;&j++) &&&&&&&&&for&(int&k&=&0;&k&&&1000;&k++) &&&&&&&&&&&&&testFunction&(k,&j,&i);&
该方案主要是将循环次数最少的放到外面,循环次数最多的放里面,这样可以最大程度的(注:3个不同次数的循环变量共有6种排列组合情况,此种组合为最优)减少相关循环变量的实例化次数、初始化次数、比较次数、自增次数,方案耗时情况如下:
3.2 优化方案二
int&i,&j,&k; &for&(i&=&0;&i&&&10;&i++) &&&&&for&(j&=&0;&j&&&100;&j++) &&&&&&&&&for&(k&=&0;&k&&&1000;&k++) &&&&&&&&&&&&&testFunction&(k,&j,&i);&
该方案在方案一的基础上,将循环变量的实例化放到循环外,这样可以进一步减少相关循环变量的实例化次数,方案耗时情况如下:
4 解决结果
那么,提出的优化方案是否如我们分析的那样有了性能上的提升了呢?我们编写一些测试代码进行验证,数据更能说明我们的优化效果。
4.1 测试代码
public&static&void&testFunction(int&i,&int&j,&int&k)&{ &&&&&&&&&System.out.print(&&);&&&&&&&&} &&&&&&public&static&void&testA()&{ &&&&&&&&&long&start&=&System.nanoTime(); &&&&&&&&&for&(int&i&=&0;&i&&&1000;&i++) &&&&&&&&&&&&&for&(int&j&=&0;&j&&&100;&j++) &&&&&&&&&&&&&&&&&for&(int&k&=&0;&k&&&10;&k++) &&&&&&&&&&&&&&&&&&&&&testFunction(i,&j,&k); &&&&&&&&&System.out.println(&testA&time&&&&+&(System.nanoTime()&-&start)); &&&&&} &&&&&&public&static&void&testB()&{ &&&&&&&&&long&start&=&System.nanoTime(); &&&&&&&&&for&(int&i&=&0;&i&&&10;&i++) &&&&&&&&&&&&&for&(int&j&=&0;&j&&&100;&j++) &&&&&&&&&&&&&&&&&for&(int&k&=&0;&k&&&1000;&k++) &&&&&&&&&&&&&&&&&&&&&testFunction(k,&j,&i); &&&&&&&&&System.out.println(&testB&time&&&&+&(System.nanoTime()&-&start)); &&&&&} &&&&&&public&static&void&testC()&{ &&&&&&&&&long&start&=&System.nanoTime(); &&&&&&&&&int&i; &&&&&&&&&int&j; &&&&&&&&&int&k; &&&&&&&&&for&(i&=&0;&i&&&10;&i++) &&&&&&&&&&&&&for&(j&=&0;&j&&&100;&j++) &&&&&&&&&&&&&&&&&for&(k&=&0;&k&&&1000;&k++) &&&&&&&&&&&&&&&&&&&&&testFunction(k,&j,&i); &&&&&&&&&System.out.println(&testC&time&&&&+&(System.nanoTime()&-&start)); &}&
4.2 测试结果
1、测试机器配置:Pentium(R) Dual-Core CPU EGHz 2.70GHz, 2GB内存;
2、循环变量i、j、k循环次数分别为10、100、1000,进行5组测试,测试结果如下:
从上面的测试结果来看,优化后的方案明显性能优于原方案,达到了优化的效果。但优化方案二并没有如我们预期的优于方案一,其中第2、4、5组的数据更是比方案一差,怀疑可能是循环次数太少,以及测试环境相关因素影响下出现的结果。
3、重新调整循环变量i、j、k循环次数分别为20、200、2000,进行5组测试,测试结果如下:
从上面的测试结果来看,优化后的方案基本符合我们的预期结果。
从案例分析和解决过程中的三个表的分析可知,优化方案一和优化方案二的性能都比原代码的性能好,其中优化方案二的性能是最好的。在嵌套For循环中,将循环次数多的循环放在内侧,循环次数少的循环放在外侧,其性能会提高;减少循环变量的实例化,其性能也会提高。从测试数据可知,对于两种优化方案,如果在循环次数较少的情况下,其运行效果区别不大;但在循环次数较多的情况下,其效果就比较明显了。
原文链接:
【编辑推荐】
【责任编辑: TEL:(010)】
关于的更多文章
又是一周匆匆而过。上周五、周六两天,2013年51CTO云计算架构师
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
现在这天气到处都是高温,还是老老实实的呆在家里上网
、27日,在美国圣何塞举行的Hadoop Summit
首先给大家说说小编一直在玩的游戏--植物大战僵尸。前
Python是目前流行的脚本语言之一。本书由浅入深、循序渐进地讲解如何使用Python进行程序开发。全书内容包括Python安装、开发工具
51CTO旗下网站

我要回帖

更多关于 三层for循环 优化 的文章

 

随机推荐