Chrome浏览器原理及优化
1. 相关面试题
1.1. 请说说从输入 URL 到页面渲染完成的全过程
1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键;
2. DNS解析;
浏览器需要将域名转换为服务器的IP地址,以建立连接。
(1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,则直接获取;
(2). 否则,会向本地域名服务器发起DNS查询请求,通过递归查询的方式获得IP地址;
3. TCP链接;
浏览器与目标服务器之间使用三次握手建立TCP连接:
(1). SYN:浏览器发送SYN同步序号请求包,要求服务器建立连接;
(2). SYN-ACK:服务器收到SYN包后,回应SYN-ACK包;
(3). ACK:浏览器收到SYN-ACK包后,回复ACK确认包,完成连接;
4. TLS握手;
如果使用HTTPS,浏览器与服务器之间进行TLS握手,确保传输的安全性:
(1). 客户端问候:浏览器发送支持的加密套件列表和随机数;
(2). 服务器问候:服务器选择加密套件、返回公钥证书和随机数;
(3). 密钥生成:双方通过公钥证书和随机数生成会话密钥;
(4). 握手完成:双方使用生成的会话密钥加密通信;
5. 发送HTTP请求;
建立连接后,浏览器发送HTTP请求:
(1). 请求行:包括方法、路径、HTTP版本,如GET / HTTP/1.1;
(2). 请求头:携带相关头信息,如User-Agent、Accept-Language;
(3). 请求体:通常在POST请求中携带数据;
6. 服务器处理请求;
服务器接收到请求后:
(1). 根据URL和请求方法,确定处理逻辑;
(2). 可能需要查询数据库或调用其他API;
(3). 生成响应,包括响应行、响应头和响应体;
7. 返回HTTP响应;
服务器发送响应:
(1). 响应行:包括HTTP版本、状态码、状态描述,如HTTP/1.1 200 OK;
(2). 响应头:携带相关头信息,如Content-Type、Cache-Control;
(3). 响应体:通常是HTML、JSON、图片等内容;
8. 浏览器渲染页面;
浏览器开始渲染页面,主要经过以下阶段:
(1). 构建DOM树;
解析HTML文档,构建DOM树,遇到外部资源CSS、JavaScript或是图片时,根据属性决定是否同步或异步加载。
(2). 构建CSSOM树;
解析CSS文件和<style>标签,构建CSSOM树。
(3). 合成渲染树;
将DOM树和CSSOM树合并,生成渲染树,只包含可见元素。
(4). 布局计算;
确定每个元素的大小和位置,根据CSS盒模型进行布局。
(5). 绘制;
绘制每个元素的内容,包括文本、图像、背景等。
(6). 分层与合成;
渲染层分为多个图层,独立绘制并最终组合成完整页面。
9. 执行JavaScript
在页面渲染过程中或渲染完成后,浏览器执行JavaScript脚本:
(1). 阻塞脚本:在构建DOM时遇到<script>标签会暂停解析,直到脚本加载并执行完成;
(2). 异步脚本:async和defer属性可用于异步加载和执行脚本,不阻塞DOM解析;
10. 事件处理与交互
(1). 页面加载完成后,浏览器继续处理用户的交互操作;
(2). 根据事件绑定的处理函数,执行相应的JavaScript代码;
1.2. DOM和CSSOM的关系和影响
1. 描述DOM和CSSOM是如何分别构建的?
DOM是通过解析HTML文档来构建的,每个HTML标签都会变成DOM树中的一个节点。
CSSOM是通过解析CSS文件和<style>标签中的样式信息构建的,它反映了所有CSS规则和对应样式属性的层次结构。
2. 它们是如何相互影响,最终形成渲染树的?
当DOM和CSSOM均构建完成后,浏览器将它们合并成一个渲染树,该树只包括页面中实际需要渲染的元素及其样式信息。
3. 修改DOM或CSSOM中的元素对页面渲染有何影响?
修改DOM或CSSOM都可能引发重排和重绘,严重时会导致整个页面的重新渲染,影响性能,可以借助 transform3D调用GPU优化,减少重排。
1.3. 浏览器的重排与重绘怎么理解
1. 解释什么是重排和重绘?
重排是指浏览器为了重新计算页面布局而进行的过程,通常发生在添加或删除可见的DOM元素,或者元素尺寸改变的情况下。
重绘发生在元素的外观改变,但位置和尺寸未变的情况下,例如改变颜色、阴影等。
2. 提供哪些常见操作会触发重排和重绘?
常见触发重排的操作包括修改DOM结构、改变元素位置和尺寸,而改变颜色或背景图将触发重绘。
3. 如何优化代码以减少重排和重绘的影响?
优化方法包括使用CSS类进行样式变更而非直接操作样式属性,避免在循环中直接操作DOM,利用文档碎片或虚拟DOM来批量更新DOM,使用transform和opacity进行动画处理,因为这些属性可以由合成器处理。
1.4. 请说说浏览器的合成层
1. 什么是浏览器的合成层?
合成层是浏览器处理完重排和重绘后,将页面分割成多个层次,然后由合成器合成最终视觉输出的过程。每个层可以单独被GPU处理,以优化性能。
2. 为何某些CSS属性可以触发GPU加速?
CSS属性如transform和opacity可以触发GPU加速,因为它们不影响DOM的布局,而只是影响元素的外观和位置变换。GPU处理这类变换比CPU更高效,因为GPU专门设计来处理图形和视觉效果。
3. 如何通过开发者工具来识别和优化合成层的性能?
使用Chrome等浏览器的开发者工具的“Layers”面板可以查看页面的层信息。通过这些工具,开发者可以观察哪些元素被创建成单独的层,评估合成层的性能,并进行相应的优化,比如减少不必要的层,合并可以合并的层,或调整动画使用合适的属性来优化GPU处理。
2. 浏览器渲染过程详解
2.1. DNS 查询
对于一个 web 页面来说导航的第一步是要去寻找页面资源的位置。如果导航到 Example Domain,HTML页面被定位到 IP 地址为93.184.216.34的服务器。如果以前没有访问过这个网站,就需要进行 DNS 查询。
浏览器向域名服务器发起 DNS 查询请求,最终得到一个 IP 地址。第一次请求之后,这个 IP 地址可能会被缓存一段时间,这样可以通过从缓存里面检索 IP 地址而不是再通过域名服务器进行查询来加速后续的请求。
每个主机名 在页面加载时通常只需要进行一次 DNS 查询。但是,对于页面指向的不同的主机名,则需要多次 DNS 查询。如果字体、图像、脚本、广
相关文章:
Chrome浏览器原理及优化
1. 相关面试题 1.1. 请说说从输入 URL 到页面渲染完成的全过程 1. 输入URL,用户在浏览器的地址栏输入一个URL,并按下回车键; 2. DNS解析; 浏览器需要将域名转换为服务器的IP地址,以建立连接。 (1). 如果浏览器缓存、操作系统缓存或路由器缓存中已有该域名的IP地址,…...
Vue 3 + Vite + JS 项目中实现组件全局自动化注册的魔法,极致组件自动化注册方案,开发效率飙升300%。
在Vue项目开发中,你是否还在为重复的组件注册代码而烦恼?是否经历过在大型项目中手动维护数百个组件注册的痛苦?本文将揭秘一种革命性的组件自动化注册方案,结合Vite的黑魔法和Vue3的最新特性,让你的开发效率实现质的飞…...
寒假2.8
题解 web:[RoarCTF 2019]Easy Calc 打开,是一个计算界面 看一下源代码,提示设置了WAF,并且有一个calc.php文件 访问一下calc.php文件,得到源码,使用get方式传参赋值给num,设置了黑名单&#x…...
企业如何利用DeepSeek提升网络安全管理水平
企业可以通过深度整合DeepSeek的AI能力,构建智能化、动态化的网络安全防御体系,以应对APT(高级持续性威胁)等复杂攻击。以下是具体策略与实践路径: 1. AI驱动的威胁检测与分析 多模态威胁狩猎 DeepSeek的深度学习技术能…...
C++ libfmt 实战: 高效便捷的格式化库
libfmt 是一个现代化的 C格式化库{fmt}, 具有以下关键特性: 安全性: 受 Python 格式化功能启发, {fmt}为printf系列函数提供安全替代方案. 格式字符串错误在编译时就能被检测出来, 并且通过自动内存管理避免缓冲区溢出错误.可扩展性: 默认支持格式化大多数标准类型, 包括容器,…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_max_sockets
在 Nginx 的源代码中, ngx_max_sockets 全局变量的声明位于 os/unix/ngx_os.h extern ngx_int_t ngx_max_sockets; 定义在 os/unix/ngx_posix_init.c ngx_int_t ngx_max_sockets; ngx_max_sockets 定义了 Nginx 能够同时使用的最大 Socket 文件描述符数量。它…...
Spring Boot接入Deep Seek的API
1,首先进入deepseek的官网:DeepSeek | 深度求索,单击右上角的API开放平台。 2,单击API keys,创建一个API,创建完成务必复制!!不然关掉之后会看不看api key!!&…...
大语言模型实践——基于现有API的二次开发
基于现有的API平台做一些实用的AI小应用。 API服务商:阿里云百炼 云服务器:阿里云(2核2GB) 部署框架:gradio 调用框架:openai 语言:Python (注:若搭建网站或API接口…...
ChunkKV:优化 KV 缓存压缩,让 LLM 长文本推理更高效
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
深入探究 Go 语言中的 Fx 框架:依赖注入的强大工具
在软件开发中,依赖注入(Dependency Injection,简称 DI)是一种重要的设计模式,它可以帮助我们降低代码的耦合度,提高代码的可测试性和可维护性。Go 语言作为一门高效、简洁的编程语言,拥有许多优…...
用 DeepSeek + Kimi 自动做 PPT,效率起飞
以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤: 利用 DeepSeek 生成 PPT 内容: 访问 DeepSeek 官网,完成注册/登录后进入对话界面。输入指令,例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲,需包…...
【04】Java+若依+vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战
【04】Java若依vue.js技术栈实现钱包积分管理系统项目-若依框架二次开发准备工作-以及建立初步后端目录菜单列-优雅草卓伊凡商业项目实战 项目背景 本项目经费43000元,需求文档如下,工期25天,目前已经过了8天,时间不多了&#x…...
【C++】异常
前言 本篇博客我们来看下C有关异常的处理,了解下异常有关的知识 💓 个人主页:小张同学zkf ⏩ 文章专栏:C 若有问题 评论区见📝 🎉欢迎大家点赞👍收藏⭐文章 目录 1.异常的概念及使用 1.1异…...
Meta AI 最近推出了一款全新的机器学习框架ParetoQ,专门用于大型语言模型的4-bit 以下量化
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
金融资产配置
不要放在一个篮子里也不要放在太多篮子里: 尽量放在不相关的行业实现风险对冲 金融资产从风险类别上主要可以分为三类: 进攻型资产、稳定型资产和防守型资产 进攻型资产包括原油、股票、一级市场股权投资等 稳定型资产包括信托、理财、国债等 防守…...
(done) openMP学习 (Day14: 总结)
url: https://dazuozcy.github.io/posts/introdution-to-openmp-intel/#23-%E5%8F%AF%E6%80%95%E7%9A%84%E4%B8%9C%E8%A5%BF%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8Batomicsflushpairwise%E5%90%8C%E6%AD%A5%20 新手并行程序员与专家并行程序员之间的区别是专家have a collection…...
音频进阶学习十一——离散傅里叶级数DFS
文章目录 前言一、傅里叶级数1.定义2.周期信号序列3.表达式DFSIDFS参数含义 4.DFS公式解析1)右边解析 T T T、 f f f、 ω \omega ω的关系求和公式N的释义求和公式K的释义 e j ( − 2 π k n N ) e^{j(\frac{-2\pi kn}{N})} ej(N−2πkn)的释义 ∑ n 0 N − 1 e…...
ssm的心得
spring是一个轻量级的ioc(控制反转)和aop(面向切面编程)容器框架,它可以管理和配置应用中的各种bean(对象),实现bean之间的依赖注入,以及提供事务管理、缓存、测试等功能…...
14vue3实战-----获取用户信息和用户的菜单树信息
14vue3实战-----获取用户信息和用户的菜单树信息 1.获取用户信息1.1封装接口1.2优化 2.获取用户的菜单树信息 1.获取用户信息 1.1封装接口 后端有根据id获取用户信息的接口,前端需要把该接口封装一下: service/login/login.ts: import hyRequest from…...
shell脚本学习笔记
Shell脚本学习笔记 参考资料:https://www.runoob.com/linux/linux-shell-passing-arguments.html 文章目录 Shell脚本学习笔记一、什么是Shell1.1、定义1.2、注释 二、Shell变量2.1、规则2.2、变量类型2.2.1、字符串2.2.2、整数2.2.3、数组2.2.4、环境变量2.2.5、特…...
Java中的线程池及其应用场景有哪些?
Java中的线程池是一种高效的并发编程机制,通过复用线程来管理任务的执行,从而提高资源利用率和系统性能。 本文将详细探讨Java线程池的概念、类型、应用场景以及实际代码示例,帮助读者全面理解线程池的使用方法及其在实际开发中的重要性。 …...
13.6 基于 LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍
LangChain架构优化实战:OpenAI-Translator翻译系统重构与10倍效率提升秘籍 关键词:LangChain 架构优化, 模块解耦, 翻译系统设计模式, 可扩展翻译框架, 多模型管理 1. 原架构痛点分析 问题维度原实现缺陷LangChain 优化方案大模型耦合直接调用 OpenAI API,切换模型需改代码…...
构建基于 SSE 协议通信的 MCP Server 和 Client
在之前的系列教程中,我们编写的 MCP 服务器与 MCP 客户端是通过 **stdio(Standard Input/Output,标准输入输出)**来进行交互的。客户端通过启动服务器子进程,并利用标准输入(stdin)和标准输出&a…...
Docker、Ollama、Dify 及 DeepSeek 安装配置与搭建企业级本地私有化知识库实践
在现代企业中,管理和快速访问知识库是提升工作效率、促进创新的关键。为了满足这些需求,企业越来越倾向于构建本地私有化的知识库系统,这样可以更好地保护企业数据的安全性和隐私性。本文将介绍如何利用 **Docker**、**Ollama**、**Dify** 和…...
第3章 使用 Vue 脚手架
第3章 使用 Vue 脚手架 3.1 初始化脚手架3.1.1 说明3.1.2. 具体步骤3.1.3 分析脚手架结构1 总结2 细节分析1 配置文件2 src文件1 文件结构分析2 例子 3 public文件4 最终效果 3.2 ref属性3.3 props配置项3.4 mixin混入3.5 插件3.6 scoped样式3.7 Todo-list 案例3.7.1 组件化编码…...
MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...
pikachu[皮卡丘] 靶场全级别通关教程答案 以及 学习方法 如何通过渗透测试靶场挑战「pikachu」来精通Web渗透技巧? 一篇文章搞完这些问题
目录 Pikachu靶场 部署 暴力破解漏洞 学习地址: 靶场练习: 基于表单的暴力破解 验证码绕过(on server) 验证码绕过(on Client) token防爆破? XSS跨站脚本攻击 学习地址: 靶场练习: 反射型xss(get) 反射性xss(post) 存储型xss DOM型xss xss盲打 x…...
ai智能DeepSeek 在 Cursor 中的配置与应用实践
DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…...
登录到docker里
在Docker中登录到容器通常有两种情况: 登录到正在运行的容器内部:如果你想要进入到正在运行的容器内部,可以使用docker exec命令。 登录到容器中并启动一个shell:如果你想要启动一个容器,并在其中启动一个shell&…...
【大数据技术】搭建完全分布式高可用大数据集群(Kafka)
搭建完全分布式高可用大数据集群(Kafka) kafka_2.13-3.9.0.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群 Kafka 的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/software目录下,软件安装至/opt目录下。 安…...
Java 大视界 -- Java 大数据在智能供应链中的应用与优化(76)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
10.单例模式 (Singleton Pattern)
单例模式的定义 单例模式(Singleton Pattern) 是一种创建型设计模式,确保一个类在整个程序生命周期中只能有一个实例,并提供一个全局访问点。 特点: 唯一性:保证系统中某个类只能有一个实例。全局访问点…...
Docker 常见问题解决方法
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes常…...
QT-面试
1. C(特别是 Qt)开发中,内存优化的方法 1. 合理管理对象生命周期,使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期,避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...
使用java代码操作rabbitMQ收发消息
SpringAMQP 将来我们开发业务功能的时候,肯定不会在控制台收发消息,而是应该基于编程的方式。由于RabbitMQ采用了AMQP协议,因此它具备跨语言的特性。任何语言只要遵循AMQP协议收发消息,都可以与RabbitMQ交互。并且RabbitMQ官方也…...
LeetCode 128: 最长连续序列
LeetCode 128: 最长连续序列 题目: 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入:nums […...
Shapefile格式文件解析和显示
Java实现GIS SHP文件格式的解析和显示,JDK19下编译,awt图形系统显示。 SHP文件对应的属性存储在DBF格式数据库中,解析见:DBASE DBF数据库文件解析_数据库文件在线解析-CSDN博客 解析SHP文件代码: public static Shap…...
华为昇腾Altas产品查询——常用命令汇总记录
参考链接: 【2024第一期CANN训练营】Altas产品查询CANN软件包版本等信息npu-smi Atlas 中心训练服务器 6.0.0 NPU驱动和固件安装指南 06 Ascend Extension for PyTorch插件软件版本配套表 以下操作适用于查询npu设备的基本信息。 #查询所有设备的基本信息 npu-smi…...
韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系
韶音科技:消费电子行业售后服务实现数字化转型,重塑客户服务体系 在当今这个科技日新月异的时代,企业之间的竞争早已超越了单纯的产品质量比拼,**售后服务成为了衡量消费电子行业各品牌实力与客户满意度的关键一环。**深圳市韶音…...
【R语言】plyr包和dplyr包
一、plyr包 plyr扩展包主要是实现数据处理中的“分割-应用-组合”(split-apply-combine)策略。此策略是指将一个问题分割成更容易操作的部分,再对每一部分进行独立的操作,最后将各部分的操作结果组合起来。 plyr扩展包中的主要函…...
开发一款类似《王者荣耀》的游戏是一个复杂的系统工程,涉及多个领域的知识和技术。以下是从多个角度详细阐述如何开发的思维。
一、明确游戏定位与核心玩法 游戏类型 MOBA(Multiplayer Online Battle Arena):强调团队合作、策略性和即时战斗。确定游戏模式(如5v5、3v3等)和地图设计。 核心玩法 角色设计:英雄技能、属性、成长曲线。…...
harmonyOS生命周期详述
harmonyOS的生命周期分为app(应用)的生命周期和页面的生命周期函数两部分 应用的生命周期-app应用 在app.js中写逻辑,具体有哪些生命周期函数呢,请看下图: onCreated()、onShow()、onHide()、onDestroy()这五部分 页面及组件生命周期 着重说下onShow和onHide,分别代表是不是…...
Deepseek本地部署指南:在linux服务器部署,在mac远程web-ui访问
1. 在Linux服务器上部署DeepSeek模型 要在 Linux 上通过 Ollama 安装和使用模型,您可以按照以下步骤进行操作: 步骤 1:安装 Ollama 安装 Ollama: 使用以下命令安装 Ollama: curl -sSfL https://ollama.com/download.…...
ESP8266+STM32+阿里云保姆级教程(AT指令+MQTT)
前言:在开发过程中,几乎踩便了所有大坑小坑总结出的文章,我是把坑踩满了,帮助更过小白快速上手,如有错误之处,还麻烦各位大佬帮忙指正、 目录 一、ESP-01s介绍 1、ESP-01s管脚功能: 模组启动模…...
【蓝桥杯嵌入式】4_key:单击+长按+双击
全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 将4个按键的引脚设置为input,并将初始状态设置为Pull-up(上拉输入) 为解决按键抖动的问题,我们…...
TCP队头阻塞问题以及QUIC解决方案
TCP队头阻塞(Head-of-Line Blocking)问题 问题描述 TCP是面向字节流的可靠传输协议,要求数据按严格顺序到达接收端。若某个数据包在传输过程中丢失、延迟或乱序,会导致以下问题: 后续数据被阻塞:接收端必须等待丢失/延迟的包重传并正确接收后,才能将后续已到达的数据交…...
idea启动报错# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffccf76e433
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc0x00007ffccf76e433, pid17288, tid6696 # # JRE version: (11.0.248) (build ) # Java VM: OpenJDK 64-Bit Server VM (11.0.248-LTS, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) 不知道为什么…...
如何利用Python爬虫获取商品销量详情:应对eBay反爬策略的实战指南与代码示例
在当今数据驱动的商业环境中,获取商品销量数据对于市场分析、竞品研究和商业决策至关重要。然而,像eBay这样的大型电商平台通常会部署多种反爬虫机制来保护其数据。本文将详细介绍如何利用Python编写爬虫程序,获取eBay商品的销量详情…...
激活函数篇 03 —— ReLU、LeakyReLU、RandomizedLeakkyReLU、PReLU、ELU
本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归:Sigmoid函数在分类问题中的应用 整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元&a…...
算法基础之八大排序
文章目录 概要1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 希尔排序(Shell Sort)5. 归并排序(Merge Sort)6. 快速排…...