【Java数据结构及算法实战】系列003:程序性能的两种表示方式

简介: 本节是《Java数据结构及算法实战》系列的第3节,主要介绍程序性能的两种表示方式。评价一个程序好坏的指标非常多,比如易用性、稳定性、可维护性等等,但一个最为重要的评价指标是性能。性能是其他评价指标的基础。比如,在Web网站响应时间方面,业界的评判标准是主样的:在2秒之内给客户响应被用户认为是“非常有吸引力”的用户体验。在5秒之内给客户响应被用户认为是“比较不错”的用户体验。在10秒之内给客户响应被用户认为是“糟糕”的用户体验。如果超过10秒还没有得到响应,那么大多数用户会认为这次请求是失败的。由此我们可以得出结论,Web网站的性能越好,处理时间越短,响应时间越短,则会有更好

本节是《Java数据结构及算法实战》系列的第3节,主要介绍程序性能的两种表示方式。

评价一个程序好坏的指标非常多,比如易用性、稳定性、可维护性等等,但一个最为重要的评价指标是性能。性能是其他评价指标的基础。

比如,在Web网站响应时间方面,业界的评判标准是主样的:

在2秒之内给客户响应被用户认为是“非常有吸引力”的用户体验。
在5秒之内给客户响应被用户认为是“比较不错”的用户体验。
在10秒之内给客户响应被用户认为是“糟糕”的用户体验。
如果超过10秒还没有得到响应,那么大多数用户会认为这次请求是失败的。
由此我们可以得出结论,Web网站的性能越好,处理时间越短,响应时间越短,则会有更好的用户体验。

所谓程序性能(Program Performance),是指运行一个程序所需要的内存大小和时间。有两个专业的术语来代表程序在运行时所要占用的内存大小和时间,那就是空间复杂度和时间复杂度。

  1. 空间复杂度

程序的空间复杂度(Space Complexity)是指运行完一个程序所需要的内存大小。对一个程序的空间复杂度感兴趣的主要原因如下:

如果程序将要运行在一个多用户计算机系统中,可能需要指明分配给该程序的内存大小。
对任何一个计算机系统,想提前知道是否有足够可用的内存来运行该程序。
一个问题可能有若干个内存需求各不相同的解决方案。比如,对于某类应用程序有两个不同的版本,这两个版本分别回占用的内存空间为1G和2G不同的版本,占用内存越大运行速度越快。如果当前的计算机少于2G的内存,则只能选择1G的版本。如果计算机大于2G的内存,则只可选择2G的版本。
可以利用空间复杂度来估算一个程序所能解决的问题的最大规模。例如,在“学生信息管理系统”中,一个Student类型的对象可能占用1K字节的内存。当可利用的内存总量为1024K字节,那么最大可以处理1024个学生的信息。

  1. 时间复杂度

程序的时间复杂度(Time Complexity)是指运行完该程序所需要的时间。需要关注程序的时间复杂度的原因有以下几点:

有些系统需要用户提供运行时间的上限,一旦达到这个上限,客户端程序将被强制结束。比如,数据库的客户端连接会话往往会设置一个超时时间,当客户端的执行时间大于会话的超时时间时,该会话会被终止。这种办法可以避免某个客户端长时间占用系统资源而导致整个系统不可用。
交互式程序往往要求实时响应。比如,访问Web网站,用户总是期望网页能够及时响应。
如果一个问题有多种解决方案,那么具体采用哪种方案,主要根据这些方案的性能差异。对于各种方案的时间和空间的性能,需要权衡考虑。比如,在一个实时性要求比较高的场景下,往往会将经常访问的数据缓存在内存中(比如Redis),从而提升查询的效率,这就是一个典型的牺牲空间性能换取时间性能的场景。
简言之,空间复杂度和时间复杂度越小的程序,其性能越高。如果空间复杂度和时间复杂度两者不可兼得,则需要权衡。

参考引用
原本同步至:https://waylau.com/two-ways-to-express-program-performance/
本系列归档:https://github.com/waylau/java-data-structures-and-algorithms-in-action
数据结构和算法基础(Java语言实现):https://item.jd.com/13014179.html

目录
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
84 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
Java 流计算
利用java8 的 CompletableFuture 优化 Flink 程序
本文探讨了Flink使用avatorscript脚本语言时遇到的性能瓶颈,并通过CompletableFuture优化代码,显著提升了Flink的QPS。文中详细介绍了avatorscript的使用方法,包括自定义函数、从Map中取值、使用Java工具类及AviatorScript函数等,帮助读者更好地理解和应用avatorscript。
利用java8 的 CompletableFuture 优化 Flink 程序
|
2月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
64 2
|
12天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
23天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
42 3
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
26天前
|
机器学习/深度学习 算法 数据挖掘
提高时钟置换算法的性能
【10月更文挑战第25天】通过上述一种或多种方法的综合应用,可以在不同程度上提高时钟置换算法的性能,使其更好地适应各种复杂的系统环境和应用场景,提高虚拟内存管理的效率和系统的整体性能。
36 5
|
26天前
|
存储
系统调用处理程序在内核栈中保存了哪些上下文信息?
【10月更文挑战第29天】系统调用处理程序在内核栈中保存的这些上下文信息对于保证系统调用的正确执行和用户程序的正常恢复至关重要。通过准确地保存和恢复这些信息,操作系统能够实现用户模式和内核模式之间的无缝切换,为用户程序提供稳定、可靠的系统服务。
47 4
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
67 2
|
2月前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
47 1