javascript页面渲染速度测试脚本分享


Posted in Javascript onApril 15, 2014
/* 获取渲染开始的时间戳, 保存在数组PAGE_SPEED_TIME中 */
<html><script type="text/javascript">/*tag*/PAGE_SPEED_TIME = [new Date().getTime()];</script><head>
......
</head>
......
/* 页面最末端,计算页面加载耗用的时间 */
</body>
<script src="http://ossweb-img.qq.com/images/js/pagespeed/page_speed_v2.js"></script></html>

下面来分析一下page_speed_v2.js文件的内容。对这个脚本进行重新格式化,以便更加方便阅读。

/* 执行匿名函数构建对象PageSpeed */
;(function() {
    PageSpeed = {};/* 这里没有 var 关键字, 相当于引用的是 window.PageSpeed */
 /**
     * 绑定createScript方法
  *
  * @param String a script标签的src属性的值
  * @param String b script标签的id属性的值
  */
    PageSpeed.createScript = function(a, b) {
        var c = null;
        if (document.getElementById(b)) { /* script标签已经存在 */
            c = document.getElementById(b)
        } else { /* 不存在, 创建script标签 */
            c = document.createElement('script');
            var d = null;
            if (document.getElementsByTagName) {
                d = document.getElementsByTagName('head')[0] || document.documentElement;
            } else {
                d = document.documentElement;
            }
            d.insertBefore(c, d.firstChild); /* 调用insertBefore方法, 将新创建的script标签插入为第一个子元素 */
        }
  /* 这里的花括号起到代码片段分组功能 */
  {
            c.setAttribute('type', 'text/html');
            c.setAttribute('style', 'display:none;');
            c.setAttribute('charset', 'gb2312');
            c.setAttribute('id', b);
            c.setAttribute('src', a);
        }
        return c; /* 返回创建成功的script标签元素 */
    };
 /**
     * 绑定 submitDataForPageSpeed 方法
  *
  * @param Object a Map对象
  */
    PageSpeed.submitDataForPageSpeed = function(a) {
        var b = {
            'name': '',
            'rate': 0
        };
        b.name = a.name;
        b.rate = a.rate;
  /* a.PAGE_SPEED_TIME数组的最后一个元素减去第一个元素 */
        b['1'] = a.PAGE_SPEED_TIME[a.PAGE_SPEED_TIME.length - 1] - a.PAGE_SPEED_TIME[0];
        for (var i = 1; i < a.PAGE_SPEED_TIME.length - 1; i++) {
            b[(i + 1) + ''] = a.PAGE_SPEED_TIME[i] - a.PAGE_SPEED_TIME[0]
        }
  /* 提交速度测试结果的目的脚本 */
        var c = 'http://pagespeed-ied.qq.com/r.cgi';
  /* 遍历 b 数组的元素, 构建 query string */
        var d = [];
        for (var p in b) {
            d.push(p + '=' + b[p])
        }
        c += '?' + d.join('&');
  /* 创建script标签提交测速结果 */
        PageSpeed.createScript(c, 'submitForPageSpeed')
    };
 /**
  * 绑定 defaultSubmit 方法
  *
  */
    PageSpeed.defaultSubmit = function() {
        var a = '';
        try {
            a = location.host
        } catch(e) {}
        var b = {
            'name': a,
            'rate': 1,
            'PAGE_SPEED_TIME': []
        };
        if (!b.name) {
            return
        }
        if (! (typeof(PAGE_SPEED_TIME) == 'object' && PAGE_SPEED_TIME instanceof Array)) {
            return
        }
  /* 获取新的时间戳 */
        PAGE_SPEED_TIME.push(new Date().getTime());
        b.PAGE_SPEED_TIME = PAGE_SPEED_TIME;
  /*
   * 没看懂这里为啥需要一个新的变量 aaa, 直接使用 a 不可以么?
   * try ... catch 结构中使用的却是一个新的变量 aaaa 但后面却从未使用, 为何? 是否应该是 aaa?
   */
        var aaa = '';
        try {
            aaaa = location.host
        } catch(e) {}
        var c = Math.floor(Math.random() * 10000);
        if (aaa == "ktv.qq.com" || aaa == "ttd.qq.com" || aaa == "tian.qq.com" || aaa == "sura.qq.com" || aaa == "gw.tnt.qq.com" || aaa == "007.qq.com") {
            c = Math.floor(Math.random() * 1000);
        }
  /* 随机概率提交数据 */
        if (c <= b.rate * 1) {
            PageSpeed.submitDataForPageSpeed(b);
        }
    };
 /**
  * 绑定submit方法(用于CDN测速?)
  *
  * @param String a 名称
  */
    PageSpeed.submit = function(a) {
        var b = PageSpeed.cdn_page_speed_submitData;
        var c = {};
        for (var p in b) {
            c[p] = b[p]
        }
        c.name = a || c.name;
        PageSpeed.submitDataForPageSpeed(c);
    }
})();
try {
    /* 1秒后尝试提交数据 */
    setTimeout(function() {
        PageSpeed.defaultSubmit()
    },
    1000);
} catch(e) {}
/* 最后这段注释, 第二段是32位16进制数字, 应该是类似于 ETag 用于标记内容版本的 */
/*  |xGv00|ca82276cd78ac911d3d4310ba1408236 */
Javascript 相关文章推荐
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
三种检测iPhone/iPad设备方向的方法
Apr 23 Javascript
JQuery控制div外点击隐藏而div内点击不会隐藏的方法
Jan 13 Javascript
js实现鼠标经过时图片滚动停止的方法
Feb 16 Javascript
详解JavaScript中的forEach()方法的使用
Jun 08 Javascript
vuejs父子组件之间数据交互详解
Aug 09 Javascript
微信小程序实战篇之购物车的实现代码示例
Nov 30 Javascript
express如何解决ajax跨域访问session失效问题详解
Jun 20 Javascript
JS多个表单数据提交下的serialize()应用实例分析
Aug 27 Javascript
高效jQuery选择器的5个技巧实例分析
Nov 26 jQuery
文章或博客自动生成章节目录索引(支持三级)的实现代码
May 10 Javascript
详解javascript void(0)
Jul 13 Javascript
JS实现静止元素自动移动示例
Apr 14 #Javascript
js 获取元素下面所有li的两种方法
Apr 14 #Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
Apr 14 #Javascript
jquery使用jxl插件导出excel示例
Apr 14 #Javascript
js 获取input点选按钮的值的方法
Apr 14 #Javascript
js生成动态表格并为每个单元格添加单击事件的方法
Apr 14 #Javascript
Js实现动态添加删除Table行示例
Apr 14 #Javascript
You might like
《星际争霸重制版》兵种对比图鉴
2020/03/02 星际争霸
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
js计数器代码
2006/11/04 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
深入理解JavaScript中的预解析
2017/01/04 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
Scrapy-redis爬虫分布式爬取的分析和实现
2017/02/07 Python
Python处理Excel文件实例代码
2017/06/20 Python
python 格式化输出百分号的方法
2019/01/20 Python
Pandas读写CSV文件的方法示例
2019/03/27 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
Django models.py应用实现过程详解
2019/07/29 Python
python 弧度与角度互转实例
2020/04/15 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
2020/05/09 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
pycharm 添加解释器的方法步骤
2020/08/31 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
python 基于opencv操作摄像头
2020/12/24 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
留学自荐信的技巧
2013/10/17 职场文书
复核员上岗演讲稿
2014/01/05 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
导游词之张家口
2019/12/13 职场文书
golang 如何通过反射创建新对象
2021/04/28 Golang
python源码剖析之PyObject详解
2021/05/18 Python
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android