For-test

May. 29, 2023

用于测试, 点击查看,可能效果不是好

面向对象和面向过程哪个性能高?

前言

面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。

面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。

​ 很长一段时间里,我都认为面向过程的性能比面向对象的更高。一方面是因为 C 语言和 Java 语言的比较中似乎都强调了C 语言的性能高于 Java 语言 这一点,或者说 C 语言与高性能挂钩。另一方面,由于面向过程编程语言一般用 C 语言为代表,而面向对象编程语言一般用 Java 语言为代表,我习惯性地将 C 语言和面向过程编程联系在一起,将 Java 语言和面向对象编程联系在一起,荒谬地得出面向过程的性能大于面向对象的这样的结论。这样的想法是有一定错误的。

在本文中,我会阐述面向过程和面向对象不是用来比较性能的概念,而是用来描述计算机程序设计中两种不同的编程范型。

性能

​ 程序员和客户对于性能的定义和重视程度是不同的。程序员通常从代码的执行速度、存储空间占用等角度出发,进行性能优化和优化测试。而客户则更加关注整个软件或系统在使用过程中的用户体验,包括速度、流畅度、响应时间、可用性和稳定性等因素。

计算机程序设计中的两种编程范型

面向对象和面向过程不是用来比较性能的概念,而是用来描述计算机程序设计中两种不同的编程范型。

面向过程编程是指使用按照一定顺序执行的函数或过程来实现程序的设计。在面向过程编程中,代码被分成顺序执行的步骤,每一步都是一些操作的集合,它们接收某些输入,并产生某些输出。

相比之下,面向对象编程是一种更加抽象和复杂的编程方式,其中的代码被组织成一组相互协作的对象。在面向对象编程中,程序被看作是一组相对独立并且具有一定行为的对象,可以通过定义这些对象的类来实现。

相对于编程范型而言,编程语言(如 C 和 Java)更能决定代码的性能,因为语言的选择会直接影响代码的效率和执行速度。

哪种编程方式更优秀取决于具体的应用场景和实现。

在一些高性能和低延迟的领域中(如游戏开发、硬件相关、操作系统相关),使用面向过程的编程风格可能会更为适合。因为在这种情况下,需要尽可能地减少对象实例化和堆内存的分配,以提高应用程序的性能和效率。

在其他一些场景中(如企业级软件开发),更加注重代码的可重用性、可维护性和可扩展性,使用面向对象的编程方式可能会更为适合。因为通过面向对象的编程方式,可以更加容易地实现代码的复用,以及通过继承、多态等手段实现代码的扩展。

我们举一个简单的例子:

制作一杯精美的咖啡是一个非常具体的场景,可以从面向过程和面向对象两个方面来描述。

面向过程:

对于个人来说,制作一杯精美的咖啡可能涉及到以下步骤:

  1. 准备所需的咖啡豆、水、奶油和糖等材料;

  2. 磨碎咖啡豆;

  3. 烧开水,等待水烫过后将水放置到研磨好的咖啡豆上;

  4. 等待一段时间,让研磨好的咖啡豆浸泡在水中;

  5. 装载过滤器,将研磨好的咖啡豆倒入过滤器中;

  6. 慢慢注入热水,直至将过滤器中的咖啡豆全部注满;

  7. 加入牛奶、糖和奶油等辅助原料,调整口感和甜度;

  8. 搅拌均匀,即可享用。

这些步骤可以按照一个顺序来进行,并逐个执行。这是一种面向过程的思想。

面向对象:

针对开设快速咖啡店这个场景,可以考虑使用面向对象编程的方法,将咖啡店的功能分解为多个对象,并定义它们之间的关系。这样可以更好地管理整个制作咖啡流程,提高效率和质量。

例如,在这个场景下,我们可以按照以下方式进行设计:

  1. 定义一个 Order 对象,表示顾客点单;
  2. 定义一个 CoffeeMaker 对象,负责咖啡的制作;
  3. 定义一个 Payment 对象,负责收款和找零;
  4. 定义一个 Barista 对象,负责维护咖啡机,和制作咖啡;

这些对象之间是互相依赖的,可以通过消息传递来完成顾客点单、制作咖啡和收取款项等功能。这种对象之间协同工作的方式更加符合快速咖啡店的实际工作需求。

面向过程更偏向于解决具体的事情,将复杂问题分解为一系列小的任务,并按顺序逐个执行,而面向对象更偏向于共享和协作,将事情分解为需求和对象,并通过交互来实现需求。

结论

因此,哪种编程方式性能更高,这是一个没有标准答案的问题,不同的场景有不同的答案。

另外,在实际编程和应用中,面向过程和面向对象不是孤立的,它们可以结合使用以提升效率和性能。例如,按照面向对象的方法设计模块和组件后,针对其中效率较低的模块,我们可以考虑采用面向过程的方式进行优化。

综上所述,我们应该将重心放在选择适当的编程语言和设计优化的程序结构,而不是过于追求一种编程范式的性能优劣。

后记思考 I

文章的开始有一段话:C 语言的性能高于 Java 语言, 这一点脱离实际来讲是是理智的吗?我其实经常从别人的口中听说到xxx 语言的性能高于 xxx 语言,那这种说法是否准确呢?个人认为在某一具体的场景下,xxx 语言的性能高于 xxx 语言是比较严谨的。

后记思考 II

xxx 语言的性能高于 xxx 语言,既然有那么多的人说出过这种言论,说明这也是有一定的一般性在里面的。那这里的 性能 在大多数场景下指的是什么呢?

​ 我们大多数情况下以下面的指标来衡量程序的性能:

  1. secs:程序的运行时间,通常以秒为单位。表示程序完成某项功能所需要的时间,即从程序开始执行到结束的时间。
  2. mem:程序在运行期间所占用的内存大小,通常以字节数为单位。表示程序在执行过程中所使用的内存空间多少。
  3. gz:经过 gzip 压缩后的程序大小,通常以字节数为单位。经过压缩后的程序越小,存储和传输所需的带宽占用就越少。
  4. cpu secs:程序占用 CPU 的时间,通常以秒为单位。表示 CPU 在执行程序时所占用的时间,即在程序运行期间 CPU 的累计使用时间。

https://benchmarksgame-team.pages.debian.net/benchmarksgame/

​ 该网站提供了各种编程语言的运行时间、内存使用量等指标的对比数据,详细地展现了各种语言在各种场景下的实际性能差异。这对于开发人员来说是非常有用的,它可以指导开发人员在选择编程语言时做到权衡性能、编程难度与开发时间等方面,以取得最好的开发效果。

​ 我们可以看出,在大多数情况下,C 语言的性能确实是比其他语言优秀的,所以说C 语言性能比 Java 好这种言论大多数情况下还是有一定正确性的。但是我们完成一个任务或是项目,并不是单单考虑性能的问题。

当然,随着现代计算机的硬件配置也在不断更新升级,多核处理器、缓存管理和调度算法等发展,各个语言的底层设计不断完善巩固,我相信xxx 语言在 mmm 场景下的性能是高于 yyy 语言xxx 语言性能是高于 yyy 语言这些言论不是一成不变的。