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 相关文章推荐
JavaScript 解析Json字符串的性能比较分析代码
Dec 16 Javascript
HTML DOM的nodeType值介绍
Mar 31 Javascript
实现web打印的各种方法介绍及实现代码
Jan 09 Javascript
Javascript基础教程之关键字和保留字汇总
Jan 18 Javascript
jquery调整表格行tr上下顺序实例讲解
Jan 09 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
通过JS获取Request.QueryString()参数的值实现方法
Sep 27 Javascript
微信小程序后台解密用户数据实例详解
Jun 28 Javascript
ES6中字符串string常用的新增方法小结
Nov 07 Javascript
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
vue el-table实现自定义表头
Dec 11 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
php+dbfile开发小型留言本
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP 柱状图实现代码
2009/12/04 PHP
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
PHP常用数组函数介绍
2014/07/28 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
nginx 设置多个站跨域
2021/03/09 Servers
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
利用select实现年月日三级联动的日期选择效果【推荐】
2016/12/13 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
JavaScript实现时间表动态效果
2017/07/15 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
解决Vue+Element ui开发中碰到的IE问题
2018/09/03 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
2020/08/07 Javascript
利用node.js开发cli的完整步骤
2020/12/29 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
python实现的重启关机程序实例
2014/08/21 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python实现将文本生成二维码的方法示例
2017/07/18 Python
将Dataframe数据转化为ndarry数据的方法
2018/06/28 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
汽车维修专业毕业生的求职信分享
2013/12/04 职场文书
办理护照介绍信
2014/01/16 职场文书
销售个人求职信范文
2014/04/28 职场文书
青春演讲稿范文
2014/05/08 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
行政部经理助理岗位职责
2014/06/15 职场文书
工程造价专业求职信
2014/07/17 职场文书
商场父亲节活动方案
2014/08/27 职场文书
竞选大学学委演讲稿
2014/09/13 职场文书
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
利用Python实现模拟登录知乎
2022/05/25 Python