使用prototype特性编程中的效率问题
前几天有位网友询问了我一个问题,主要是关于JavaScript的prototype特性的效率。因为作为一个如此强大并且灵活的东西,难免会让人觉得效率上可能有较大的损失。但是实际上prototype特性的效率怎么样呢?我们下面来详细说说这个问题。
之前我曾经写过两篇随笔介绍JavaScript语言的prototype特性,"JScript中的prototype(原型)属性研究(1)"和"JScript中的prototype(原型)属性研究(2)"。第一篇非常基础,只是说明了prototype的用途和用法,第二篇基本上算是深入说明了JavaScript的prototype的实现机制,不过当时没有对prototype的效率作任何讨论,真是遗憾。
先看一个prototype属性和方法效率比较的示例:
<head>
<title>Prototype Performancetitle>
<meta name="author" content="birdshome@cnblogs" />
</head>
<body>
<script language="javascript">
function fnMethod(i)
{
var tmp = i+3;
}
Object.prototype.i = 0;
Object.prototype.fnMethod = function()
{
var tmp = this.i+3;
}
</script>
<script language="javascript">
function Test_fnMethod()
{
var dt = new Date();
for ( var i=0 ; i < 100 ; ++i )
{
for ( var j=0 ; j < 10000 ; ++j )
{
fnMethod(i);
}
}
alert(new Date() - dt);
}
function Test_prototype_fnMethod()
{
var obj = {};
var dt = new Date();
for ( var i=0 ; i < 100 ; ++i )
{
for ( var j=0 ; j < 10000 ; ++j )
{
obj.fnMethod();
}
}
alert(new Date() - dt);
}
</script>
<button onclick="Test_fnMethod()">
fnMethod</button>
<button onclick="Test_prototype_fnMethod()">
prototype.fnMethod</button>
</body>
</html>
上面示例的测试结果分别是:4,046ms和4,719ms!(P4 2.4G IE6 SV1 en)。普通方法和原型方法之间的每一次调用效率差别为:663/1,000,000 毫秒(实际上是一次原型属性和一次原型方法调用共同消耗的时间周期,var tmp = this.i+3;)。
这个结果看起来挺不错的,似乎使用prototype也就不存在什么效率问题了。但是如果我们在一个页面中使用了大量的自定义对象,同时对象又和表现层的HTML元素对象建立了较密切的引用联系后,我们常常会觉的整个页面对脚本的执行都慢了下来,这是怎么回事呢?是谁在吞噬CPU资源?!
这是由于JavaScript这种脚本语言不需要用户管理内存使用,所以它自身需要管理自己的资源开销,也就是说JavaScript的运行引擎要负责GC。但是JavaScript使用的"简单标记清除"算法,对于复杂的环状引用的标记不是很有效(我在IE的Memory Leak相关文章中有详细介绍),加之IE对于DHTML DOM象生存期策略等问题。当页面内的DOM和脚本对象越来越多,并不能及时释放后,IE的脚本执行效率就非常明显的降下来了。严重到我们刚打开IE时很简单的一个脚本操作,都会变得很缓慢,一执行CPU就会串到一个很高的占用峰值。
转载于:https://www.cnblogs.com/birdshome/archive/2005/08/01/205128.html
使用prototype特性编程中的效率问题相关推荐
- 【转】游戏编程中的人工智能技术--神经网络
原文:http://blog.csdn.net/ecitnet/article/details/1799444 游戏编程中的人工智能技术 . > . (连载之一) 用平常语言介绍神经网络(Ne ...
- 详解Java多线程编程中LockSupport类的线程阻塞用法
转载自 详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...
- 函数式编程中的两个棘手问题
作者 | Matthew Butterick 译者 | 弯月 出品 | CSDN(ID:CSDNnews) 大约从十年前,我开始使用Lisp编程语言,后来我喜欢上了函数式编程.每当使用非Lisp语言 ...
- 在JavaScript面向对象编程中使用继承(5)
明天就要回老家去过年了,关于这个"在JavaScript面向对象编程中使用继承"的话题居然还没有说完.如果不完成,留下来一拖就拖到明年去了.所以还是抽空把它写完,今年的事情今年做, ...
- 游戏编程中的人工智能技术--神经网络
游戏编程中的人工智能技术 . <神经网络入门> . (连载之一) 用平常语言介绍神经网络 (Neural Networks in Plain English) 因为我们没有很好了解大脑, ...
- 游戏编程中的人工智能技术
游戏编程中的人工智能技术 转自http://blog.csdn.net/aifuture/article/details/1852030 分类: 神经网络 2007-10-28 17:44 652人阅 ...
- 浅谈软件编程中的8大数据结构
文章目录 前言 一.为什么要研究数据结构 二.数据结构的分类 1.数组(Array) 2.链表(Linked List) 3.队列(Queue) 4.栈(Stack) 5.散列表(Hash) 6.树( ...
- 函数式编程中的组合子
函数式编程是一个比较大的话题,里面的知识体系非常的丰富,在这里我并不想讲的特别的详细.为了应对实际中的应用,我们讲一下函数式编程中最为实用的应用方式--组合子.组合子本身是一种高阶函数,他的特点就是将 ...
- 高灵敏度压电传感器频率温度特性测量中的TEC型精密温控系统
摘要:为解决石英晶体微量天平这类压电传感器频率温度特性全自动测量中存在的温度控制精度差和测试效率低的问题,本文在TEC半导体制冷技术基础上,提出了小尺寸.高精度和全自动程序温控的解决方案,给出了温控装 ...
最新文章
- 数码管c语言程序如何控制,跪求,8255控制数码管,单片机c语言程序;
- UFLDL教程:Exercise:Softmax Regression
- 【flink】Flink常见Checkpoint超时问题排查思路
- python 集合技巧
- c 语言 strcmpy的实现
- python入门教程pdf-《python基础教程(第3版)》高清版PDF免费下载
- 信息检索 IR 中的评价指标
- [转]SQL Collation冲突解决 临时表
- LiteIDE简单使用
- 刷屏专用超长复制_求超长的刷屏文字
- 什么是UV贴图和展开?游戏建模纯干货,UV的详细解释,不懂得赶紧看过来!
- 微信小程序的爱心点赞
- OOM ResourceExhaustedError
- TCP之长连接与短连接
- 变态杀人狂 (数学)
- 《精通Tableau商业数据分析与可视化》之序言
- HealthKit Swift 教程: workout
- vue+elementUI 照片墙图片的删除按钮动态显隐
- 游戏模型设计用什么软件
- 【数字信号处理】基于matlab LMD算法和ELMD算法管道泄漏信号处理【含Matlab源码 1985期】
热门文章
- 用android制作一个记事本app_用扁平化呈现一个天气APP
- 关于PHP代码的开始和结束标签书写,关于PHP结束标签?gt;的使用细节
- 大数据技术之 Kafka (第 1 章 Kafka 概述)
- Hibernate中的三种数据持久状态和缓存机制
- DTC跨境电商白皮书
- 产品经理如何洞察人性?
- 2020年中国住宿业市场网络口碑报告
- html tab切换jquery,jQuery版Tab标签切换
- echarts mysql_ECharts实现mysql 数据图表化
- elementui下拉框选择图片_Element UI系列:Select下拉框实现默认选择