JavaScript对象的初始化时间是否取决于变量和函数的数量?

时间:2013-07-25 11:45:09

标签: javascript prototype performance

问题1:如果JavaScript对象有大量的变量和函数,是否需要花费更多的时间来初始化它?

问题2:大型JavaScript(.js)文件大小是否存在性能问题?

对于实例: 我正在使用Prototype创建一个JavaScript对象,我的示例代码如下:

function SimpleObject(){
     // no variables and functions attached to it
}
function RootObject(){
   var one = "one";
   var two = "two";
   .
   .
   var one_thousand = "One Thousand";
}
function Child_1_Object(){
    // n number of variables
}
.
.
function Child_1000_Object(){
    // n number of variables
}

RootObject.prototype.get_Child_1_Object = function(){
   return new Child_1_Object();
}
.
.
RootObject.prototype.get_Child_1000_Object = function(){
   return new Child_1000_Object();
}

以上所有代码都在一个.js文件中,该文件有10k行代码(10KLOC) 我的问题是,当我创建一个RootObject对象时,与创建SimpleObject相比,它会花费更多时间吗?

3 个答案:

答案 0 :(得分:1)

  1. 当然。在快速,现代的浏览器中,这些是毫秒(或更少),但每个变量必须初始化,因此10k总是比1差。

  2. 因为它需要被浏览器下载(所以越大 - 越慢),而不是由js引擎解析(再次 - 越大 - 越慢)

  3. 这是简单的数学,虽然 - 就像我之前说过的那样 - 你只是初始化变量 - 延迟可以忽略不计,所以你不必担心。

答案 1 :(得分:1)

  1. 否。实例化新对象所需的大部分时间将取决于构造函数中的操作。
  2. 拥有大量JavaScript(10k甚至不是远程大型JavaScript文件)的主要问题仍然是它真正在做什么?如果你有10MB的JavaScript,一些JavaScript虚拟机可能会遇到性能问题,但是我甚至从未见过类似于ExtJS 3.4的Internet Explorer 7,它有大约2.5mb的未压缩JavaScript。
  3. 现在,下载速度可能是一个问题,但解析JavaScript不是。所有这些都是用C或C ++编写的,运行速度非常快。当您在JavaScript中声明对象类型时,其中大部分只是代码解析并将原型作为JavaScript VM中的已知类型进行分配。它不必在那时实际执行构造函数,因此上面的代码将快速运行,直到您开始初始化对象。

    解析JavaScript的另一个问题是解析只是其他语言采取的步骤之一。 Java,C#,C,C ++等也至少具有将解析树转换为某种形式的目标代码的阶段。 Java和C#停在那里因为他们的运行时必须动态地进行额外的JIT编译和优化;在生成可用的机器代码之前,C / C ++和其他一些人必须进行链接和优化。并不是说编程语言上的“解析很容易”,但它不是性能最密集的部分。

答案 2 :(得分:1)

问题一:

使用成员,函数等使对象更复杂将增加实例化它所需的时间。我在这里写了一个简单的jsPerf测试来证明这一点:http://jsperf.com/simple-vs-complex-object

有一点需要注意的是,你仍然会在一秒钟内创建数十万个对象 - 即使对于非常复杂的对象,它也不会很慢。

问题二:

大文件只是因为它们在客户端必须下载它们时的大小才有问题。缩小代码将有助于此。例如http://javascript-minifier.com/