专栏首页readmeJavaScript array merge 数组合并
原创

JavaScript array merge 数组合并

Dilemma of speed/time and space/memory. a javascript speed & space case.

a = [0,1,2,3,4,5,6,7,8,9];
b = a.slice().reverse();

The concat() method is used to join two or more arrays.

This method does not change the existing arrays, but returns a new array, containing the values of the joined arrays.

console.log(a.concat(b));

当字符串处理

console.log((a.toString()+','+b.toString()).split(',').map(function(data){return +data;}));

500个字符和1000个字符长度concat和字符串转换+拼接+转换耗时差异不大,手动谷歌浏览器30-40ms的脚本时间,

超过这个问题直接看字符串数组拼接,人家说当字符串个数较少(少于1000个),或者从固定字符串数组中取字符串拼接时,string.join的效率最高, 当分割符是string.empty时,string.join等同于string.Concat,同时,string.Concat等同于使用+,c#编译器会将+编译成和Concat一样的代码;当字符串小于等于四个时,用一个语句拼接效率最高, 当拼接的字符串多于5个时,string.Concat会接收一个数组作为参数,这反而会降低字符串拼接效率, 所以当字符串超过五个时,每四个拼接一次效率最高...

其它的办法

for(var i in b){ a.push(b[i]);}
a.push.apply(a,b);

泛化到更多的内存问题,记录两个算法:

引用计数垃圾收集

这是最初级的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。该算法有个限制:无法处理循环引用的事例。在下面的例子中,两个对象被创建,并互相引用,形成了一个循环。它们被调用之后会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。

function f() {
  var o1 = {};
  var o2 = {};
  o1.p = o2; // o1 引用 o2
  o2.p = o1; // o2 引用 o1. 这里会形成一个循环引用
}
f();

标记-清除算法

这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。

这个算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象……从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。

这个算法比前一个要好,因为“有零引用的对象”总是不可获得的,但是相反却不一定,参考“循环引用”。循环引用不再是问题了

在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。第二个示例同样,一旦 div 和其事件处理无法从根获取到,他们将会被垃圾回收器回收。限制: 那些无法从根对象查询到的对象都将被清除,尽管这是一个限制,但实践中我们很少会碰到类似的情况,所以开发者不太会去关心垃圾回收机制。这个算法把"对象是否不再需要"简化定义为"对象是否可以获得".

从2012年起, 所有现代浏览器都使用了标记-清除内存回收算法. 所有对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进.

编译过程和这颗树好像不占内存不占时间似的,而且运行期的多态是不是被限制了,你说对就对吧。

https://blog.csdn.net/renfufei/article/details/39376311

https://blog.csdn.net/u010178308/article/details/85917828

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Memory_Management

https://zhuanlan.zhihu.com/p/30552148

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • point inside 点在框内

    如果是矩形比较简单,直接判断四个点的范围,不能推广到多边,考虑到图形的凹凸就更复杂,考虑到程序需要直接拿来用罢了,

    readme
  • IP camera access 网络摄像头调用

    GoPro访问基于无线网络连接和socket直接访问udp资源,实测视频延迟有点厉害,应该还是码流/压缩的原因,访问有些应用层的rtsp协议相对更快,同时Op...

    readme
  • JVM-JMM 虚拟机-内存模型

    In software development, the programming language Java was historically consider...

    readme
  • 持续3分钟 - Java -05

    在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引 用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收...

    子乾建建-Jeff
  • Java引用类型:强引用,软引用,弱引用,虚引用

    Java中的引用,有点像C++的指针,通过引用,可以对堆中的对象进行操作。 在我们的代码生涯中,大部分使用的都是强引用,所谓强引入,都是形如Object o =...

    每天学Java
  • Java强引用、软引用、弱引用及虚引用深入探讨

    引用类型在日常开发中并不常关注,也很少注意到,因此很多人忽略了它们的存在,而事实上,引用类型在Java体系中扮演着十分重要的角色,要想对Java体系有一个更深层...

    弗兰克的猫
  • 译文:理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者。我常常会面试他们说,“你能给我介绍一些Java中得弱引用吗?”,如果面试者这样说,“嗯,是不是垃圾回收...

    技术小黑屋
  • JVM学习记录-对象已死吗

    前言 先来回顾一下,在jvm运行时数据区,分为两部分,一个部分是线程共享区,主要包括堆和方法区,另一部是线程私有区分包括本地方法栈,虚拟机栈和程序计数器。在线程...

    纪莫
  • JVM--对象回收

    Java运行时数据区包括:程序计数器、虚拟机栈、本地方法栈、Java堆和方法区。这里面程序计数器、虚拟机栈和本地方法栈是线程私有的,当线程结束或者方法退出时其内...

    SuperHeroes
  • Java学习笔记——对象的生死

    Oceanlong

扫码关注云+社区

领取腾讯云代金券