我想从一个游戏程序员的角度探讨OOP的一个问题──性能。

现时C++可以说是支持OOP范式中最为常用及高性能的语言。

历史上,OOP大概是60年代出现,而C++诞生于70年代末。现在的硬件和当时的有很大差异,其中最大的问题是内存墙_百度百科。

图1: 处理器和内存的性能提升比较,处理器的提升速度大幅高于内存[2]。图1: 处理器和内存的性能提升比较,处理器的提升速度大幅高于内存[2]。

跟据Numbers Every Programmer Should Know By Year:

图2:2014年计算机几种操作的潜伏期(latency)。图2:2014年计算机几种操作的潜伏期(latency)。

从这些数据,我们可以看出,内存存取成为现代计算机性能的重要瓶颈。然而,这个问题在C++设计OOP编程范式的实现方式之初应该并未能考虑得到。现时的OOP编程有可能不缓存友好(cache friendly),导致有时候并不能发挥硬件最佳性能。以下描述一些箇中原因。

1. 过度封装

使用OOP时,会把一些复杂的问题分拆抽象成较简单的独立对象,通过对象的互相调用去实现方案。但是,由于对象包含自己封装的数据,一个问题的数据被分散在不同的内存区域。互相调用时很可能会出现数据的cache miss的情况。

2. 多态

在C++的一般的多态实现中,会使用到虚函数表。虚函数表是通过加入一次间接层来实现动态派送。但在调用的时候需要读取虚函数表,增加cache miss的可能性。基本上要支持动态派送,无论用虚函数表、函数指针都会形成这个问题,但如果类的数目极多,把函数指针如果和数据放在一起有时候可放缓问题。

3. 数据布局

虽然OOP本身并无限制数据的布局方式,但基本上绝大部分OOP语言都是把成员变量连续包裹在一段内存中。甚至使用C去编程的时候,也通常会使用到OOP或Object-based的思考方式,把一些相关的数据放置于一个struct之内:

即使不使用多态,我们几乎不加思索地会使用这种数据布局方式。我们通常会以为,由于各个成员变量都紧凑地放置在一起,这种数据布局通常对缓存友好。然而,实际上,我们需要考虑数据的存取模式(access pattern)。

在OOP中,通过封装,一个类的各种功能会被实现为多个成员函数,而每个成员函数实际上可能只会存取少量的成员变量。这可能形式非常严重的问题,例如:

在这种模式下,实阶上只存取了两个成员变量,但其他成员变量也会载入缓存造成浪费。当然,如果在迭代的时候能存取尽量多的成员变量,这个问题可能并不存在,但实际上是很困难的。

如果采用传统的OOP编程范式及实现方式,数据布局的问题几乎没有解决方案。oop所以在[1]里,作者提出,在某些情况下,应该放弃OOP方式,以数据的存取及布局为编程的考虑重中,称作面向数据编程(data-oriented programming, DOP)。

有关DOP的内容就不在此展开了,读者可参考[1],还有[3]作为实际应用例子。

[1] ALBRECHT, “Pitfalls of Object Oriented Programming”, GCAP Australia, 2009. research.scee.net/files/presentations/gcapaustralia09/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf

[2] Hennessy, John L., and David A. Patterson. Computer architecture: a quantitative approach. Elsevier, 2012.

[3] COLLIN, “Culling the Battlefield”, GDC 2011. dice.se/wp-content/uploads/CullingTheBattlefield.pdf

本文来自电脑杂谈,转载请注明本文网址:

http://www.pc-fly.com/a/tongxinshuyu/article-47256-1.html

php中的oop思想,oop_php oop思想_oop和ood相关推荐

  1. php oop java oop_php oop的作用

    展开全部 oop是面向对象编程(设计) 面向对象程序设计(英语:Object Oriented Programming,缩写:OOP),指一种程62616964757a686964616fe58685 ...

  2. 回溯算法:从电影蝴蝶效应中学习回溯算法的核心思想

    回溯算法:从电影<蝴蝶效应>中学习回溯算法的核心思想 数独.八皇后.0-1背包.图的着色.旅行商问题.全排列问题都能用到 理解"回溯算法" 回溯的思想,类似枚举搜索,枚 ...

  3. 小马哥spring编程核心思想_Spring核心思想理解

    前言 在拉勾教育Java高薪训练营再次学习了spring,再次感叹spring的核心思想.强调一下,IOC和AOP是一个技术思想(理论),并不是spring提出的,spring在技术层次把这两个思想做 ...

  4. 转:Bit-Map思想与2-BitMap思想

    转:Bit-Map思想与2-BitMap思想 1. Bit-map思想 给你一堆西安市的电话号码列表,数量大概在千万级,要求从中找出所有重复的电话号码,需要时间复杂度尽可能小. 目前西安市的电话号码大 ...

  5. 【心理学】情感心理学-当代思想和传统思想的碰撞(本篇文章将不定期持续更新)

    当代思想和传统思想的碰撞 什么是当代思想? 什么是传统思想? 我们要如何理性看待当代思想和传统思想的碰撞? 如何处理当代思想和传统思想的碰撞? [欢迎各位读者投稿或提出见解:邮箱(664243624@ ...

  6. 十个著名的思想实验-黑客帝国思想原来是(Brain in a Vat)

    10.电车难题(The Trolley Problem) "电车难题"要数伦理学领域最为知名的思想实验之一,其内容大致是:一个疯子把五个无辜的人绑在电车轨道上.一辆失控的电车朝他们 ...

  7. 操作系统设计思想--主奴思想

    操作系统设计思想–主奴思想 对于操作系统而言,如何稳定可靠运行无疑是最重要的.目前的方案均为将用户进程和其他用户进程.将用户进程和操作系统进行分离.实现操作系统可以管理用户进程,但用户进程不能侵入内核 ...

  8. 编程思想(POP,OOP,COP,AOP,SOP) 整理

    面向过程(procedure oriented programming) POP      一种以过程为中心的编程思想,分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个 ...

  9. JS面向对象思想(OOP)

    直接看js好了,模拟创建一个奥运会 function 奥运会Class(主题) {// 删除主题// delete this.主题;this.主题 = 主题;this.开幕时间;this.闭幕时间;t ...

  10. 从电影《蝴蝶效应》中学习回溯算法的核心思想

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 关注我们丨文末赠书 深度优先搜索算法利用的是回溯算法思想.这个算法思 ...

最新文章

  1. 05-自己创建mapmodel自定义迁移方式
  2. TabBarItem图片不显示的原因
  3. Spread for ASP.NET技术白皮书
  4. Dubbo的静态服务
  5. Beta冲刺(9/7)——2019.5.31
  6. PureCode--iOS--自定义UITableViewCell(含疑问)
  7. linux7清空都有a的文件,linux用户和组管理
  8. 不吐不快之EJB演练——开篇概述
  9. Numpy学习笔记(三)
  10. 普通卷积、转置卷积、空洞卷积(dilated convolution、Atrous Convolution)
  11. 甘肃暴雨强度公式_最新给排水计算软件,16大功能常用公式自动计算,配11套施工方案...
  12. 随机过程(1)——绪论
  13. 日本铁路“猫站长”走红
  14. 堆排序算法实现(最小堆)
  15. python中property详解
  16. 《绝区零》首测遭破解,面临资源泄露风险
  17. 关于“马甲app”你不得不知的一些常识
  18. grep命令_Linux grep命令
  19. 性能测试优盘和固定硬盘的工具
  20. HTML:图片超链接应用

热门文章

  1. 解决Chrome谷歌浏览器Flash插件已被屏蔽
  2. 分析日志太麻烦?看看如何在在真格量化中使用MySQL记录数据
  3. csp-s2020 T1儒略日
  4. xp系统与时间服务器同步出错,解决XP时间同步出错的问题
  5. 关于输入阻抗和输出阻抗的理解
  6. Python 矩形积分法计算f_x=x函数的值(完美实现)
  7. wsarecv: An existing connection was forcibly closed by the remote host.
  8. 基于特征的真菌分解木材的理解
  9. Marlin固件配置教程详解
  10. Hadoop--基础知识点--4--hadoop集群-docker搭建