程序的Benchmark 及 优化的本质

什么是Benchmark

Benchmark(基准测试)是一种评估计算机系统、软件程序或硬件设备性能的方法。它旨在测量系统在特定任务或操作下的运行速度、效率和稳定性。通过进行基准测试,我们可以比较不同系统、算法或代码实现的性能差异,以便做出优化和改进。

在日常代码中,Benchmark通常用于评估代码的执行时间或资源使用情况,以确定哪些部分的性能可以改进。

示例:计算方法的耗时

这是编程中一种常见的 Benchmark,下面是一个示例:

python 复制代码
# 方法一:使用for循环
def sum_with_loop(numbers):
    total = 0
    for num in numbers:
        total += num
    return total

# 方法二:使用内置的sum函数
def sum_with_builtin(numbers):
    return sum(numbers)

计算程序耗时的 Benchmark,通过耗时情况分析方法的性能。

python 复制代码
import timeit

numbers = list(range(1, 1000000))

# 基准测试方法一
time_method1 = timeit.timeit(lambda: sum_with_loop(numbers), number=100)

# 基准测试方法二
time_method2 = timeit.timeit(lambda: sum_with_builtin(numbers), number=100)

print("方法一的执行时间:", time_method1)
print("方法二的执行时间:", time_method2)

热点

通常,我们并不会去比较某两个方法的优劣后再去选择使用哪个方法。更多的时候我们关注于程序中某些 热点 区域,这些区域占用 CPU 时钟往往更多,消耗的内存资源也多。定位这些内容,并进行分析我们需要使用专业的工具,例如:perf。

在软件优化过程中,最关键的步骤是要确定应用程序的哪些部分需要优化,思想如同:加固一个链条中最薄弱的地方,通常一个程序的热点就是它最薄弱的环节,应当从这些地方开始优化。

热点区域的特征:

  1. 缓慢执行:消耗很多时间
  2. 频繁执行:被频繁执行(与其他区域相比,且占用了大量时间)

补充:通常还有其他事件也能称为热点区域,例如错误分支预测或者一级缓存丢失等。

热点指明了软件应该由何处开始优化,定位热点的方式可以使用工具:perf(后续介绍使用方式)。

插曲:优化的本质

概念和思想

我们需要学习计算机组成原理,并且对处理器体系结构的基本有所了解,这样可以帮助我们明白什么样的优化能够起到什么样的作用及起作用的原因。

记住,软件优化的目的就是要提供指令给处理器,以允许它的功能模块在给定时间内能够处理最大数量的工作。

学习方式:了解处理器结构(取指令和译码(优化内存读取方式)、执行指令(并行)、退出阶段)、了解计算机组成原理。

所以后续的优化路线主要会分为两个分支:

  1. 了解如何定位程序中的热点位置,核心在定位。(工具学习
  2. 学习优化热点位置的方法,指令优化、多线程、内存优化、分支优化、循环优化等。(编程提高
相关推荐
小白学大数据2 小时前
从携程爬取的杭州酒店数据中提取价格、评分与评论的关键信息
爬虫·python·性能优化
小刘鸭地下城5 小时前
UV、PV、P95:三大核心业务指标的全维度解析
前端·性能优化
武子康7 小时前
Java-164 MongoDB 认证与权限实战:单实例与分片集群 整体认证配置实战 最小化授权/错误速查/回滚剧本
java·数据库·分布式·mongodb·性能优化·系统架构·nosql
李兆龙的博客11 小时前
从一到无穷大 #53 Beyond TSDB Query performance: Homomorphic Compression
性能优化·时序数据库
CsharpDev-奶豆哥21 小时前
JavaScript性能优化实战大纲
开发语言·javascript·性能优化
晨陌y21 小时前
深入剖析:仓颉语言的性能优化核心技术
android·性能优化·仓颉
专注前端30年1 天前
Webpack进阶玩法全解析(性能优化+高级配置)
前端·webpack·性能优化
Yeats_Liao1 天前
Go Web 编程快速入门 14 - 性能优化与最佳实践:Go应用性能分析、内存管理、并发编程最佳实践
前端·后端·性能优化·golang
月夜奇术师1 天前
SQL查询性能优化:从30分钟到30秒的蜕变——破解串行查询瓶颈
数据库·性能优化
小二·1 天前
仓颉源码剖析:ArrayList动态数组的实现艺术与性能优化
性能优化