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中常用的55个经典技巧
Aug 12 Javascript
MooTools 1.2中的Drag.Move来实现拖放
Sep 15 Javascript
js 小数取整的函数
May 10 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
Oct 27 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
Feb 25 Javascript
JavaScript中return false的用法
Mar 12 Javascript
超详细的JS弹出窗口代码大全
Apr 18 Javascript
jquery.tableSort.js表格排序插件使用方法详解
Aug 12 Javascript
关于页面刷新vuex数据消失问题解决方案
Jul 03 Javascript
React Native中Navigator的使用方法示例
Oct 13 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
Jul 23 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
一个域名查询的程序
2006/10/09 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP内核学习教程之php opcode内核实现
2016/01/27 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP的Trait机制原理与用法分析
2019/10/18 PHP
qq悬浮代码(兼容各个浏览器)
2014/01/29 Javascript
js 赋值包含单引号双引号问题的解决方法
2014/02/26 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
基于BootStrap Metronic开发框架经验小结【九】实现Web页面内容的打印预览和保存操作
2016/05/12 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
微信小程序实现无限滚动列表
2020/05/29 Javascript
详解webpack打包后如何调试的方法步骤
2018/11/07 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
vue-router路由懒加载及实现的3种方式
2021/02/28 Vue.js
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
python 获取字典特定值对应的键的实现
2020/09/29 Python
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
应届生文秘专业个人自荐信格式
2013/09/21 职场文书
年度考核自我鉴定
2013/11/09 职场文书
单位作风建设自查报告
2014/10/23 职场文书
2014年双拥工作总结
2014/11/21 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
工作自我评价范文
2015/03/05 职场文书
小学生手册家长意见
2015/06/03 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
Redis高并发缓存架构性能优化
2022/05/15 Redis
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers