Linux perf的使用(一)

news2025/1/16 0:49:46

文章目录

  • 前言
  • 一、perf简介
  • 二、perf子命令简介
  • 三、perf工作模式
    • 3.1 计数
    • 3.2 采样
  • 参考资料

前言

系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。
(1)性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。
(2)代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。
在性能剖析阶段,需要借助于现有的profiling工具,如perf等。

NAME
       perf - Performance analysis tools for Linux
DESCRIPTION
       Performance counters for Linux are a new kernel-based subsystem that provide a framework for all things performance analysis. It covers hardware level (CPU/PMU, Performance Monitoring
       Unit) features and software features (software counters, tracepoints) as well.

一、perf简介

perf(perf_event,perf总是与event一起的)是官方的Linux性能分析工具,位于Linux内核源代码中的tools/perf下。它是一个具有分析、跟踪和脚本功能的多工具,是内核perf_events可观察性子系统的前端(front-end)。perf_events也称为Linux(Performance Counters for Linux:PCL)或Linux性能事件( Linux perf events:LPE)的性能计数器。perf_events和perf前端最初具有性能监视计数器(PMC)功能,但后来发展到支持基于事件的跟踪源:tracepoints, kprobes, uprobes, and USDT。如下所示:
在这里插入图片描述
图片来自于:https://www.brendangregg.com/perf.html

通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析制定应用 程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。 使用perf,可以分析程序运行期间发生的硬件事件,比如instructions retired、processor clock cycles等; 也可以分析软件时间,比如page fault和进程切换。
与其他跟踪程序相比,perf 特别适用于CPU分析:分析(采样)CPU堆栈跟踪、跟踪CPU调度器行为,并检查PMC以了解微架构级别的CPU性能,包括循环行为。它的跟踪功能允许它分析其他目标,包括磁盘I/O和软件功能。
比如ftrace偏向于抓取数据,而perf对于抓取的数据进行了分析。如下图所示:
在这里插入图片描述
图片来自于:极客时间 容器高手实战
第一层是最基础的提供数据的机制,这里就包含了tracepoints、kprobes,还有一些别的events,比如perf使用的HW/SW events。
第二层是进行数据收集的工具,这里包含了ftrace、perf,还有ebpf。
第三层是用户层工具。

二、perf子命令简介

perf的功能通过子命令调用。作为常见用法示例,下面使用两个子命令:record用于检测事件并将其保存到文件,然后report用于汇总文件的内容。

NAME
       perf-record - Run a command and record its profile into perf.data
DESCRIPTION
       This command runs a command and gathers a performance counter profile from it, into perf.data - without displaying anything.
       
        -a, --all-cpus
           System-wide collection from all CPUs (default if no target is specified).
		-F, --freq=
           Profile at this frequency.
NAME
       perf-report - Read perf.data (created by perf record) and display the profile
DESCRIPTION
       This command displays the performance counter profile information recorded via perf record.

	    --stdio
           Use the stdio interface.     
[root@localhost ~]# perf record -F 99 -a -- sleep 30
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.686 MB perf.data (257 samples) ]
[root@localhost ~]# perf report --stdio
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 257  of event 'cycles:ppp'
# Event count (approx.): 2015944621
#
# Overhead  Command      Shared Object            Symbol
# ........  ...........  .......................  ...................................
#
    20.82%  perf         [kernel.vmlinux]         [k] unlink_anon_vmas
    16.08%  pool         [kernel.vmlinux]         [k] context_struct_compute_av
    13.41%  swapper      [kernel.vmlinux]         [k] exit_idle
    12.53%  perf         [kernel.vmlinux]         [k] generic_exec_single
     2.80%  bash         bash                     [.] 0x000000000003e5c8
     1.75%  swapper      [kernel.vmlinux]         [k] intel_idle
     1.37%  pgrep        [kernel.vmlinux]         [k] pid_revalidate
     0.89%  bash         [kernel.vmlinux]         [.] irq_return
     0.81%  df           [kernel.vmlinux]         [k] error_swapgs
     0.68%  bash         bash                     [.] 0x000000000003e5d0
     0.66%  pgrep        [kernel.vmlinux]         [k] _raw_spin_lock
     0.55%  swapper      [kernel.vmlinux]         [k] leave_mm
     0.52%  df           [kernel.vmlinux]         [.] irq_return
     0.51%  df           [kernel.vmlinux]         [k] symcmp
     0.49%  head         [kernel.vmlinux]         [k] get_vmalloc_info
     0.46%  who          ld-2.17.so               [.] strcmp
     0.41%  who          [kernel.vmlinux]         [k] vma_interval_tree_insert
     0.41%  who          ld-2.17.so               [.] _dl_runtime_resolve_xsavec
     0.39%  head         ld-2.17.so               [.] _dl_relocate_object
     0.37%  sleep        [kernel.vmlinux]         [k] __do_page_fault
     0.35%  pgrep        [kernel.vmlinux]         [k] avtab_search_node
     0.35%  who          [kernel.vmlinux]         [k] lookup_slow
     0.34%  tail         [kernel.vmlinux]         [k] clear_page_c_e
     0.34%  df           [kernel.vmlinux]         [k] mm_release
     0.34%  df           libc-2.17.so             [.] __gconv_transform_utf8_internal
     0.33%  df           [kernel.vmlinux]         [k] retint_userspace_restore_args
     0.33%  bash         [kernel.vmlinux]         [k] release_pages
     0.33%  sleep        [kernel.vmlinux]         [k] idle_balance
     0.32%  who          [kernel.vmlinux]         [.] irq_return
     0.31%  who          ld-2.17.so               [.] _dl_fixup
     0.30%  swapper      [kernel.vmlinux]         [k] pick_next_task_fair
     0.30%  who          [kernel.vmlinux]         [k] system_call
     0.30%  df           [kernel.vmlinux]         [k] link_path_walk
     0.30%  who          [kernel.vmlinux]         [k] error_swapgs
     0.30%  df           [kernel.vmlinux]         [k] __wake_up_bit
     0.29%  swapper      [kernel.vmlinux]         [k] cpuidle_enter_state
     0.29%  bash         [kernel.vmlinux]         [k] vm_normal_page
     0.28%  tail         [kernel.vmlinux]         [k] error_swapgs
     0.26%  head         [kernel.vmlinux]         [k] put_dec_trunc8
     0.26%  swapper      [kernel.vmlinux]         [k] int_sqrt
     0.26%  bash         [kernel.vmlinux]         [k] __mem_cgroup_uncharge_common
     0.25%  tail         [kernel.vmlinux]         [k] tlb_finish_mmu

这个特定的例子对在任何CPU上运行的任何程序以99赫兹采样30秒,然后显示最频繁采样的函数。

perf子命令如下所示:

   annotate        Read perf.data (created by perf record) and display annotated code
   archive         Create archive with object files with build-ids found in perf.data file
   bench           General framework for benchmark suites
   buildid-cache   Manage build-id cache.
   buildid-list    List the buildids in a perf.data file
   c2c             Shared Data C2C/HITM Analyzer.
   config          Get and set variables in a configuration file.
   data            Data file related processing
   diff            Read perf.data files and display the differential profile
   evlist          List the event names in a perf.data file
   ftrace          simple wrapper for kernel's ftrace functionality
   inject          Filter to augment the events stream with additional information
   kallsyms        Searches running kernel for symbols
   kmem            Tool to trace/measure kernel memory properties
   kvm             Tool to trace/measure kvm guest os
   list            List all symbolic event types
   lock            Analyze lock events
   mem             Profile memory accesses
   record          Run a command and record its profile into perf.data
   report          Read perf.data (created by perf record) and display the profile
   sched           Tool to trace/measure scheduler properties (latencies)
   script          Read perf.data (created by perf record) and display trace output
   stat            Run a command and gather performance counter statistics
   test            Runs sanity tests.
   timechart       Tool to visualize total system behavior during a workload
   top             System profiling tool.
   probe           Define new dynamic tracepoints
   trace           strace inspired tool

下图显示了常用的perf子命令及其数据源和输出类型。

三、perf工作模式

perf_events提供三种工作模式:采样模式(sampling)、计数模式(counting)和 bpf programs。

perf record 命令工作在采样模式:周期性地做事件采样,将事件数据写入内核缓冲区,perf命令以缓慢的异步速率读取内核缓冲区以写入perf.data文件。然后,perf report或perf script命令读取此文件。
perf stat 命令工作在计数模式:仅仅统计内核上下文中的事件,其中计数的摘要由perf打印。此模式不会生成perf.data文件。

count只是记录了event的发生次数,sample记录了大量信息(比如:IP、ADDR、TID、TIME、CPU、BT)。
sample功能,需要给perf_event分配ringbuffer空间,并且把这部分空间通过mmap映射到用户空间。
bpf programs,这是Linux4.4+内核中的一个新功能,可以在内核空间中执行自定义用户定义的程序,可以执行有效的数据过滤和汇总。
这里先不讨论bpf programs on events。

尝试使用perf-stat命令开始计数事件,看看这是否足够。此子命令开销最小。
当使用带有perf记录的采样模式时,需要稍微注意开销,因为捕获文件可能会很快变成数百兆字节。这取决于正在跟踪的事件的速率:频率越高,开销越高,perf.data大小越大。
要真正减少开销并生成更高级的摘要,请编写由perf执行的BPF程序。

3.1 计数

计数就是统计某个event在一段时间里发生了多少次。

perf stat可以看到在这段时间里这些Hardware event发生的数目:

[root@localhost ~]# perf stat
^C
 Performance counter stats for 'system wide':

      24378.291792      cpu-clock (msec)          #    3.999 CPUs utilized
               855      context-switches          #    0.035 K/sec
                93      cpu-migrations            #    0.004 K/sec
            10,465      page-faults               #    0.429 K/sec
       147,631,390      cycles                    #    0.006 GHz
        80,102,008      instructions              #    0.54  insn per cycle
        16,125,726      branches                  #    0.661 M/sec
           835,656      branch-misses             #    5.18% of all branches

       6.095605891 seconds time elapsed

可以加上"-e"参数,指定某一个event来看它的计数,比如page-faults,这里我们看到在当前CPU上,这个event在1秒钟内发生了177次:

-e, --event=
           Select the PMU event.
[root@localhost ~]# perf stat -e page-faults -- sleep 1

 Performance counter stats for 'sleep 1':

               177      page-faults

       1.001049846 seconds time elapsed

其它的计数事件:

# CPU counter statistics for the specified command:
perf stat command

# Detailed CPU counter statistics (includes extras) for the specified command:
perf stat -d command

# CPU counter statistics for the specified PID, until Ctrl-C:
perf stat -p PID

# CPU counter statistics for the entire system, for 5 seconds:
perf stat -a sleep 5

# Various basic CPU statistics, system wide, for 10 seconds:
perf stat -e cycles,instructions,cache-references,cache-misses,bus-cycles -a sleep 10

# Various CPU level 1 data cache statistics for the specified command:
perf stat -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores command

# Various CPU data TLB statistics for the specified command:
perf stat -e dTLB-loads,dTLB-load-misses,dTLB-prefetch-misses command

# Various CPU last level cache statistics for the specified command:
perf stat -e LLC-loads,LLC-load-misses,LLC-stores,LLC-prefetches command

# Using raw PMC counters, eg, counting unhalted core cycles:
perf stat -e r003c -a sleep 5 

# PMCs: counting cycles and frontend stalls via raw specification:
perf stat -e cycles -e cpu/event=0x0e,umask=0x01,inv,cmask=0x01/ -a sleep 5

# Count syscalls per-second system-wide:
perf stat -e raw_syscalls:sys_enter -I 1000 -a

# Count system calls by type for the specified PID, until Ctrl-C:
perf stat -e 'syscalls:sys_enter_*' -p PID

# Count system calls by type for the entire system, for 5 seconds:
perf stat -e 'syscalls:sys_enter_*' -a sleep 5

# Count scheduler events for the specified PID, until Ctrl-C:
perf stat -e 'sched:*' -p PID

# Count scheduler events for the specified PID, for 10 seconds:
perf stat -e 'sched:*' -p PID sleep 10

# Count ext4 events for the entire system, for 10 seconds:
perf stat -e 'ext4:*' -a sleep 10

# Count block device I/O events for the entire system, for 10 seconds:
perf stat -e 'block:*' -a sleep 10

# Count all vmscan events, printing a report every second:
perf stat -e 'vmscan:*' -a -I 1000

3.2 采样

perf record 在不加 -e 指定event的时候,它缺省的event就是Hardware event cycles。我们先用 perf stat来查看1秒钟cycles事件的数量,在下面的例子里这个数量是1,385,279次。

[root@localhost ~]# perf stat -e cycles -- sleep 1

 Performance counter stats for 'sleep 1':

         1,385,279      cycles

       1.000915487 seconds time elapsed

如果每次cycles event发生的时候,我们都记录当时的IP(就是处理器当时要执行的指令地址)、IP所属的进程等信息的话,这样系统的开销就太大了。所以perf就使用了对event采样的方式来记录IP、进程等信息。

perf对event的采样有两种模式:

第一种是按照event的数目(period),比如每发生10000次cycles event就记录一次IP、进程等信息, perf record 中的 -c 参数可以指定每发生多少次,就做一次记录。

比如在下面的例子里,我们指定了每10000 cycles event做一次采样之后,在1秒里总共就做了59次采样,比我们之前看到1秒钟1,385,279次cycles的次数要少多了。

[root@localhost ~]# perf record  -e cycles -c 10000 -- sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.019 MB perf.data (59 samples) ]

第二种是定义一个频率(frequency), perf record 中的 -F 参数就是指定频率的,比如 perf record -e cycles -F 99 – sleep 1 ,就是指采样每秒钟做99次。

在 perf record 运行结束后,会在磁盘的当前目录留下perf.data这个文件,里面记录了所有采样得到的信息。然后我们再运行 perf report 命令,查看函数或者指令在这些采样里的分布比例。

其它的一些采样例子:

# Sample on-CPU functions for the specified command, at 99 Hertz:
perf record -F 99 command

# Sample on-CPU functions for the specified PID, at 99 Hertz, until Ctrl-C:
perf record -F 99 -p PID

# Sample on-CPU functions for the specified PID, at 99 Hertz, for 10 seconds:
perf record -F 99 -p PID sleep 10

# Sample CPU stack traces (via frame pointers) for the specified PID, at 99 Hertz, for 10 seconds:
perf record -F 99 -p PID -g -- sleep 10

# Sample CPU stack traces for the PID, using dwarf (dbg info) to unwind stacks, at 99 Hertz, for 10 seconds:
perf record -F 99 -p PID --call-graph dwarf sleep 10

# Sample CPU stack traces for the entire system, at 99 Hertz, for 10 seconds (< Linux 4.11):
perf record -F 99 -ag -- sleep 10

# Sample CPU stack traces for the entire system, at 99 Hertz, for 10 seconds (>= Linux 4.11):
perf record -F 99 -g -- sleep 10

# If the previous command didn't work, try forcing perf to use the cpu-clock event:
perf record -F 99 -e cpu-clock -ag -- sleep 10

# Sample CPU stack traces for a container identified by its /sys/fs/cgroup/perf_event cgroup:
perf record -F 99 -e cpu-clock --cgroup=docker/1d567f4393190204...etc... -a -- sleep 10

# Sample CPU stack traces for the entire system, with dwarf stacks, at 99 Hertz, for 10 seconds:
perf record -F 99 -a --call-graph dwarf sleep 10

# Sample CPU stack traces for the entire system, using last branch record for stacks, ... (>= Linux 4.?):
perf record -F 99 -a --call-graph lbr sleep 10

# Sample CPU stack traces, once every 10,000 Level 1 data cache misses, for 5 seconds:
perf record -e L1-dcache-load-misses -c 10000 -ag -- sleep 5

# Sample CPU stack traces, once every 100 last level cache misses, for 5 seconds:
perf record -e LLC-load-misses -c 100 -ag -- sleep 5 

# Sample on-CPU kernel instructions, for 5 seconds:
perf record -e cycles:k -a -- sleep 5 

# Sample on-CPU user instructions, for 5 seconds:
perf record -e cycles:u -a -- sleep 5 

# Sample on-CPU user instructions precisely (using PEBS), for 5 seconds:
perf record -e cycles:up -a -- sleep 5 

# Perform branch tracing (needs HW support), for 1 second:
perf record -b -a sleep 1

# Sample CPUs at 49 Hertz, and show top addresses and symbols, live (no perf.data file):
perf top -F 49

# Sample CPUs at 49 Hertz, and show top process names and segments, live:
perf top -F 49 -ns comm,dso

参考资料

https://www.brendangregg.com/perf.html
https://www.cnblogs.com/arnoldlu/p/6241297.html
Systems.Performance.Enterprise.and.the.Cloud.2nd.Edition.2020.12

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/273622.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python(13)--字典(Dict)

一、字典的基本操作 1.定义字典 字典也是一个列表型的数据结构&#xff0c;字典的数据是用“{ }”装的&#xff08;列表&#xff1a;[ ]&#xff0c;元组&#xff1a;( )&#xff09;&#xff0c;字典的元素是一一对应的关系“key-value”。 格式&#xff1a; Dictname{ key1…

vue中父子组件的传值

1. 父组件给子组件传值 主要两个步骤&#xff1a; 1. 在父组件调用子组件的时候绑定数据 2. 在子组件里面通过props接收父组件传过来的数据 2. 子组件给父组件传值 主要三个步骤&#xff1a; 1.在子组件中创建一个按钮&#xff0c;给按钮绑定一个点击事件 2.在响应该点击事件…

NSSRound#7

[NSSRound#7 Team]ec_RCE 源码: <?PHPif(!isset($_POST["action"]) && !isset($_POST["data"]))show_source(__FILE__);putenv(LANGzh_TW.utf8); $action $_POST["action"];$data "".$_POST["data"]."…

Java综合实验1题目: 猜心术---猜姓氏游戏

一、 实验内容及要求 假设游戏者共有十人&#xff0c;且有10个不同的姓&#xff1a;张、王、李、赵、刘、于、许、金、钱、孙&#xff0c;魔术师将十个姓写在四张纸牌上&#xff0c;游戏者只需指出那几张纸上有自己的姓&#xff0c;魔术师就能准确的说出游戏者的姓&#xff0c…

ChatGPT 为我制作了一张地图

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 今天在刷视频的时候看到了…

Java 并发在项目中的使用场景

1、并发编程的三个核心问题&#xff1a;&#xff08;1&#xff09;分工&#xff1a;所谓分工指的是如何高效地拆解任务并分配给线程&#xff08;2&#xff09;同步&#xff1a;而同步指的是线程之间如何协作&#xff08;3&#xff09;互斥&#xff1a;互斥则是保证同一时刻只允…

本科大数据专业能找到大数据开发的工作么

本科大数据专业能不能找到大数据开发的工作取决于你在校期间大数据学科学习的怎么样~ 目前大二就还有时间去学习&#xff0c;趁着空余时间找个完整的学习路线去学习&#xff0c;争取能够在校招的时候就找到心仪的工作技术过关的话是完全没有问题的&#xff0c;而且加上你还有兴…

PythonWeb开发基础(三)类Flask框架请求封装

课程地址&#xff1a;Python 工程师进阶技术图谱 文章目录类Flask框架请求封装HTTP请求解析的python实现1、解析查询字符串2、多值问题使用webob库解析请求Bug记录bug&#xff1a;AttributeError: module cgi has no attribute parse_qs类Flask框架请求封装 Web服务器 本质是…

【C++提高编程】list 容器详解(附测试用例与结果图)

目录1. list容器1.1 list基本概念1.2 list构造函数&#xff08;初始化&#xff09;1.3 list 赋值和交换1.4 list 大小操作1.5 list 插入和删除1.6 list 数据存取1.7 list 反转&#xff08;reverse&#xff09;、排序&#xff08;sort&#xff09;和去重&#xff08;unique&…

电脑技巧:电脑状态监控神器TrafficMonitor介绍

有的时候我们为了解决某些电脑问题&#xff0c;需要监控电脑的实时网速、CPU、内存等的占用情况。一般情况下我们可以打开电脑任务管理器&#xff0c;就可以实时监控硬件状态&#xff0c;但如果查看频率较高的话&#xff0c;需要每次进入任务管理器就显得比较麻烦。今天小编分享…

【漏洞修复】 CVE Linux 系统应用漏洞修复笔记

这里写自定义目录标题说明SSL/TLS协议信息泄露漏洞(CVE-2016-2183)漏洞信息解决办法验证方法修复步骤说明查询当前使用的openssl版本号下载并安装新版本的openssl替换nginx中使用的openssl到最新版说明 此文章主要记录工作中遇到的漏洞以及修复过程。 SSL/TLS协议信息泄露漏洞…

【LeetCode】员工的重要性 | 图像渲染 | 岛屿问题

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《阿亮爱刷题》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;员工的重…

力扣SQL刷题4

目录1158. 市场分析 I1280. 学生们参加各科测试的次数1174. 即时食物配送 II585. 2016年的投资1158. 市场分析 I 题型&#xff1a;表1和表2连接时&#xff0c;如何把没有对应数据输出来。即表1中所有id列对应的表2数据输出&#xff0c;没用的输出0 解答1&#xff1a;left join…

【Linux】权限

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️小林爱敲代码       &#x1f6f0;️博客专栏&#xff1a;Linux之路       &#x1f6f0;️社区&#xff1a; 进步学堂       …

关于软考的一些前期准备

国家软考的中级职称证书&#xff0c;含金量较高且没有报考资质限制 报名时间和考试时间具体请看官网&#xff1a;中国计算机技术职业资格网 不同的资格证书时间和要求不一样&#xff0c;注意查看 上半年&#xff1a; 下半年&#xff1a; 下半年&#xff1a; 软件评测师考试说…

Spring Boot 中事半功倍的一些工具类

系列文章地址&#xff1a;https://blog.csdn.net/perfect2011/article/details/124603278在日常开发中经常有这样那样的小功能需要实现&#xff0c;这些一般会作为工具类存在&#xff0c;在项目中有一些通用的功能&#xff0c;Spring内置了需要工具类&#xff0c;而且经过了大量…

京东一面:20种异步,你知道几种? 含协程

背景说明&#xff1a; 异步&#xff0c;作为性能调优核心方式之一&#xff0c;经常被用于各种高并发场景。 很多场景多会使用到异步&#xff0c;比如&#xff1a; 场景1&#xff1a; 超高并发 批量 写 mysql 、批量写 elasticSearch 场景2&#xff1a; 超高并发 批量 IO 场景…

30分钟掌握 Hive SQL 优化(解决数据倾斜)

Hive SQL 几乎是每一位互联网分析师的必备技能&#xff0c;相信每一位面试过大厂的童鞋都有被面试官问到 Hive 优化问题的经历。所以掌握扎实的 HQL 基础尤为重要&#xff0c;既能帮分析师在日常工作中“如鱼得水”提高效率&#xff0c;也能在跳槽时获得一份更好的工作 offer。…

【23种设计模式】设计模式介绍与分类

前言 本文为 【23种设计模式】设计模式介绍与分类 相关知识介绍&#xff0c;下边将对什么是设计模式&#xff0c;设计模式的分类与23种设计模式的关键点进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1f449;Java全栈学习路线可参考&#xff1a;【…

蓝桥算法两周训练营--Day2:DP

T1&#xff1a;P1048 [NOIP2005 普及组] 采药 - 洛谷 代码&#xff1a; 1、二维Dp&#xff1a; package 蓝桥算法两周训练营__普及组.Day2_dp;import java.util.Scanner;/*** author yx* date 2023-02-05 13:16*/ public class t1 {// P1048 [NOIP2005 普及组] 采药 - 洛…