一:提高程序性能
1. 磁盘(Disk)未必比内存(Memory)慢。
原理:Memory的随机存取(random access)需要消耗大量时间,数量级大概是500+个cycle,也就是每次随机存取,CPU都要花时间等数据从内存读过来。而虽然磁盘一次读取的时间确实比内存慢很多,但是顺序读取的话,系统会自动预读下一个数据放在L2 cache里面,而从L2到CPU里面的时间只需一个cycle;也就是说,在磁盘顺序读取大量数据,忽略掉overhead,可以达到一个cycle一组数据的速度,如果你的硬盘速度是5G/s,那平摊速度也基本达到5G/s。当然这个还跟硬盘数据存储结构有关,硬盘有很多能平行存取的盘,横向存数据的话就能平行地同时读取下一组数据;如果数据是纵向存在同一个盘的就不行,但是如果两次读取之间的其他代码cycle足够多的话,还是一样省时间(不过内存的随机存取,有足够的代码塞在两次读取之间也可以避免浪费时间)。
应用举例:将磁盘里的数据依次读出放在链表(不放数组是因为有时候不知道数据长度)里面以便下次读取,不如在需要时直接从磁盘读取。
2. 条件语句极大降低运行速度。
原理:学过Architecture的应该知道,进行条件语句(branch,包括循环的条件)的执行时,由于系统要预先读入一定数量的命令来增加速度,便进行条件语句块的猜测(即猜测是否进入if块还是else块),如果真的执行到那个条件语句时发现猜测是错误的,就把之前预读预先执行的命令全部回退掉(flash),重新执行正确的部分。结果就是之前的那些cycle时间都浪费掉,而且命令也是从内存读入的,命令指针改变了,就需要等待新的地址下的命令(即随机读取,需要500cycle)。因此我们应该尽量避免使用条件语句,或者避免预测错误。另外提一下:条件语句块的猜测(branch predicate)第一次会进入else的部分,每次执行后会记录更改predicate table以便下次有数据参照进行预测,至于用什么策略进行猜测是系统决定的。
应用举例:写如下语句纯属浪费时间,直接一句 num = 0; 就好了。
if(num != 0)
num = 0;
另外应该尽量使预知第一次会进入的语句块放在else部分,并尽量避免多层的if-else语句。
for(int i=0; i<100; i++){
if( i != 0)
; //nothing to do
else //i初始为0,会进入这部分语句块
Initialization();
if( i == 99)//前99次循环都不会试图进入这个语句块
Finalize();
}
3. 初学者式的代码能获得最快速度。
原理:因为人们在设计系统时就是假设程序员用很笨的方式写代码,而不可能要求程序员去了解底层实现来写适应于系统的巧妙代码。故不要变着花样写很聪明代码,其实说不定反而比笨的方法慢。这在编程里是个很著名的理论KISS,Keep it simple as stupid. 另外数组的顺序读取能获得最快的速度(一个cycle一句),系统会自动预读下一个数据,不要为了避免执行一些语句而不停地改变下标(index),尤其数组倒序读取是非常非常慢的,等于每一次都是随机存取(因为预读的都是不需要的,还占用缓存)。话说自从学了这门课,我非常热爱数组,有一次我把使用的某数据结构从链表改成数组,运行时间从2个多小时变成不到1小时。
应用举例:
int sum = 0;
for(int i=0; i<100; i++){
if(a[i] >= 0)//不要写类似于if(a[i] <0) i++; 来跳过某些index的语句
sum += a[i];
}
4. 尽量避免多线程同步,避免来回new和delete对象。
原理:由于执行同步代码时,系统并不是真的把所有时间分配给正在执行的线程,而是当其他线程要执行时会不停不停地访问某个token是否有执行权限,一直到这个token被释放,这是一个非常浪费时间的操作。因此应该尽量避免使用多线程同步,避免在两个线程里读写同一个数据。当然这在某些情况下并不是那么容易做到,推荐的方法是,建立一个专门处理信息交换的类作为通道(就是将同步范围尽量降低),或者将需要读写的数据块分成不同部分单独分配给不同线程专门操作,比如将1000长度的需要排序的数组分成四个,每个线程250= =,处理后再合起来。避免来回new和delete也是同样避免同步的道理,某线程new和delete对象时所有线程都要等待,很消耗时间。推荐的方法是,将要delete的对象用专门的类管理起来,下次需要时再从中分配,直到真的不再需要时再delete。
分享到:
相关推荐
本资源为 MySQL 数据库课程笔记,涵盖了 MySQL 的基础知识、SQL 语言、数据库管理系统、NoSQL 数据库等多个方面的内容。 数据库基础知识 * 数据库管理系统(DBMS): MySQL 是一种关系型数据库管理系统,具有 ACID...
8. 性能优化:包括索引、查询优化、存储过程和数据库重构,以提高查询速度和系统性能。 9. 数据仓库与OLAP:数据仓库是用于决策支持的集成、非易失性、历史数据集合。在线分析处理(OLAP)支持多维数据分析,如切片...
在数据库课程设计中,学生需要整合这些技术,实现一个能够帮助用户查询、比较和选择笔记本的系统。这通常涉及到数据的输入、检索、更新和删除操作,以及用户交互界面的设计。可能的功能包括笔记本品牌和型号的搜索、...
本笔记将探讨数据库的一些关键概念,包括数据独立性、数据模型、数据库系统的组成、数据完整性约束以及SQL Server 2000企业版的相关服务。 1. 数据的逻辑独立性和物理独立性: - 物理独立性是指数据库的内部存储...
### MySQL数据库入门实战课程-重点笔记 #### 一、数据库基础知识 1. **数据库定义**: - 数据库(Database, DB)是一种组织和存储数据的方式,以便用户能够方便地访问、管理和更新数据。 2. **SQL简介**: - SQL...
在本课程设计中,我们将深入探讨“C语言与MySQL数据库”的结合使用,这是一门针对CUMCM(中国大学生数学建模竞赛)2023年的C语言开发笔记。通过这个项目,你将学习到如何利用C语言作为编程工具,与MySQL数据库进行...
"数据库餐饮管理系统课程设计....数据库餐饮管理系统课程设计项目旨在设计和实现一个基于计算机网络和数据库技术的餐饮管理系统,旨在提高餐饮业的管理效率、避免人工错误、提高工作效率、避免数据丢失和误操作等问题。
Processing是一种开源编程语言和环境,常用于可视化数据和创建交互式应用程序,但它在数据库课程设计中的应用相对较少,可能是指用Processing来展示或分析数据库结果。 在进行数据库课程设计时,我们需要了解以下几...
Oracle数据库是世界上最流行的关系型数据库管理系统之一,广泛应用于企业级数据管理、数据分析和应用程序开发。以下将详细阐述Oracle的一些核心知识点。 1. **基础概念和术语**: - **关系型数据库**: 数据以表格...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,它在企业级应用中扮演着核心角色。以下是对Oracle数据库课堂笔记的详细解析,涵盖了从基础到进阶的重要知识点。 第一讲:Oracle简介 Oracle数据库是由甲骨...
数据库系统(Database System,DBS)是由数据库、数据库管理系统(DBMS)、应用程序、数据库管理员(DBA)等组成的整体,用于存储、管理、维护和检索数据。 **数据库管理系统(DBMS)的功能:** - **数据定义**:...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。姜承尧作为知名的MySQL专家,他的课程深入浅出地讲解了MySQL的高级概念和技术,帮助DBA(数据库管理员)和开发者提升技能,从而...
【Java相关课程系列笔记之十四Hibernate学习笔记】 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作。本笔记将详细阐述Hibernate的核心概念、使用方法和特性。 一、...
【C++课程笔记详解】 达内的C++课程是专为深入学习编程技术的学员设计的,特别是对于希望在计算机科学领域提升技能或者从事软件开发工作的人来说,这是一个宝贵的资源。本笔记涵盖的内容广泛,旨在帮助学生全面理解...
本项目是一个基于Java的SSM(Spring、SpringMVC、MyBatis)框架与MySQL数据库相结合的课堂笔记系统。这是一个典型的Web应用开发实例,适用于学生进行毕业设计或课程设计,旨在提升开发者对Java企业级应用开发的理解...
这份"Java生产环境下性能监控与调优详解课程笔记(完整版)"涵盖了多个重要的知识点,旨在帮助开发者和运维人员提升Java应用的性能。 一、Java性能监控工具 1. JVisualVM:集成在JDK中的一个多用途工具,可以进行...
【数据库餐饮管理系统课程设计】 本课程设计旨在构建一个集成了餐饮业管理各项功能的数据库系统,以提升工作效率,减少人为错误,并提供友好的用户界面。系统主要由几个关键部分组成,包括基础信息管理、辅助工具、...
- 优点: 提高系统的可靠性和可用性,数据分布可以提高访问速度和容错能力。 - 缺点: 实现和管理复杂,需要处理数据同步、分布式事务和网络延迟等问题。 - **客户/服务器结构(Client-server Structure)**: - ...
Android系统是全球最广泛使用的移动操作系统之一,由Google公司开发并维护。这个“Android系统知识总结+培训课程+笔记”包含了一系列深入学习Android开发的重要资料,涵盖了从基础到高级的各种主题,适合Android...
1. **持久化数据到本地**:数据库能够将应用程序产生的数据持久化存储在磁盘上,即使系统重启也不会丢失数据。 2. **实现结构化查询**:通过数据库,可以方便地对数据进行增删改查等操作,特别是对于复杂的数据查询...