为了账号安全,请及时绑定邮箱和手机立即绑定

性能优化的问题

我的优化代码如下:

//    优化balls数组
            var count=0;
            for(var i=0;i<balls.length;i++) {
               if (balls[i].x < -R || balls[i].x > WINDOW_WIDTH + R) {
                    balls.splice(i,1);
                }
            }

这样思维比较简单,就是把不符合要求的小球清除出去。

但是实际运行效果是,balls的长度大概维持在450-500之间。

我觉得这两个效果大概是一样的啊。这是不是说明这样写的性能不是很高?

为什么会有这个性能上的区别?

正在回答

5 回答

我也出现下图的情况。所以增加了一个大于1000个球的判断。

    while(balls.length > cnt || balls.length > 1000){ //删除cnt-1 后面的球 .删除超过1000的球

        balls.pop();

    }



0 回复 有任何疑惑可以回复我~
#1

BigListener 提问者

非常感谢!
2015-07-28 回复 有任何疑惑可以回复我~

算法的复杂度问题了~谢谢

0 回复 有任何疑惑可以回复我~

我想这样做的效率应该是比较低的,我不知道splice函数具体是怎样实现的,但是如果是数组的删除的话,你在数组中删除了一个元素,其他元素需要进行前移,才能保证数组中间不会有空,这样你删除n个元素就移动了n*(n的位置后面的元素个数)个元素,而老师的方法是赋值之后再pop,理论上讲最多也就length那么长咯,所以是O(n),splice很容易就O(n方)了吧

0 回复 有任何疑惑可以回复我~

改写成requextAnimationFrame 没有这个问题

0 回复 有任何疑惑可以回复我~

还有一个问题就是,如果电脑不是一直在那个页面。那么性能优化代码好像就不工作。会出现这种情况:

54c32fc20001c00f05000225.jpg

麻烦各位谁懂的,给解释一下!

0 回复 有任何疑惑可以回复我~
#1

哦哦哒

这个应该是每个浏览器对setInterval的一个优化吧,当离开浏览器窗口的时候会默认暂停动画效果以节约系统资源诸如内存,CPU,然后再回来的时候会对已经运行的动画效果运用JS计算达到没有好像没离开过一样,但是由于离开的这段时间其实这个Demo依然在做一些事情,所以就发生了这个bug,大概是这样,具体原因可以百度一下浏览器对setInterval的处理相关方面的知识
2015-08-21 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

性能优化的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信