
测量实时Web应用程序在真实用户设备和 *** 连接上的响应能力。它可以通过以下方式帮助识别客户端和服务器端代码中的瓶颈:
API解决了与典型性能评估相关的几个问题:
以下部分描述了您可以使用Performance API的方式。建议您了解一些和的知识。
大多数现代浏览器都支持Performance API——包括IE10和IE11(甚至IE9也有有限的支持)。您可以使用以下 *** 检测API的存在:
if ('performance' in window) {
// use Performance API
}
百分比的Polyfill API是不可能的,所以要小心缺少浏览器。如果您的90%的用户都乐于使用Internet Explorer 8进行浏览,那么您只能衡量10%的客户端具有更强大的应用程序。
该API可以在中使用,它提供了一种在后台线程中执行复杂计算而无需停止浏览器操作的 *** 。
大多数API *** 都可以通过标准在服务器端Node.js中使用:
// Node.js performance
import { performance } from 'node:perf_hooks';
// or in Common *** : const { performance } = require('node:perf_hooks');
conSOLe.log( performance.now() );
Deno提供了标准的:
// Deno performance console.log( performance.now() );
您需要使用--allow-hrtime权限运行脚本以启用高分辨率时间测量:
deno run --allow-hrtime index.js
服务器端性能通常更容易评估和管理,因为它取决于负载、cpu、RAM、硬盘和云服务限制。硬件升级或流程管理选项(例如、和)可能比重构代码更有效。
出于这个原因,以下部分将重点介绍客户端性能。
Performance API可用于确定应用程序函数的执行速度。您可能使用过或遇到过使用的计时函数:
const timeStart = new Date(); runMyCode(); const timetaken = new Date() - timeStart; console.log(`runMyCode() executed in ${ timeTaken }ms`);
Performance API提供了两个主要好处:
Date()测量到最接近的毫秒,但Performance API可以测量毫秒的分数(取决于浏览器)。Date()基于度量的指标并不总是准确的。这意味着当时钟向前移动时,您的函数可能会显得特别慢!Date()等效的 *** 是返回一个高分辨率时间戳,当负责创建文档的进程启动时(页面已加载),该时间戳设置为零:
const timeStart = performance.now();
runMyCode();
const timeTaken = performance.now() - timeStart;
console.log(`runMyCode() executed in ${ timeTaken }ms`);
非标准属性也可以返回从1970年1月1日开始的时间戳,尽管这在IE和Deno中不可用。
performance.now()在进行多次测量时变得不切实际。Performance API提供了一个缓冲区,您可以在其中记录事件以供以后分析, *** 是将标签名称传递给:
performance.mark('start:app');
performance.mark('start:init');
init(); // run initialization functions
performance.mark('end:init');
performance.mark('start:funcX');
funcX(); // run another function
performance.mark('end:funcX');
performance.mark('end:app');
可以使用以下 *** 提取性能缓冲区中所有标记对象的数组:
const mark = performance.getEntriesByType('mark');
示例结果:
[
{
detAIl: null
duration: 0
entryType: "mark"
name: "start:app"
startTime: 1000
},
{
detail: null
duration: 0
entryType: "mark"
name: "start:init"
startTime: 1001
},
{
detail: null
duration: 0
entryType: "mark"
name: "end:init"
startTime: 1100
},
...
]
*** 计算两个标记之间的时间并将其存储在性能缓冲区中。您传递一个新的度量名称、起始标记名称(或null以从页面加载测量)和结束标记名称(或null以测量当前时间):
performance.measure('init', 'start:init', 'end:init');
一个被附加到具有计算持续时间的缓冲区中。要获取此值,您可以请求所有度量的数组:
const measure = performance.getEntriesByType('measure');
或按其名称请求度量:
performance.getEntriesByName('init');
示例结果:
[
{
detail: null
duration: 99
entryType: "measure"
name: "init"
startTime: 1001
}
]
除了标记和测量,性能缓冲区还用于自动记录导航时间、资源时间和绘制时间(我们将在后面讨论)。您可以获得缓冲区中所有条目的数组:
performance.getEntries();
默认情况下,大多数浏览器提供一个缓冲区,最多可存储150个资源指标。这对于大多数评估来说应该足够了,但是如果需要,您可以增加或减少缓冲区限制:
// record 500 metrics performance.setResourceTimingBufferSize(500);
可以按名称清除标记,也可以指定一个空值来清除所有标记:
performance.clearmarks('start:init');
同样,可以按名称或空值清除所有度量值:
performance.clearMeasures();
可以监视性能缓冲区的更改并在发生特定事件时运行函数。如果您使用来响应DOM更新或使用来检测元素何时滚动到视口中,那么语法将会很熟悉。
您必须使用两个参数定义观察者函数:
function performanceCallback(list, observer) {
list.getEntries().forEach(entry => {
console.log(`name : ${ entry.name }`);
console.log(`type : ${ entry.type }`);
console.log(`start : ${ entry.startTime }`);
console.log(`duration: ${ entry.duration }`);
});
}
该函数被传递给一个新的 Performanceobserver 对象。它的 *** 被传递一个 Performance buffer entryTypes 数组来观察:
let observer = new PerformanceObserver( performanceCallback );
observer.observe({ entryTypes: ['mark', 'measure'] });
在此示例中,添加新标记或度量会运行该performanceCallback()函数。虽然它只在此处记录消息,但它可用于触发数据上传或进行进一步计算。
Paint Timing API仅在客户端JavaScript中可用,并自动记录对很重要的两个指标:
这些可以从性能缓冲区中提取到一个数组中:
const paintTimes = performance.getEntriesByType('paint');
在页面完全加载之前,请小心运行此命令;值将不会准备好。要么等事件或使用监视paint入口类型。
示例结果:
[
{
"name": "first-paint",
"entryType": "paint",
"startTime": 812,
"duration": 0
},
{
"name": "first-contentful-paint",
"entryType": "paint",
"startTime": 856,
"duration": 0
}
]
缓慢的首次绘制通常是由阻止渲染的CSS或JavaScript引起的。如果浏览器必须下载大图像或,则与first-contentful-paint的差距可能会很大。
图像、样式表和JavaScript文件等资源的 *** 计时会自动记录到性能缓冲区。虽然您几乎无法解决 *** 速度问题(除了减小文件大小),但它可以帮助突出资产较大、Ajax响应缓慢或第三方脚本性能不佳的问题。
可以使用以下 *** 从缓冲区中提取一组:
const resources = performance.getEntriesByType('resource');
或者,您可以通过传递其完整URL来获取资产的指标:
const resource = performance.getEntriesByName('https://test.com/script.js');
示例结果:
[
{
connectEnd: 195,
connectStart: 195,
decodedBodySize: 0,
domainLookupEnd: 195,
domainLookupStart: 195,
duration: 2,
encodedBodySize: 0,
entryType: "resource",
fetchStart: 195,
initiatorType: "script",
name: "https://test.com/script.js",
nextHopProtocol: "h3",
redirectEnd: 0,
redirectStart: 0,
requestStart: 195,
responseEnd: 197,
responseStart: 197,
secureConnectionStart: 195,
serverTiming: [],
startTime: 195,
transferSize: 0,
workerStart: 195
}
]
可以检查以下属性:
此示例脚本检索由发起的所有Ajax请求并返回总传输大小和持续时间:
const fetchAll = performance.getEntriesByType('resource')
.filter( r => r.initiatorType === 'fetch')
.reduce( (sum, current) => {
return {
transferSize: sum.transferSize += current.transferSize,
duration: sum.duration += current.duration
}
},
{ transferSize: 0, duration: 0 }
);
卸载前一页和加载当前页的 *** 时间会作为单个对象自动记录到性能缓冲区。
使用以下 *** 将其提取到数组中:
const pageTime = performance.getEntriesByType('navigation');
…或者通过将页面URL传递给.getEntriesByName():
const pageTiming = performance.getEntriesByName(window.location);
这些指标与的指标相同,但还包括特定于页面的值:
典型问题包括:
Performance API允许您整理真实世界的使用数据并将其上传到服务器以进行进一步分析。您可以使用)来存储数据,但第三方脚本可能会被阻止或引入新的性能问题。您可以根据自己的要求定制您自己的解决方案,以确保监控不会影响其他功能。
警惕无法确定统计数据的情况——可能是因为用户使用旧浏览器、拦截JavaScript或在公司 *** 后面。了解缺少哪些数据可能比基于不完整信息做出假设更有成效。
理想情况下,您的分析脚本不会因运行复杂计算或上传大量数据而对性能产生负面影响。考虑利用 *** 工作者并尽量减少同步localStorage调用的使用。以后总是可以批量处理原始数据。
最后,要警惕异常值,例如对统计数据产生不利影响的非常快或非常慢的设备和连接。例如,如果9个用户在2秒内加载了一个页面,但第10个用户的下载时间为60秒,则平均延迟接近8秒。更现实的指标是中位数(2秒)或第90个百分位(每10个用户中有9个用户的加载时间为2秒或更短)。
Web性能仍然是开发人员的一个关键因素。用户希望网站和应用程序能够在大多数设备上做出响应。搜索引擎优化也会受到影响,因为。
有很多性能监控工具,但大多数评估服务器端执行速度或使用有限数量的有能力的客户端来判断浏览器渲染。Performance API提供了一种整理真实用户指标的 *** ,这是任何其他方式都无法计算的。
扫描二维码推送至手机访问。
版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。
Linux面板环境安装,主要支持LNMP和LAMP、Tomcat、node.js。不过对于大部分站长来说,主要是LNMP和LAMP两个环境的安装。 LNMP和LAMP两个环境的最大区别是,前者采用Nginx作为Web服务器,后者则采用Apache作为Web服务器。(选择哪个作为您的Web服务器,可...
本章节主要是对宝塔面板的主界面的各个版本进行一个简单的说明。 宝塔面板主界面主要包括:服务器操作系统、服务器状态、站点信息、软件管理及网络流量几个部分。 Windows面板有部分功能未实现,其余部分与Linux面板同步。 系统操作...
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
PHP开发:有些人认为它是,另一些人认为它是一种过时的技术,不值得花时间学习。但是这些数字说明了什么,尤其是当您查看PHP开发人员的薪水时? 虽然肯定有许多更新、更炫、更令人兴奋的语言,但PHP仍然是后端Web开发的可靠主食,也是许多雇主仍在寻找的技能。 有兴趣自己成为PHP开发人员吗?我们...
市场上有各种各样的数据库可供选择,用户通常可以仔细考虑PostgreSQL与SQL Server,以便为他们的用例找出更好的选择。使用PostgreSQL进行运营的组织可能希望切换到像Microsoft SQL Server这样的数据库,因为它主要迎合不同的数据仓库解决方案、电子商务和其他业务线...
您可能听说过SaaS,您可能听说过PaaS和IaaS,但您听说过函数即服务 (FaaS) 吗? FaaS市场正在快速增长。根据Allied Market Research的数据,2018年市场价值 。预计到2026年,这一数字将增长到240亿美元——这意味着该行业将从2020年到2026年以2...