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 相关文章推荐
Riot.js 快速的JavaScript单元测试框架
Nov 09 Javascript
js中if语句的几种优化代码写法
Mar 12 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
Apr 20 Javascript
深入浅析Extjs中store分组功能的使用方法
Apr 20 Javascript
利用vue-router实现二级菜单内容转换
Nov 30 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
Mar 08 Javascript
webstorm和.vue中es6语法报错的解决方法
May 08 Javascript
微信小程序顶部导航栏滑动tab效果
Jan 28 Javascript
Node.js 多进程处理CPU密集任务的实现
May 26 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
详解vue高级特性
Jun 09 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
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
php Session存储到Redis的方法
2013/11/04 PHP
php实现refresh刷新页面批量导入数据的方法
2014/12/23 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
textarea的value是html文件源代码,存成html文件的代码
2007/04/20 Javascript
js树形控件脚本代码
2008/07/24 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
jQuery 仿百度输入标签插件附效果图
2014/07/04 Javascript
javascript查询字符串参数的方法
2015/01/28 Javascript
代码分析jQuery四种静态方法使用
2015/07/23 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
Angular2使用Angular CLI快速搭建工程(一)
2017/05/21 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
Vue+abp微信扫码登录的实现代码示例
2020/01/06 Javascript
[03:46]DOTA2英雄基础教程 维萨吉
2013/12/11 DOTA
Python使用matplotlib实现在坐标系中画一个矩形的方法
2015/05/20 Python
Python解析最简单的验证码
2016/01/07 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python 禁止函数修改列表的实现方法
2017/08/03 Python
python实现连续图文识别
2018/12/18 Python
python3使用GUI统计代码量
2019/09/18 Python
详解Django将秒转换为xx天xx时xx分
2019/09/27 Python
Python 导入文件过程图解
2019/10/15 Python
python反转列表的三种方式解析
2019/11/08 Python
python主要用于哪些方向
2020/07/05 Python
税务专业毕业生自荐信
2013/11/10 职场文书
民事和解协议书格式
2014/11/29 职场文书
六一儿童节开幕词
2015/01/29 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python