文章采集api 终极:性能指标的信仰危机

优采云 发布时间: 2022-10-23 16:49

  文章采集api 终极:性能指标的信仰危机

  阅读这篇文章的你或多或少都接触过前端性能优化。这种联系可能来自您的阅读经历或*敏*感*词*。那么我们不妨从一个非常简单的思想实验开始。请根据您对该领域的理解回答以下问题:

  不要有压力,你可以慢慢思考和回答这些问题。你对第一个问题的回答可能会随着第二个和第三个问题的出现而不断调整。

  这篇文章的目的就是对以上三个问题进行探索和尝试性的回答。希望我的回答能给你一些启发。

  一次重播

  目前,我的项目长期依赖 GA(Google Analytic)作为衡量页面性能的唯一工具。在 GA 生态系统中,我们最重视 Avg Page Load Time(以下简称 APLT),通过它来决定我们网站当前的性能状态是什么。

  但是,在定期采集这个指标数据的过程中,我们发现用户的感受和数据显示可能并不一致。具体来说,数据看起来很流畅,但用户体验却直线下降。

  所以我们必须回答一个关键问题,APLT 究竟测量的是什么?

  什么是关键,因为它的答案决定了我们需要解决的下一个问题以及我们需要采取的行动:

  但是,官方文档对这个指标的解释是模棱两可的:

  平均页面加载时间:从开始网页浏览(例如,单击页面链接)到在浏览器中加载完成所花费的平均时间量(以秒为单位)。

  平均 页面加载时间由两部分组成:1)网络和服务器时间,2)浏览器时间。Explorer 选项卡的 Technical 部分提供有关网络的详细信息,剩余时间是用于解析和执行 JavaScript 以及呈现页面的浏览器开销。

  对于它的解释,我们有几个问题:

  遗传算法的实施

  GA底层是采集通过Navigation Timing API的性能数据

  GA 不计算每个阶段的数据。它将一些合并的指标重命名为新的指标,其中一些,例如 Document Interactive Loaded,实际上是某些阶段的统计信息的总和:

  GA 只计算与 DOM 文档相关的数据。APLT定义中提到的加载完成时间是指loadEventEnd事件发生的时间,即onLoad事件被触发的时间(当load事件被触发时,是指所有外部资源,包括iframe、图片、脚本、样式已加载)。因此,APLT 值是 GA 中所有指标中时间跨度最宽的。

  脚本对平均页面加载时间有什么影响

  如上图所示,浏览器在从上到下解析DOM树时,会遇到很多图片、样式、脚本等外部资源。所以它需要从缓存或网络中请求这些资源。

  页面的解析是同步的,所以脚本的加载会导致页面解析的暂停。浏览器在继续解析之前需要加载、编译和执行脚本,这是有道理的,因为 JavaScript 可能会使用 document.write() 等方法来改变 DOM 的结构。您可能听说过将 async 或 defer 属性添加到脚本标签以异步加载和执行脚本。但它在我们的生产中不起作用,因为 async 不保证脚本执行的顺序。但这种方案不一定适用于所有页面,因为 async 无法保证脚本的执行顺序。如果你的应用程序对脚本的执行顺序有严格的要求,那么它就帮不了你了。

  目前浏览器都配备了preloader机制来提前扫描页面中的外部元素,但是这个机制没有统一的标准,无法衡量效果,所以我们暂时不考虑它对我们的影响.

  脚本下载后,需要进行解析(parse/compile)和执行(run/execute)。解析阶段首先将 javascript 代码编译成机器语言,执行阶段将实际运行我们编写的代码。脚本的解析和执行也会阻塞页面的解析

  所以综上所述,我们可以得出结论,该脚本确实可以影响APLT。

  但是放弃衡量和谈论伤害都是流氓行为。它的影响范围有多大?也就是如果APLT是2秒,那么脚本用了多少时间?

  这里没有具体的数字,但也不能小觑,足以影响性能。Addy Osmani 在 2017 年的一篇文章 文章 中指出 Chrome 的脚本引擎会花费编译时间

  虽然 Chrome 此后优化了编译过程,但执行脚本过长的问题依然存在。同时这只是Chrome中的情况,我们无法确认其他浏览器在编译脚本时也能保证同样的效率

  如果APLT由不同的阶段组成,我们是否可以计算出每个阶段的具体时间?

  回顾上面对 GA 指标的定义,至少我们现在可以将服务器时间和浏览器时间分开。但是浏览器时间呢?比如脚本的下载时间和执行时间,我们无从得知。这些是额外的计算和 采集。

  综上所述,我们完全依赖APLT来诊断网站的性能问题是不可靠的,简单地认为脚本负担拖慢了性能也是不完全的。

  对指标的信任危机

  我想您可能会明白为什么我在上一节中花了这么多时间来解释仅一个指标的含义。因为一个指标可以揭示的信息可能比你想象的要复杂,领先和误导并存。

  首先,我不反对使用通用指标,并且这个 文章 并不是对它们的批评,它们在帮助我们解决性能问题方面提供了巨大的帮助。我这里要讨论的是,如果常规指标是性能监控的底线,那么上限在哪里?

  从以上描述不难看出,APLT的维度过于宽泛,更倾向于综合技术指标,向我们展示趋势而非细节。这有两个问题:

  接下来,我们深入讨论这两个问题。

  以用户为中心

  您可能已经注意到,当前前端性能监控的趋势正在逐渐向 User-Centric Performance Metrics 发展。为什么会出现这种情况?因为随着单页应用的普及和前端功能的“繁重”,经典的以资源为中心的性能指标(如 Onload、DOMContentLoaded)越来越无法准确反馈真实的用户体验和产品性能。在后端渲染的传统多页面应用模式中,资源加载完成意味着页面可供用户使用;而在单页模式下,资源加载的完成与产品的可用性之间存在一定的差距,因为只有这样,应用才能真正向用户请求个性化数据,呈现定制化的页面。

  一般来说,越来越多的重要和耗时的工作发生在资源加载之后,我们需要监控这部分工作的性能。

  好消息是浏览器原生为我们提供了这方面的支持。例如,Chrome 在 Performace API 中提供了 Paint Timing API,如首次绘制(FP)、首次内容绘制(FCP)、交互时间(tti)等指标。数据。顾名思义,这些指标试图从用户体验的角度显示应用在浏览器中呈现时的性能;坏消息是,这些指标在衡量真实用户体验方面仍然不准确。

  以上面提到的FP、FCP、TTI这三个指标为例,我将通过一个简单的例子来说明这三个指标是如何不够准确的:在单个页面的初始化过程中,我们通常会提供类似于“ “正在加载”视图,通常是占位符或骨架样式,将在数据请求完成后渲染实际视图:

  如果加载时间过长,浏览器会认为“加载中”的视图是用户可用的最终产品形式,并以此为基准计算上述三个指标

  

  下面的代码模拟了一个日常的情况,包括上面提到的情况:在组件加载时模拟两个请求,其中一个需要5秒的长时间等待,只有当两个请求都返回时,才能渲染数据。否则,总是提示用户加载。

  function App() {

const [data, setState] = useState([]);

useEffect(() => {

const longRequest = new Promise((resolve, reject) => {

setTimeout(() => {

resolve([]);

}, 1000 * 5)

});

const shortRequest = Promise.resolve([]);

Promise.all([longRequest, shortRequest]).then(([longRequestResponse, shortRequestResponse]) => {

setState([

['', 'Tesla', 'Mercedes', 'Toyota', 'Volvo'],

['2019', 10, 11, 12, 13],

['2020', 20, 11, 14, 13],

['2021', 30, 15, 12, 13]

])

})

}, []);

return (

{data && data.length

?

: }

)

}

  复制

  如果您尝试在浏览器中运行上述应用程序,通过 Devtools 观察到的各种指标如下:

  可以通过开发者工具观察各种指标,如DCL(DOMContentLoaded Event)、FP、FCP、FMP(first有意义的绘制)、L(Onload Event)都在页面加载后的一秒左右发生。但是,从代码中我们可以肯定,用户至少需要 5 秒钟才能看到真实的内容。因此,上述指标并不能真正反馈用户遇到的性能问题。

  我已将该应用程序部署到该站点并可以在线访问它。并且你可以用它来做更详细的性能测试,它会给出和 devtools 一样的结果。网页测试是一个用于网站 性能测试的开源免费工具。早在 2012 年还没有 FP 等指标的时候,其原有的 Speed Index 指标就能够衡量用户体验。

  一般来说,如上图所示,浏览器提供的API只能衡量D阶段的性能,对E阶段和F阶段的表现帮助不大。

  这只是原生指标不准确的一个例子,可以总结为后端接口延迟过长。但是,还有一种情况是前端渲染时间过长。例如,当我们使用 Handsontable 组件渲染数千行数据表时,甚至会导致浏览器死机,这对 Paint Timing API 是免疫的。

  tti 指标呢?听起来它不是可以检测页面是否是交互式的吗?是不是无法检测到页面的假死?

  不幸的是,它仍然不起作用。

  如果你看一下 tti 指标的定义,你会发现 tti 本质上是一个算法:

  并且目前的原生 API 不支持 tti 指标,需要通过 polyfill 来实现。根据官方说明,目前并不适合所有网络应用。

  双向指示器

  

  这是知乎创作者中心页面的截图

  在此页面上,知乎 将每天向您更新过去 7 天的 文章 阅读、点赞、评论和其他数据的摘要。上图中的虚线是读数的数量。

  我知道它的目的是向创作者提供关于他们的数据的反馈,以帮助他们制作更好的内容,但至少对我来说它根本不起作用。因为我更想知道增长从哪里来,这样我就可以针对带来点击的内容。但它带给我的始终是聚合数据。

  这一要求也适用于性能监控。监控的目的是及时发现和解决问题。因此,在考察数据的过程中,我们更关心异常波动发生的时间和地点,也希望数据能在这方面对我有所帮助。

  当然,我们不可能无中生有地将一组汇总数据还原为详细数据,但在这个问题上我们可以从两个方向着手:

  在《Web Performance Calendar 2020 Edition 中的 Web 性能工具愿望清单》一文中,作者提出了他理想的性能工具应该满足的四个功能,即:

  其中第二个和第三个对我们选择指标也是有效的,这与我上面强调的不谋而合。

  最后,再次强调,这并不是对传统指标的否定。有数据的效果总比没有好。指标越多,绩效概况就越准确。以下是如何在这些基础上再接再厉,继续事半功倍,以提高我们寻求问题的效率。

  关于选择指标的一些建议

  上下文驱动

  我之所以不能在这里给你一个大而全面的解决方案是因为我认为这样的事情不存在,一切都取决于你的上下文。

  您可能更熟悉上下文驱动测试,但在我看来,当您选择性能指标或工具时,上下文驱动测试也适用。让我们看一下上下文测试的七个原则中的前两个:

  试想一下,如果把两句中的做法理解为一个度量,甚至直接用一个度量来代替,是不是没有什么不协调的感觉呢?

  乍一看,“上下文驱动”似乎是一个反驳的论点,但实际上它是我们提高监控效率的有效途径。指标本身没有对错之分,但不同人群对指标的看法不同:业务分析师想要的是能够直接展示业务价值的数据,比如点击率、弹窗率、用户转化等;DevOps同学,他们可能关心的是网站的“心跳”,资源的消耗,后端接口的速度;因此,不同的指标在不同的人群中处于潮起潮落的状态。这种分离也可以从技术角度进行划分。有的指标更注重资源,有的指标更注重用户体验。

  Metrics 只是发现问题的一种手段,现在我们有无数种手段可供选择:APM(应用程序性能管理)、日志分析、RUM(真实用户监控)、TTFB(Time to First Byte)……到底它迫使你回到问题的开头:我到底想测量什么?我想测量的对象可以用现有的指标来表达吗?我只想监控?如果我想调试或分析,还有其他选择吗?

  “好的软件测试是一个具有挑战性的智力过程。” (用性能调优代替测试),上下文驱动测试的第六条原则。

  微量元素

  如果说“资源已加载”不可靠,“浏览器开始绘制”不可靠,我认为唯一可靠的就是用户看到的。没有必要用各种数据来显示你的页面加载速度有多快,如果用户每次看到他想看的信息都要等十秒钟,那么这些数字只是自欺欺人。因此,我们不妨跟踪用户注意力信息对应的元素出现的时间。

  这不是创新。从早年的 Speed Index、“首屏”到今天的 web Vitals,都是这一理念的延续。指标的演进过程就像一个不断缩小过程中的圆圈,不断的向用户自身靠拢。只是由于技术手段的限制,他们只能走到这一步,而现在我们有了 MutationObserver 和 Perforamce API,我们可以准确定位元素,甚至元素上的属性发生变化,自然不会受到上面例子的影响。被占位符欺骗。

  对不起,这里不得不再次强调一下上下文:我们不能只关注“一个元素出现的时机”,还要从时间和代码扩展的角度来关注它的形成原因,这仍然需要我们结合环境,这取决于它是如何工作的。两个例子:

  上图中,如果组件D是向客户展示关键信息的关键元素,那么请求到达路由器的时间和组件C被路由器渲染的时间都会对D元素产生影响;从另一个维度:

  脚本和请求的加载和执行速度也会影响元素的外观。如果您需要诊断问题,了解这些问题背后的工作原理至关重要。

  但是跟踪元素还有一个问题,就是难以*敏*感*词*应用。因为它是侵入性的,因为它要求您识别不同页面上的不同关键元素,并以一种近似硬代码的方式逐个跟踪它们。这种类型的工作会产生接近于维护前端 E2E 测试的维护成本。的确,我们可以通过分配统一的id或者类名来降低我们的维护成本,但是相比统一的GA代码,维护成本还是很高的。所以我建议用最简单的方式去监控最直接的元素,不要一个个地写你的监控代码,也不要让你的实现代码被监控代码绑定。

  让工具为您服务

  您可以在市场上找到无数声称可以帮助您提高绩效的工具。但首先你必须小心,他们所宣扬的并不是你真正需要的。

  例如 site24x7 是一家专门提供用户行为监控解决方案的公司。在他们关于 APM 的帮助页面上,指出监视和捕获 SAP(单页应用程序)性能数据实际上是当前技术的一项具有挑战性的工作:

  在单页应用程序的情况下,页面加载完成所用的时间无法通过页面加载事件获取,因为数据是使用从服务器动态获取的

  因此,对于每个 SPA 框架,页面加载指标是通过侦听特定于框架的特定事件来计算的。

  所以对于这种类型的页面,它们只捕获:

  对于每个动态页面加载,都会捕获相应的 URL、相应的 AJAX 调用、每个 AJAX 调用的响应时间、响应代码和错误(如果有)。

  但要知道,在当今流行的SPA中,这样的采集功能显得有些苍白。

  同样,如果您查看 Azure Application Insights 的 JavaScript SDK 中默认采集的页面信息:

  您的应用程序 XHR 和 Fetch 发出的网络依赖请求(默认情况下禁用获取集合)请求,包括有关用户信息(例如,位置、网络、IP)的信息设备信息(例如,浏览器、操作系统、版本、语言、型号)会话信息

  与其他平台提供的相比,我认为这些指标并没有增加额外的价值,它可以真正给我多少真正的“洞察力”。

  另一方面,不要让你的思维被工具限制:不要“因为xx工具只能做这么多,所以我只能采集这些指标”;而是“我想采集这些指标,所以我需要 xx 工具”。这里我列出一个我们正在探索的例子:使用 OpenTracing 工具 Jaeger 可视化前端性能图表。

  这里首先要赞一下Chrome内置的Performance工具,给我们调优性能带来了极大的便利。但我们总是有一些无法满足的额外需求。例如,我希望能够在结果演示中做一些自定义标记,或者在 Performance 选项卡下显示从 connect 到 resposne 的每个请求的每个阶段的状态。

  如下图所示,我们使用Jaeger开源工具跨界采集和展示自定义指标。可以说,不同纬度的指标以时间为线索链接,使页面加载阶段状态一览无余。容易定位问题。

  结束语

  我观察到,对于大部分前端工程师,或者以前的自己来说,做性能监控是一个被“喂”的过程,也就是会习惯性的采集已有的指标,不假思索地使用已有的工具。并且因为性能优化工作过程的前后结果的关系,我们只有在有需求的时候才会发现当前的结果并不是我们想要的。多一点思考将使我们的工作减少浪费。

  终极:解密搜索引擎的工作原理

  想获取更多干货教程,加Q群:173903050

  ★

  网站要想有好的排名,我们必须了解网站的基本优化,这就需要我们对搜索引擎的工作原理有一个很好的了解。只有这样,搜索引擎才会青睐我们的网站。

  知道什么是百度蜘蛛吗?百度蜘蛛是百度搜索引擎的自动程序。它的功能是访问和采集互联网上的网页、图片、视频等内容,然后按类别建立索引库,让用户可以搜索到你的网站网页、图片、视频等内容在百度搜索引擎中。

  搜索引擎在工作中主要进行以下几个步骤:

  ★

  1. 抢

  搜索引擎通过网站的链接不断爬取每个页面,不断采集整理互联网上的内容。这是爬行。我们可以发送外部链接,关注它们,创建高质量的外部链接。,路径要避开中文路径,路径太长,不利于爬行的因素被蜘蛛拒绝。

  

  2.过滤

  搜索引擎爬取后会存入临时数据库,同时过滤掉网站的垃圾内容,保留对用户有益的内容。

  常见的影响因素有:

  (一)文字、图片、视频、链接;

  (2) 速度;

  (3) 页面质量;

  (4)网站的权重和信用;

  (5) 页面的相似性;

  3. 收录

  搜索引擎过滤掉垃圾邮件后,会对剩余的网站内容执行收录。这时候可以使用site命令或者站长平台查看收录的状态。有收录才有排名,收录是保证排名的前提;收录 不一定有排名。

  

  收录 和索引之间的关系是包容关系。索引只能在收录之后建立,收录的数量大于索引的数量。百度站长平台链接提交工具是收录的入口。

  4.排序

  排序取决于两个因素:

  1、基础优化分数要求我们提高基础优化;

  2、用户投票评分需要良好的综合数据来提升用户体验。

  ★

  以上是我对搜索引擎工作原理的基本了解。通过查询我的网站收录的情况,可以判断出网站哪里出了问题,并找到解决方案,从而可以做的更好的优化。

  ★

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线