Windows Internals 10.5.3:ETW 架构详解,从事件产生到性能分析的完整链路



🔥 个人主页: 杨利杰YJlio
❄️ 个人专栏: 《Sysinternals实战教程》 《Windows PowerShell 实战》 《WINDOWS教程》 《IOS教程》
《微信助手》 《锤子助手》 《Python》 《Kali Linux》
《那些年未解决的Windows疑难杂症》
🌟 让复杂的事情更简单,让重复的工作自动化


Windows Internals 10.5.3:ETW 架构详解,从事件产生到性能分析的完整链路

  • [1. 章节导读:为什么要单独理解 ETW 架构](#1. 章节导读:为什么要单独理解 ETW 架构)
  • [2. ETW 架构全景:从事件产生到消费分析](#2. ETW 架构全景:从事件产生到消费分析)
  • [3. ETW 关键组件:谁控制、谁产生、谁承载、谁分析](#3. ETW 关键组件:谁控制、谁产生、谁承载、谁分析)
    • [3.1 Controller:控制会话的人](#3.1 Controller:控制会话的人)
    • [3.2 Provider:产生事件的人](#3.2 Provider:产生事件的人)
    • [3.3 Session:承载事件的会话](#3.3 Session:承载事件的会话)
    • [3.4 Buffer:降低开销的关键](#3.4 Buffer:降低开销的关键)
    • [3.5 Consumer:读取和分析事件的人](#3.5 Consumer:读取和分析事件的人)
  • [4. 事件写入与缓冲机制:为什么 ETW 可以做到高性能](#4. 事件写入与缓冲机制:为什么 ETW 可以做到高性能)
    • [4.1 事件写入的基本流程](#4.1 事件写入的基本流程)
    • [4.2 Buffer 为什么重要](#4.2 Buffer 为什么重要)
    • [4.3 实时消费与离线分析的区别](#4.3 实时消费与离线分析的区别)
    • [4.4 缓冲区设置不合理会带来什么问题](#4.4 缓冲区设置不合理会带来什么问题)
  • [5. 用户态与内核态 Provider:为什么 ETW 能建立统一时间线](#5. 用户态与内核态 Provider:为什么 ETW 能建立统一时间线)
    • [5.1 用户态 Provider 负责什么](#5.1 用户态 Provider 负责什么)
    • [5.2 内核态 Provider 负责什么](#5.2 内核态 Provider 负责什么)
    • [5.3 为什么统一时间线很重要](#5.3 为什么统一时间线很重要)
  • [6. ETW 架构在性能排查中的应用](#6. ETW 架构在性能排查中的应用)
    • [6.1 第一步:用 WPR 或 xperf 启动采集](#6.1 第一步:用 WPR 或 xperf 启动采集)
    • [6.2 第二步:复现问题,让 Provider 输出事件](#6.2 第二步:复现问题,让 Provider 输出事件)
    • [6.3 第三步:Session 和 Buffer 保存数据](#6.3 第三步:Session 和 Buffer 保存数据)
    • [6.4 第四步:用 WPA 或 PerfView 分析](#6.4 第四步:用 WPA 或 PerfView 分析)
  • [7. 桌面运维视角:ETW 如何形成证据链](#7. 桌面运维视角:ETW 如何形成证据链)
    • [7.1 Mark 式排障思路对应 ETW 架构](#7.1 Mark 式排障思路对应 ETW 架构)
    • [7.2 一次标准 ETW 排障记录应该包含什么](#7.2 一次标准 ETW 排障记录应该包含什么)
  • [8. 常见误区:学 ETW 架构时最容易踩的坑](#8. 常见误区:学 ETW 架构时最容易踩的坑)
    • [8.1 误区一:把 ETW 当成普通日志](#8.1 误区一:把 ETW 当成普通日志)
    • [8.2 误区二:以为采集了 ETL 就一定能找到答案](#8.2 误区二:以为采集了 ETL 就一定能找到答案)
    • [8.3 误区三:只看最终报错,不看时间线](#8.3 误区三:只看最终报错,不看时间线)
    • [8.4 误区四:过度采集所有 Provider](#8.4 误区四:过度采集所有 Provider)
    • [8.5 误区五:只会采集,不会解释](#8.5 误区五:只会采集,不会解释)
  • [9. 本节总结:ETW 架构的真正价值](#9. 本节总结:ETW 架构的真正价值)
    • [9.1 本节核心速记表](#9.1 本节核心速记表)
    • [9.2 我的理解](#9.2 我的理解)

1. 章节导读:为什么要单独理解 ETW 架构

在上一节 10.5.2 Controller、Provider、Consumer 三类角色 中,我们已经把 ETW 的三个核心角色拆开讲了一遍。

这一节继续往下看:这些角色不是孤立存在的,它们共同组成了 ETW 的整体架构。

ETW(Event Tracing for Windows)本质上是 Windows 内置的一套高性能事件跟踪基础设施,它把用户态应用、系统服务、驱动、内核组件产生的事件统一收集起来,再通过会话、缓冲区、实时消费者或 ETL 文件输出给分析工具。

如果用一句话概括本节:

ETW 架构解决的是:Windows 如何以低开销、高性能、可关联的方式,把系统内部行为记录下来,并交给工具进行分析。

这对企业桌面运维非常重要。因为很多问题不能只靠"感觉"判断:

  • 用户说电脑卡;
  • 应用启动很慢;
  • 登录阶段耗时异常;
  • 磁盘 I/O 偶发飙高;
  • 网络访问间歇性延迟;
  • 某个驱动或安全软件疑似影响性能。

这些现象如果没有证据,很容易停留在"可能是系统问题""可能是软件问题""可能是驱动问题"。

而 ETW 的价值,就是把这些"可能"变成 时间线、事件、调用栈、模块、进程、线程、磁盘和网络证据

学 ETW 架构,不是为了背概念,而是为了知道一次性能采集的数据到底从哪里来、经过哪里、最后被谁分析。

2. ETW 架构全景:从事件产生到消费分析

先看整体架构。ETW 的完整链路可以分为六个阶段:

  1. 事件产生:应用、服务、驱动、内核组件产生事件;
  2. Provider 写入:Provider 通过 ETW API 写入事件;
  3. Session 管理:Controller 创建并管理 ETW Session;
  4. Buffer 缓冲:事件先进入内存缓冲区;
  5. 消费输出:事件可以被实时 Consumer 消费,也可以写入 ETL 文件;
  6. 分析洞察:WPA、PerfView、xperf 等工具进行可视化分析。

下面这张图是 ETW 架构的全景图,可以先建立整体印象。

从图里可以看到,ETW 不是简单的"写日志"。它至少包含以下对象:

架构对象 作用
用户态应用 / 系统服务 / 驱动内核 事件来源
ETW Provider 负责定义并写入事件
Controller 负责启动、停止、配置跟踪会话
ETW Session 承载一次跟踪的运行上下文
Buffer 用内存缓冲事件,降低写入开销
Consumer 实时读取事件,或分析 ETL 文件
ETL 文件 离线保存事件证据
分析工具 将原始事件转换成可读结论

可以把 ETW 理解为一条流水线:
应用/服务/驱动/内核
ETW Provider
ETW Session
Controller
Buffer 内存缓冲区
实时 Consumer
ETL 日志文件
WPA / PerfView / xperf 分析

这里最容易误解的一点是:ETW 不是某一个工具,而是 Windows 的事件跟踪基础设施。WPR、WPA、xperf、PerfView 只是站在这个架构不同位置上的工具。

3. ETW 关键组件:谁控制、谁产生、谁承载、谁分析

理解 ETW 架构,关键不是记住一堆英文名,而是要分清每个组件的职责边界。

下面这张图把 ETW 的核心组件关系拆得很清楚:

3.1 Controller:控制会话的人

Controller 负责控制 ETW 会话,不负责产生日志事件。

常见职责包括:

  • 创建 ETW Session;
  • 启动 / 停止跟踪;
  • 启用 / 禁用 Provider;
  • 设置 Provider 的 Level 和 Keyword;
  • 设置缓冲区大小、数量和日志文件路径;
  • 控制采集生命周期。

常见 Controller 工具包括:

  • WPR;
  • xperf;
  • logman;
  • PerfView;
  • 自研采集工具。

例如:

powershell 复制代码
# 查看当前系统已注册的 ETW Provider
logman query providers

# 使用 WPR 启动一次通用性能采集
wpr -start GeneralProfile -filemode

# 停止采集并保存为 ETL 文件
wpr -stop C:\Temp\GeneralTrace.etl

Controller 更像"调度员":它决定采集什么、什么时候采集、采集到哪里。

3.2 Provider:产生事件的人

Provider 是事件的真正来源。

Provider 可以来自:

  • 应用程序;
  • Windows 服务;
  • 系统组件;
  • 驱动程序;
  • Windows 内核;
  • .NET Runtime;
  • 第三方软件或安全软件。

Provider 通过 ETW API 写入事件,例如:

  • EventWrite;
  • TraceLoggingWrite;
  • 内核态相关跟踪接口。

Provider 输出的不是随便一段文本,而是结构化事件,通常包含:

字段 说明
时间戳 事件发生时间
Provider 名称 事件来源
Event ID 事件编号
Level 事件级别
Keyword 事件分类
Process / Thread 相关进程与线程
Payload 事件携带的数据

Provider 的价值在于让系统行为"可观察"。没有 Provider,就没有可分析的事件来源。

3.3 Session:承载事件的会话

ETW Session 可以理解为一次跟踪任务的运行容器。

它负责接收 Provider 写入的事件,并按照 Controller 配置的规则进行管理:

  • 哪些 Provider 被启用;
  • 哪些事件级别被记录;
  • 缓冲区怎么设置;
  • 事件是否实时输出;
  • 是否写入 ETL 文件;
  • 日志文件保存在哪里。

Session 是 ETW 架构中的中间承载层,它把事件来源和消费分析连接起来。

3.4 Buffer:降低开销的关键

Buffer 是 ETW 高性能的核心之一。

事件不会每产生一条就立即频繁写磁盘,而是先进入内存缓冲区。

这样做的好处是:

  • 减少磁盘 I/O;
  • 减少上下文切换;
  • 支持高频事件写入;
  • 支持批量刷新;
  • 降低跟踪对系统性能的影响。

如果缓冲区设置太小,或者事件量过大,就可能出现事件丢失,这也是 ETW 采集时需要关注的风险点。

3.5 Consumer:读取和分析事件的人

Consumer 负责读取事件。它可以:

  • 实时读取正在运行的 ETW Session;
  • 打开 ETL 文件进行离线分析;
  • 将原始事件转换成图表、时间线、调用栈和统计数据。

常见 Consumer 工具包括:

  • WPA;
  • PerfView;
  • xperf;
  • 自研分析程序;
  • 监控平台 Agent。

Consumer 的价值不是"显示日志",而是把原始事件转换成能定位问题的证据。

4. 事件写入与缓冲机制:为什么 ETW 可以做到高性能

ETW 之所以适合性能分析,一个关键原因是它不是简单地把事件一条一条同步写到磁盘。

它通过 Session + Buffer 的机制,把事件先写入内存缓冲区,再根据需要实时消费或落盘成 ETL 文件。

下面这张图展示了 ETW 的事件写入与缓冲机制:

4.1 事件写入的基本流程

一次事件从产生到分析,大致会经历以下过程:

  1. Provider 产生日志事件;
  2. Provider 调用 ETW API 写入事件;
  3. 事件进入 ETW Session;
  4. Session 将事件写入内存 Buffer;
  5. Consumer 可以实时读取;
  6. 或者 Buffer 被刷新到 ETL 文件;
  7. 最后由 WPA、PerfView 等工具分析。

这条链路可以理解为:
ETL 文件 Consumer Buffer ETW Session Provider ETL 文件 Consumer Buffer ETW Session Provider EventWrite / TraceLoggingWrite 写入内存缓冲区 实时读取事件 刷新并持久化为 ETL 离线分析

4.2 Buffer 为什么重要

如果没有 Buffer,每次事件产生都直接写磁盘,会带来很高的开销。

而 ETW 使用内存缓冲区,可以把高频事件先集中起来,再统一输出。

这就是为什么 ETW 可以用于生产环境性能分析:它尽量减少对系统本身的干扰。

ETW 的一个核心设计目标,就是让"观察系统"本身尽量不要明显改变系统行为。

4.3 实时消费与离线分析的区别

ETW 同时支持两种模式:

模式 说明 适用场景
实时消费 Consumer 直接读取正在运行的 Session 实时监控、即时告警、在线观察
ETL 离线分析 事件写入 ETL 文件,后续打开分析 性能复盘、问题复现、长期证据保存

企业桌面运维中,最常见的是 ETL 离线分析

因为现场排障通常要先采集问题复现过程,再把 ETL 文件拿到 WPA 或 PerfView 里逐层分析。

如果问题不是一直存在,而是偶发、瞬时、复现窗口短,ETL 文件就非常重要,因为它能保存问题发生时的证据。

4.4 缓冲区设置不合理会带来什么问题

ETW 虽然高性能,但不是无成本。缓冲区设置不合理时,可能会出现:

  • 事件丢失;
  • ETL 文件过大;
  • 采集噪声太多;
  • 分析困难;
  • 对系统产生额外压力。

所以 ETW 采集不是"开得越多越好",而是要根据问题场景选择合适的 Provider、Level、Keyword 和采集时长。

5. 用户态与内核态 Provider:为什么 ETW 能建立统一时间线

ETW 架构的强大之处在于:它不仅能记录用户态应用事件,也能记录内核态系统事件。

下面这张图展示了用户态 Provider 与内核态 Provider 如何共同接入统一 ETW 基础设施:

5.1 用户态 Provider 负责什么

用户态 Provider 主要来自:

  • 桌面应用;
  • 浏览器;
  • Office;
  • .NET 程序;
  • Windows 服务;
  • 自定义业务系统;
  • 第三方软件。

它们可以记录:

  • 应用启动;
  • 模块加载;
  • 请求处理;
  • 异常信息;
  • 业务流程;
  • 应用内部性能事件。

例如,某个业务软件启动慢,用户态 Provider 可能记录:

  • 初始化开始;
  • 读取配置;
  • 加载插件;
  • 连接服务器;
  • 主窗口创建完成。

5.2 内核态 Provider 负责什么

内核态 Provider 主要来自 Windows 内核和驱动层,包括:

  • 进程;
  • 线程;
  • 磁盘 I/O;
  • 文件系统;
  • 网络;
  • 驱动;
  • 中断;
  • DPC;
  • CPU 调度。

这些事件能帮助我们看清更底层的系统行为。

比如应用启动慢,表面看是应用问题,但内核态事件可能显示:

  • 磁盘读取排队严重;
  • 某个驱动 DPC 时间异常;
  • 文件系统过滤驱动拦截过多;
  • CPU 调度被其他进程抢占;
  • 网络请求存在重试或超时。

用户态事件告诉我们"应用正在做什么",内核态事件告诉我们"系统底层发生了什么"。把两者放到同一条时间线里,排障价值就非常高。

5.3 为什么统一时间线很重要

很多性能问题不是单点问题,而是多层联动:

  • 应用卡住;
  • 背后可能是文件读取慢;
  • 文件读取慢可能是安全软件扫描;
  • 安全软件扫描可能又和驱动过滤有关;
  • 驱动过滤可能导致 I/O 队列堆积;
  • 最终表现才是用户看到"软件打开慢"。

如果只看应用日志,很可能看不到系统层瓶颈。

如果只看内核事件,又可能不知道是哪个应用动作触发了问题。

ETW 的统一时间线可以把用户态和内核态事件放在同一张图上,让我们从"现象"追到"触发动作",再追到"系统底层响应"。

6. ETW 架构在性能排查中的应用

理解架构以后,我们再把 ETW 放到真实排障场景里看。

假设用户反馈:

"电脑最近打开办公软件很慢,偶尔还会卡在启动界面。"

如果只靠经验,可能会猜:

  • 软件损坏;
  • 系统卡顿;
  • 磁盘慢;
  • 网络慢;
  • 安全软件影响;
  • 插件加载异常。

但是 ETW 的做法不是先猜结论,而是先采集证据。

6.1 第一步:用 WPR 或 xperf 启动采集

排障人员先用 Controller 工具启动 ETW Session。

例如:

powershell 复制代码
# 使用 WPR 启动通用性能采集
wpr -start GeneralProfile -filemode

这一步的目标是:让问题复现过程被记录下来。

注意:采集前必须尽量明确复现动作,例如"点击图标到主窗口显示"这段时间,否则后面分析会失去边界。

6.2 第二步:复现问题,让 Provider 输出事件

用户重新执行打开软件的动作。

这个过程中,多个 Provider 会输出事件:

  • 应用 Provider 记录初始化过程;
  • Kernel Process 记录进程创建;
  • Kernel Image 记录 DLL 加载;
  • File I/O 记录文件读取;
  • Disk I/O 记录磁盘访问;
  • TCP/IP 记录网络连接;
  • DNS Client 记录域名解析;
  • Thread/CPU 记录线程调度和 CPU 占用。

6.3 第三步:Session 和 Buffer 保存数据

事件写入 ETW Session 后,会先进入内存 Buffer。

采集结束后,Buffer 中的事件会保存为 ETL 文件。

powershell 复制代码
# 停止采集并保存 ETL
wpr -stop C:\Temp\AppStartupSlow.etl

生成 ETL 文件后,就相当于把问题现场保存下来了,后续可以反复打开分析。

6.4 第四步:用 WPA 或 PerfView 分析

打开 ETL 文件后,可以重点看:

  • CPU Usage;
  • Disk Usage;
  • File I/O;
  • Generic Events;
  • Process Lifetime;
  • Module Load;
  • Network Activity;
  • Thread Activity;
  • DPC / ISR。

分析时不要只看最后的报错,而要回到时间线上找第一个异常点。

例如:

观察结果 可能判断
某 DLL 加载耗时异常 插件或模块加载慢
File I/O 队列堆积 磁盘或文件系统过滤驱动影响
DNS 查询耗时长 网络解析或代理链路异常
TCP 重试明显 网络连接质量问题
DPC 时间异常 驱动或硬件中断相关问题
安全软件进程频繁介入 安全软件扫描或拦截影响启动

这就是 ETW 架构在排障中的价值:它让我们沿着事件时间线,一层一层把问题钉到具体对象上。

7. 桌面运维视角:ETW 如何形成证据链

在企业桌面支持中,我认为 ETW 最有价值的地方,不是"工具看起来高级",而是它能把模糊问题转成证据链。

普通工单里常见的描述是:

text 复制代码
用户反馈电脑卡顿,已重启,仍偶发。

这个描述不能支撑根因判断。

更专业的表达应该是:

text 复制代码
用户反馈办公软件启动慢。
通过 WPR 采集启动过程 ETL 后,在 WPA 中观察到:
1. 应用进程创建后,模块加载阶段耗时异常;
2. File I/O 时间线显示某配置目录存在大量随机读取;
3. 同时间段安全软件进程介入频繁;
4. 问题主要集中在应用启动后的前 8 秒。
初步判断为应用启动阶段受文件扫描或插件加载影响,建议进一步比对禁用插件/安全策略排除结果。

这两种写法的差别非常大。

第一种只是"处理记录"。

第二种是"证据链"。

7.1 Mark 式排障思路对应 ETW 架构

在 Windows 桌面排障中,我建议把 ETW 用在这几个场景:

问题场景 ETW 分析价值
开机慢 看 Boot Timeline、服务、驱动、磁盘 I/O
登录慢 看 Winlogon、User Profile、Group Policy、Explorer
应用启动慢 看进程、模块加载、File I/O、网络
CPU 高 看线程、调用栈、模块热点
磁盘占用高 看 I/O 进程、文件路径、队列堆积
网络延迟 看 DNS、TCP、重试、连接耗时
系统卡顿 看 CPU、DPC/ISR、驱动、内存压力

ETW 的排障价值,就是把"用户感受"翻译成"系统对象"。

7.2 一次标准 ETW 排障记录应该包含什么

建议工单或博客里记录这些内容:

  1. 问题现象;
  2. 复现动作;
  3. 采集工具;
  4. 采集时间段;
  5. 启用的 Profile 或 Provider;
  6. 生成的 ETL 文件路径;
  7. 分析工具;
  8. 时间线上的关键异常点;
  9. 初步根因判断;
  10. 修复动作;
  11. 验证结果;
  12. 后续预防建议。

注意:ETW 文件可能包含路径、进程、用户信息、业务软件行为等敏感内容,企业内流转时要注意脱敏。

8. 常见误区:学 ETW 架构时最容易踩的坑

8.1 误区一:把 ETW 当成普通日志

ETW 不是普通文本日志。

它更像一套高性能事件跟踪框架,支持结构化事件、高精度时间戳、内存缓冲、实时消费和 ETL 离线分析。

8.2 误区二:以为采集了 ETL 就一定能找到答案

不一定。

如果 Provider 没选对,或者问题没有在采集期间复现,ETL 文件可能很大,但关键事件没有记录进去。

采集不是目的,采到关键证据才是目的。

8.3 误区三:只看最终报错,不看时间线

很多问题的最终报错只是结果。

真正的根因可能发生在前面几秒甚至几十秒。

例如:

  • 最终表现是应用无响应;
  • 但第一个异常点可能是某个文件读取超时;
  • 或某个网络请求重试;
  • 或某个 DLL 加载耗时异常;
  • 或某个驱动导致 DPC 时间异常。

ETW 分析一定要重视时间线,尤其是第一个异常点。

8.4 误区四:过度采集所有 Provider

有些人觉得开得越多越保险。

但过度采集会带来:

  • 文件巨大;
  • 分析困难;
  • 噪声过多;
  • 关键点被淹没;
  • 可能增加系统开销。

推荐做法是:

先按问题类型选择合适的 Profile,再根据分析结果决定是否补充专项 Provider。

8.5 误区五:只会采集,不会解释

ETW 的难点不在于生成 ETL,而在于解释:

  • 哪个事件重要;
  • 哪个时间段异常;
  • 哪个进程相关;
  • 哪个模块可疑;
  • 哪个 I/O 操作耗时;
  • 哪个调用栈指向根因。

所以学习 ETW 架构时,不能只学命令,也要学 事件流、缓冲机制、Provider 来源、Consumer 分析逻辑

9. 本节总结:ETW 架构的真正价值

最后把本节内容收束一下。

ETW 架构不是一堆概念,而是一条完整的证据链管道。

它从事件产生开始:

  • 应用、服务、驱动、内核组件产生事件;
  • Provider 把事件写入 ETW;
  • Controller 管理 Session 和采集参数;
  • Session 承载事件;
  • Buffer 用内存高效缓存;
  • Consumer 实时读取或离线分析;
  • ETL 文件保存问题现场;
  • WPA、PerfView、xperf 等工具输出分析结论。

可以用一句话记住:

Provider 产生事件,Controller 控制采集,Session 承载事件,Buffer 降低开销,Consumer 读取分析,ETL 保存证据。

从桌面运维视角看,ETW 最大的意义是:

它把"用户说卡"这种主观描述,转化为"哪个进程、哪个线程、哪个模块、哪个文件、哪个驱动、哪个时间段异常"的客观证据。

这也是为什么在 Windows Internals 中,ETW 是非常值得深入学习的一块内容。

它不是只服务于开发人员,也非常适合企业 IT 桌面支持、系统实施、性能排查、疑难杂症复盘和技术博客沉淀。

9.1 本节核心速记表

对象 一句话理解 排障价值
Provider 事件来源 告诉我们谁在产生日志
Controller 控制采集 决定采什么、怎么采、采多久
Session 跟踪容器 承载一次 ETW 跟踪任务
Buffer 内存缓冲区 降低开销,支撑高频事件写入
Consumer 事件消费者 读取、解析、可视化事件
ETL 事件日志文件 保存现场,便于离线复盘
WPA / PerfView 分析工具 从数据中定位性能瓶颈

9.2 我的理解

如果说 Event Viewer 更像是"系统已经整理好的结果记录",那么 ETW 更像是"系统运行过程中的底层摄像机"。

它记录的不是单个报错,而是过程、时间线和上下文。

对于企业桌面支持来说,掌握 ETW 的意义不是为了炫技,而是为了让排障从经验判断升级为证据判断。


🔝 返回顶部

点击回到顶部

相关推荐
敲上瘾8 小时前
LangChain 结构化输出与流式传输
python·语言模型·langchain·aigc
.柒宇.8 小时前
AI 掘金头条项目-用户模块、收藏模块以及Redis和调用大模型实现
redis·python·fastapi·千问·qwen大模型
yexuhgu8 小时前
Golang如何做贪心算法_Golang贪心算法教程【速学】
jvm·数据库·python
SkyXZ~8 小时前
Mac上使用VScode优雅开发STM32
vscode·stm32·macos
nashane8 小时前
HarmonyOS 6学习:悬浮键盘抖动修复与长截图“滚动裁缝”实战
学习·计算机外设·harmonyos·harmonyos 5
在学了加油8 小时前
DenseNet121学习笔记
笔记·学习
智者知已应修善业8 小时前
【用一片74LS139和一片74Ls00,设计带高电平有效使能输入端的3线-8线译码器】2023-10-16
驱动开发·经验分享·笔记·硬件架构·硬件工程
武藤一雄8 小时前
WPF进阶:万字详解WPF如何性能优化
windows·性能优化·c#·.net·wpf·.netcore·鲁棒性
Brilliantwxx8 小时前
【C++】初步认识STL(3)
开发语言·c++·笔记·算法