如何精确计算JS程序运行时间,进而优化代码

JavaScript07

如何精确计算JS程序运行时间,进而优化代码,第1张

一、 让代码简洁:一些简略的表达方式也会产生很好的优化

eg:x=x+1在不影响功能的情况下可以简写为x++

二、 变量名方法名尽量在不影响语意的情况下简单。(可以选择首字母命名)

eg:定义数组的长度可以取名为:ArrLen而不需要取为ArrayLength。

三、 关于JS的循环,循环是一种常用的流程控制。

JS提供了三种循环:for()、while()、for(in)。在这三种循环中for(in)的效率最差,因为它需要查询Hash键,因此应尽量少用for(in)循环,for()、while()循环的性能基本持平。当然,推荐使用for循环,如果循环变量递增或递减,不要单独对循环变量赋值,而应该使用嵌套的++或–运算符。

四、 如果需要遍历数组,应该先缓存数组长度,将数组长度放入局部变量中,避免多次查询数组长度。

因为我们常常要根据字符串、数组的长度进行循环,而通常这个长度是不变的,比如每次查询a.length,就要额外进行一个操作,而预先把var len=a.length,则就少了一次查询。

五、 尽量选用局部变量而不是全局变量。

局部变量的访问速度要比全局变量的访问速度更快,因为全局变量其实是window对象的成员,而局部变量是放在函数的栈里的。

六、 尽量少使用eval。

每次使用eval需要消耗大量时间,这时候使用JS所支持的闭包可以实现函数模板。

七、 减少对象查找

因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

八、 字符串连接。

如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。

如果要连接多个字符串,应该少使用+=,如s+=as+=bs+=c应该写成s+=a + b + c;

而如果是收集字符串,比如多次对同一个字符串进行+=操作的话,最好使用一个缓存。怎么用呢?使用JavaScript数组来收集,最后使用join方法连接起来,如下

var buf = new Array()for(var i = 0i <100i++){ buf.push(i.toString())}var all = buf.join("")

九、 类型转换

1. 把数字转换成字符串,应用"" + 1,虽然看起来比较丑一点,但事实上这个效率是最高的,性能上来说:("" +) >String() >.toString() >new String()

尽量使用编译时就能使用的内部操作要比运行时使用的用户操作要快。

String()属于内部函数,所以速度很快,而.toString()要查询原型中的函数,所以速度逊色一些,new String()用于返回一个精确的副本。

2. 浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()。Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。

3. 对于自定义的对象,如果定义了toString()方法来进行类型转换的话,推荐显式调用toString(),因为内部的操作在尝试所有可能性之后,会尝试对象的toString()方法尝试能否转化为String,所以直接调用这个方法效率会更高

十、 尽量作用JSON格式来创建对象,而不是var obj=new Object()方法。

看得出来你不太懂 JS,先把代码给你,做了很多注释,先仔细看看,然后后面讲解为什么:

// 检查表单的函数

function checkForm() {

/** @type {string} 数据容器 */

var merArr=""

/** @type {number} 局部循环指针 */

var p=0

/** @type {Array.<Element>} 获取待提交的表单元素 */

var items = document.getElementsByName("add_mer")

// 遮罩

Ext.getBody().mask("数据保存中,请稍等...") //这里没有起作用

// 开始检查

doCheck()

function doCheck(){

/**

 * 循环构造字符串

 * 为了避免长时间阻塞,每一段仅允许循环 100 次

 * 如果一次不能完成,则分组完成

 */

for(var i=0 i<100 && p<items.length i++, p++) {

if (items[x].checked) {

merArr =merArr+Trim(items[x].value)+","

}

}

// 如果循环结束

if (p === items.length) complete()

// 如果循环没有完成,则用 setTimeout 交出控制权,延迟循环

else setTimeout(doCheck, 1)

}

// 检查结束,真正的处理表单

function complete(){

document.getElementById("merArray").value = merArr

if(merArr==""){

alert("请勾选!")

Ext.getBody().unmask()

return false

}

document.forms['listForm'].action = 'addGroupMer.action'

document.forms['listForm'].submit()

}

return false

}

下面是讲解:

1、 JS 是阻塞式的。在一个 JS 函数正在执行的时候,对 DOM 的渲染其实对于用户来说是不可见的。也就是说,你在一个 JS 循环中不论对 DOM 做了什么,用户都是看不到中间过程,只能看到一个最终的结果。

2、 所以,上面代码的核心是,把耗时特别长的操作部分,使用 setTimeout 延迟。 setTimeout 可以把控制权还给浏览器,留出足够的页面渲染时间。

3、 setTimeout 的过程中,要注意变量的处理。对于闭包的应用是一个需要注意的地方。

以上,请采纳,请给分。

1、要获得当前时间,我们可以使用Date方法,new一个Date对象。

2、然后调用这个对象的toLocaleTimeString方法,来获取具体的时间

3、最后使用alert方法来弹出结果,来验证一下是否正确

4、运行页面,点击按钮,可以看到弹出一个确认框里,里面显示的时间就是当前时间了。