C++性能优化技术导论

合集下载

优化代码性能与减少资源消耗的技巧

优化代码性能与减少资源消耗的技巧

优化代码性能与减少资源消耗的技巧优化代码性能和减少资源消耗是编程中非常重要的课题。

通过优化代码,我们可以提高程序的运行效率,减少内存占用和CPU利用率,从而提升用户体验,降低服务器负载等。

下面我将分享一些优化代码性能和减少资源消耗的技巧,供大家参考:1.使用合适的数据结构:选择合适的数据结构能够提高代码的性能。

例如,如果需要频繁地搜索数据,可以使用散列表(哈希表)来存储数据,以提高查找效率;如果需要按顺序访问数据,可以使用链表或数组。

2.减少内存分配:内存分配是一项耗时的操作,频繁的内存分配会导致性能下降。

可以采取以下措施来减少内存分配:-尽量使用对象池和缓存池来重复利用已分配的内存,而不是每次使用都分配新的内存。

-注意使用StringBuilder等可变对象,避免频繁的字符串连接操作。

-预分配足够大的内存空间,以避免频繁的内存重新分配。

当然,如果内存空间过大又用不完,也浪费了资源。

3.避免频繁的IO操作:IO操作是相对较慢的,频繁的IO操作会拖慢程序的运行速度。

可以采取以下措施来避免频繁的IO操作:-尽量采用批处理的方式进行IO操作,减少单次IO操作的次数。

-使用缓冲IO流来减少IO操作频率,一次读写多个数据。

4.使用适当的算法和数据结构:选择合适的算法和数据结构可以大大提高代码的性能。

例如,排序算法的选择、查找算法的选择等。

同时,可以使用适当的数据结构来提高代码的性能,例如使用哈希表可以快速查找数据,使用二叉堆可以快速获取最小/最大值。

5.减少循环嵌套和递归:循环嵌套和递归都会消耗大量的资源。

可以尽量避免多层循环嵌套和深层次的递归调用,或者考虑使用尾递归等优化方式。

6.并行和并发处理:合理的并行和并发处理可以充分利用多核CPU 的优势,提高代码的运行效率。

可以使用线程池、并行计算库等来实现并行和并发处理。

7.减少系统调用次数:系统调用是相对较慢的操作,频繁的系统调用会拖慢程序的运行速度。

可以考虑合并多次系统调用,或者使用合适的系统调用方式,以提高代码的性能。

高性能计算导论:并行计算性能评价

高性能计算导论:并行计算性能评价
任务并行算法
如流水线技术、分治算法等,通过将任务划分为多个子任 务,分配给不同的处理单元并行执行,从而实现任务的快 速完成。
消息传递并行算法
如MPI(Message Passing Interface)算法,通过进程 间通信来协调不同处理单元上的任务执行,适用于分布式 内存系统。
算法优化策略与方法探讨
结果分析和改进建议
结果分析
对实验结果进行深入分析,找出性能 瓶颈和影响性能的关键因素。
改进建议
根据分析结果提出针对性的改进建议,如优 化算法、改进系统结构、提高硬件性能等。 同时,也可以对实验方法和流程进行反思和 改进,以提高评估的准确性和有效性。
05 案例分析:并行计算性能 评价实践
案例背景和目标设定
加速比
并行算法相对于串行算法 的执行速度提升倍数。
效率
用于衡量并行系统中处理 器利用率的指标,通常表 示为加速比与处理器数量 的比值。
可扩展性与规模性指标
1 2
等效性
在增加处理器数量时,保持问题规模和计算复杂 度不变的情况下,系统性能的提升能力。
弱可扩展性
在增加处理器数量的同时,增加问题规模,保持 每个处理器的负载不变,系统性能的提升能力。
功耗与能效比指标
功耗
01
并行计算系统在运行过程中的总功率消耗。
能效比
02
用于衡量并行计算系统每消耗一单位能量所能完成的计算量或
任务量的指标。
节能技术
03
采用低功耗处理器、动态电压频率调整、节能算法等技术降低
并行计算系统的功耗。
03 并行算法设计与优化策略
典型并行算法介绍及原理剖析
数据并行算法
如数组运算、矩阵乘法等,通过将数据划分为多个部分, 在多个处理单元上并行执行相同的操作来提高性能。

C语言程序运行速度优化方法谈

C语言程序运行速度优化方法谈

C语言程序运行速度优化方法谈1、选择合适的算法和数据结构选择合适的数据结构非常重要。

如果在一堆随机存储的数字中使用大量insert和delete指令,则使用链表的速度要快得多。

数组与指针语句密切相关。

一般来说,指针灵活简洁,而数组直观易懂。

对于大多数编译器来说,使用指针生成的代码比使用数组生成的代码更短、效率更高。

在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。

与数组索引相比,指针一般能使代码速度更快,占用空间更少。

使用多维数组时差异更明显。

下面的代码作用是相同的,但是效率不一样。

数组索引指针运算对于(;;){p=arraya=array[t++];for(;){a=*(p++);。

}}指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。

在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。

2、使用尽量小的数据类型对于可以由字符类型(char)定义的变量,不要使用整数(int)变量;对于可以用整数变量定义的变量,不要使用长整数,也不要使用没有浮点变量的浮点变量。

当然,定义变量后不要超出变量的范围。

如果赋值超出变量范围,C编译器不会报告错误,但程序运行结果是错误的,这样的错误很难找到。

在iccavr中,可以在options中设定使用printf参数,尽量使用基本型参数(%c、%d、%x、%x、%u和%s格式说明符),少用长整型参数(%ld、%lu、%lx和%lx格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它c编译器也一样。

在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

3、减少运算的强度(1),查表(游戏程序员必修课)一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。

看下面的例子:旧代码:长阶乘(inti){if(i==0)return1;其他的returni*factorial(i-1);}新代码:静态长阶乘表[]={1,1,2,6,24,120,720/*etc*/};longfactorial(inti){returnfactorial_uu表[i];}如果表很大,不好写,就写一个init函数,在循环外临时生成表格。

C语言技术中的CPU和内存使用率优化方法

C语言技术中的CPU和内存使用率优化方法

C语言技术中的CPU和内存使用率优化方法在计算机科学领域,C语言是一种广泛应用的编程语言,被用于开发各种软件和系统。

然而,在编写C语言程序时,我们需要考虑到CPU和内存的使用率,以确保程序的性能和效率。

本文将探讨一些优化方法,帮助我们提高C语言程序的CPU和内存使用率。

一、减少CPU的使用率1. 合理使用循环结构循环结构是C语言中常用的控制结构,但过多的循环可能会导致CPU的过度使用。

因此,在编写循环时,我们应该尽量避免不必要的循环,或者通过优化算法来减少循环的次数。

例如,可以使用二分查找算法代替线性查找算法,以减少循环次数。

2. 使用并行化技术并行化技术可以将一个任务分解为多个子任务,并在多个处理器上同时执行,从而提高CPU的利用率。

在C语言中,我们可以使用多线程编程技术来实现并行化。

通过将任务分配给不同的线程,可以使CPU同时执行多个任务,提高程序的并发性和性能。

3. 避免频繁的系统调用系统调用是C语言中与操作系统交互的重要方式,但频繁的系统调用会导致CPU的使用率增加。

因此,在编写程序时,我们应该尽量避免频繁的系统调用,可以通过合并多个系统调用、使用缓存等方式来减少系统调用的次数,从而降低CPU的使用率。

二、优化内存使用率1. 合理使用数据结构数据结构是C语言中用于存储和组织数据的重要方式。

不同的数据结构对内存的使用率有所不同,因此,在选择数据结构时,我们应该根据实际需求和性能要求来选择合适的数据结构。

例如,使用数组代替链表可以减少内存的使用,但会增加访问元素的时间复杂度。

2. 及时释放内存在C语言中,我们需要手动分配和释放内存。

如果我们在程序中没有及时释放不再使用的内存,就会导致内存泄漏,从而降低内存的使用率。

因此,我们应该养成良好的内存管理习惯,在不再使用内存时及时释放,以提高内存的使用效率。

3. 使用内存池技术内存池是一种优化内存使用的技术,它通过预先分配一块连续的内存空间,并在程序中重复使用这块内存空间,避免了频繁的内存分配和释放操作。

C#程序性能优化

C#程序性能优化

C#程序性能优化程序中我们每一丝动作都会加大程序运行的负担,当刚开始学习程序的时候常常不会去考虑程序运行的效率,大多数情况是为了实现功能,只要功能达到我想要的那么就算是达成了此项目标。

当大部分功能的编码实现对我们来说都不是大的问题的时候,我们要提升就要考虑怎样把程序写的更加规范更加高效。

怎样写的高效,我们不说整体架构的设计,仅仅分享一下C#自身程序中的一些会影响性能的点。

1.垃圾回收.NET Framework垃圾回收的成本高,每次回收垃圾的时候调用最久未被使用的算法,找出最久未被使用的对象然后把这个对象分配的内存进行回收。

进行这样的算法会非常消耗计算机的运算能力,所以在C#程序编码中避免创建不必要的对象。

1.1避免在循环中创建对象高效的做法是将对象的创建置于循环之外。

但是如果每一次循环需要实例化一个对象加入到对象列表中这个就避免不了在循环内部创建对象,如果把这个对象创建在对象之外那么会导致循环多次加入到列表中的对象是循环最后一次对象的数据了。

1.2在需要的地方才创建对象如果对象只有在某些分支逻辑中才会被使用到,那么把具体创建对象的操作放在逻辑分支中。

尽量避免在函数之前创建出函数所要使用到的所有对象。

2.String操作String字符串操作,我们多次使用到的。

所以在操作String的时候采用不高效的处理会一定程度上影响到程序的执行效率。

2.1. 我们认识一下StringString是不变类,如果我们使用“+”来连接字符串,会导致创建一个新的空间来存储连接后的字符串,在多次循环中使用“+”会导致内存循环被开辟。

这个时候应该使用StringBuilder。

StringBuilder内部有一个StringBuffer,连接操作不会每一次都分配新的字符串空间。

[2.2.字符串String对象的Length与0比较最快的,其次是String.Empty或空串C#在编译时将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量就不会重复分配了。

C语言程序优化技巧

C语言程序优化技巧

C语言程序优化技巧在编写C语言程序时,我们常常需要考虑如何提高程序的性能和效率。

通过优化技巧可以使程序更加快速、高效,减少资源的占用和浪费。

本文将介绍一些常见的C语言程序优化技巧,帮助开发者写出更出色的代码。

1. 使用合适的数据类型选择合适的数据类型可以减少内存的占用和提高程序的运行速度。

例如,如果变量的取值范围在0到255之间,可以使用无符号字符型(unsigned char)代替整型(int),以节省内存空间。

此外,在涉及大量整数运算时,使用整型(int)而非浮点型(float)或双精度浮点型(double)可以提高运算效率。

2. 减少循环次数循环是C语言中常用的结构,但是过多的循环会影响程序的性能。

因此,在编写程序时应尽量减少循环的次数。

可以使用数学公式、位运算等技巧来简化运算,从而减少循环的次数。

3. 避免重复计算在编写程序时,避免重复计算可以提高程序的效率。

可以使用临时变量存储重复计算的结果,避免重复的运算过程。

此外,还可以使用缓存来存储一些常用的计算结果,加快程序的运行速度。

4. 减少函数调用次数函数调用是C语言中常见的操作,但是频繁的函数调用会导致程序的性能下降。

因此,在编写程序时应尽量减少函数调用的次数。

可以将一些常用的代码片段封装成函数,以避免重复的代码和函数调用。

5. 使用适当的算法和数据结构选择合适的算法和数据结构对于程序的性能非常重要。

在解决问题时,应该选择最合适的算法来实现需求,并结合适当的数据结构来提高程序的执行效率。

通过选择高效的算法和数据结构,可以减少程序的运行时间和资源占用。

6. 注意内存管理合理的内存管理可以提高程序的运行效率。

在编写程序时,应避免内存泄漏和内存碎片的情况发生。

可以使用合适的内存分配和释放操作,例如使用malloc()、free()等函数来管理内存,避免不必要的内存占用和浪费。

7. 编译器优化选项现代编译器通常提供一些优化选项,可以帮助开发者自动对代码进行优化。

2024版年度《并行程序设计导论》第四章

2024版年度《并行程序设计导论》第四章

•并行计算基础•并行算法设计•并行编程模型与语言目录•并行程序性能优化•并行程序调试与性能分析•总结与展望并行计算概念及特点并行计算概念并行计算是指在同一时间内,使用多个计算资源(如处理器、核心、计算机等)同时执行多个计算任务的过程。

并行计算特点并行计算的主要特点包括同时性、独立性、加速比和可扩展性等。

其中,同时性指多个任务在同一时间内执行;独立性指各个任务之间互不干扰;加速比指并行计算相对于串行计算的加速效果;可扩展性指并行计算系统能够方便地增加计算资源以提高计算能力。

多核处理器集群系统分布式共享内存系统任务并行数据并行流水线并行并行算法特点并行算法分类与特点常见并行算法介绍如并行快速排序、归并排序等,提高排序速度。

如并行广度优先搜索、最短路径算法等,用于图论问题的求解。

如矩阵乘法、矩阵分解等,加速线性代数计算。

如并行蒙特卡洛方法、并行有限元方法等,应用于科学计算领域。

并行排序算法并行图算法并行矩阵运算并行数值计算并行算法性能评价加速比效率可扩展性复杂度分析共享内存编程模型原理及特点常用同步机制典型应用01 02 03原理及特点常用通信方式典型应用消息传递编程模型OpenMP 存并行编程的了简单的并行循环、分段、任务等构造,以及丰富的同步和互斥机制。

用于多核、多线程等共享内存环境,可以方便地实现并行化。

OpenMP MPI 编程的标准接口,提供了丰富的通信函数和同步机制。

MPI 系统等环境,可以实现大规模并行计算。

MPI CUDA 一种并行计算平台和编程模型,支持CUDA 程接口和扩展库,可以方便地实现应用程序。

CUDA 除了上述三种常见的并行编程语言外,还有许多其他语言和工具支持并行编程,如Fortran 这些语言和工具各有特点,可以根据具体应用场景选择合适的编程语言和工具。

其他语言并行编程语言介绍针对特定问题选择合适的并行算法,通过减少计算量、提高计算效率来优化性能。

算法选择与优化数据结构与存储优化编译优化技术运行时优化技术合理设计数据结构,减少数据冗余和访问冲突,提高数据存储和访问效率。

常见算法优化与性能分析

常见算法优化与性能分析

常见算法优化与性能分析在计算机科学领域中,算法常常是我们在编写代码时需要处理的重要部分。

好的算法可以有效提高程序的运行效率,而不好的算法则可能会造成程序运行缓慢、消耗大量的资源,甚至会导致程序崩溃。

因此,在编写程序时,我们需要关注优化算法和性能分析。

本篇文章将针对常见算法进行优化和性能分析的问题进行探讨,为读者提供一些有关这方面的基础知识。

一、算法性能分析在编写程序之前,我们需要对程序的算法进行性能分析。

性能分析可以帮助我们确定程序的算法是否适合所面对的问题,并且可以帮助我们找到程序中可能的性能瓶颈。

1. 时间复杂度时间复杂度是衡量程序运行速度的一种度量方式,它表示程序执行所需的时间随输入数据量的增长而增长的速度。

常见的时间复杂度比较如下:- O(1): 常数时间复杂度,表示程序的执行时间与输入规模无关,始终保持相同,如查找散列表中的元素。

- O(log n): 对数时间复杂度,表示程序的执行时间与输入规模呈对数关系。

如在排好序的数组中二分查找元素。

- O(n): 线性时间复杂度,表示程序的执行时间与输入规模成正比,如在数组中查找某个元素。

- O(nlog n): n 对数线性时间复杂度,表示程序的执行时间与输入规模成 log n 倍数增长,如快速排序。

- O(n²): 平方时间复杂度,表示程序的执行时间与输入规模成二次方增长,如选择排序和冒泡排序。

- O(n³): 立方时间复杂度,表示程序的执行时间与输入规模成三次方增长,如矩阵乘法。

- O(2ⁿ)、O(n!)、O(nⁿ)等等: 非常不适合的复杂度,程序的执行时间会随着输入规模的增长而成指数倍数增长,应尽量避免。

2. 空间复杂度空间复杂度衡量程序运行期间所需的内存随输入数据量的增长而增长的速度。

可以根据程序中所需要的存储空间来评估其空间复杂度。

通常情况下,空间复杂度评估要求程序使用的内存空间是所需输入的空间加上一些固定大小的辅助空间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uint64_t ret;
asm volatile ("rdtsc" : "=A" (ret));
return ret;
}
//得到cpu的主频,本函数第一次调用会耗时0.01秒钟
inline uint64_t GetCpuTickPerSecond()
{
static uint64_t ret = 0;
参考:双数组Trie树
参考:bloom-filter
B)大节点化
如果一个节点(树或者链表等)长度太小,那么单个数据命中cpu cache的概率就很低。考虑到cpu cache line的长度(如64字节),我们需要尽量把一个节点存放更多的数据。B树就是这样的一种结构,它一个节点保存了大量连续数据,能有效利用cache。Judy Array也是通过谨慎安排树节点的长度来利用cache。列表结构,一个节点存放多个数据,也能提高cache命中率。
第二章 善用编译器
第三章 算法为王
第四章c++语言特性
第五章 理解硬件
第六章linux系统
1、性能优化原理
在谈论性能优化技术之前,有几点大家一定要明确。第一点是必须有编写良好的代码,编写的很混乱的代码(如注释缺乏、命名模糊),很难进行优化。第二点是良好的构架设计,性能优化只能优化单个程序,并不能够优化蹩脚的构架。不过,网络如此发达,只要不是自己乱想的构架,只要去积极分析别人的成功构架,大家几乎不会遇到蹩脚的构架。
map是一种很通用的结构(如c++里面的std::map或者java的TreeMap),一般的语言都是用红黑树来实现。红黑树是一种读写性能比较均衡的平衡二叉树。
对于排序来说,std::sort采用的是改进的quicksort算法,即intro sort。这种算法在递归层次较深的时候,改用堆排序,从而避免了快排进入“陷阱”(即O(N)复杂度)。Introsort是公认的最好的快速排序算法。
下图是同样的程序,用gprof检查的结果:
我们可以看到,这个结果比callgrind计算的要精确很多。
在前一章,我们对分析代码和函数性能的策略进行了介绍。本章将介绍算法在程序性能方面的作用。
如果没有看过第一章的兄弟,在这里查看:第一章 性能分析原理。
2 算法为王
算法是程序的核心,一个程序的好坏,大部分是看起算法的好坏。对于一般的程序员来讲,我们无法改变系统和库的调用,只能根据规则来使用它们,我们可以改变的是我们自己核心代码的算法。
2.3内存管理算法
常见的内存管理算法有很多,如First-Fit、Best-Fit、Buddy-system、Hal-Fit。每个程序根据自己的特点会采用不同的算法,没有绝对好的算法。比如,内核可能采用Buddy-System。有1个比较经典的算法大家需要清楚,即c语言的内存分配malloc算法。我们目前在各种系统中看到的算法,比如memcached、nginx等,都是这种算法的简单变形。
inline uint64_t GetTickCPU()
{
uint32_t op; // input: eax
uint32_t eax; // output: eax
asm volatile(
"pushl %%ebx \n\t"
"cpuid \n\t"
"popl %%ebx \n\t"
: "=a"(eax) : "a"(op) : "cc" );
printf("%d,%lld\n", g, time);
return 0;
}
callgrind运行的结果如下:
我们把输出的结果在windows下用callgrind的工具分析,得到如下结果:
1.4、g++性能分析
gprof是g++自带的性能分析工具(gnu profile)。它通过内嵌代码到各个函数里面来计算函数耗时。按理说它应该对高度优化代码很有效,但实际上它对-O2的代码并不友好,这个可能和它的实现位置有关系(在代码优化之后)。gprof的原理决定了它对程序影响较小。
在前一章,我们对常见算法的选择做了些简单的说明。本章将介绍g++编译器在性能优化中的重要作用。
如果没有看过第二章的兄弟,在这里查看:第二章 算法为王。
3 善用编译器
算法能够十倍、几十倍的提高程序性能,但当算法已经很难改进时,还有一种简单的办法提高程序性能,那就是微调编译器。利用编译器提供的各种功能,你能够轻松的提高几倍的程序性能。
C++性能优化技术导论
来源:/a/zh_CN/date/20110824
作者:冲出宇宙
【介绍】
本文完整的描述了C++语言的性能优化方法,从编译器、算法、语言特性、硬件、Linux等多个角度去考虑问题,文章技术含量很高,值得一看。
【目录】
第一章 性能优化原理
平常的排序用introsort即可,但在遇到大规模字符串排序的时候,更好的一个策略是采用基数排序。笔者的经验是,千万量级时,基数排序在字符串领域比introsort快几十倍。有很多研究论文探讨基数排序在字符串领域的应用,大家可以去看看,如:Efficient Trie-Based Sorting of Large Sets Of Strings。
大家要记住的是,编译器绝对比想象的要强大的多。编写编译器的人大都是十年、几十年代码编写经验的科学家!你能简单想到的,他们都已经想到过了。普通的编译器,可以支持大部分已知的优化策略以及多媒体指令。
至于哪个编译器更好?大部分人的观点是:intel。Intel毕竟是最优秀的cpu提供者,他们的编译器考虑了很多cpu的特性,跑的更快。但目前intel编译器有一些比较弱智的地方,即它只识别自己的cpu,不是自己的cpu,就认为是最差的i386-i686机器,从而不能在amd等平台上面支持sse功能。我们在linux上面写代码,一般更加喜欢流行的编译器,比如gcc。
a、基于概率
通过不断的中断程序,查看程序中断的位置所在的函数,出现次数最多的函数即为耗时最严重的函数。
b、基于事件
当发生一次cpu硬件事件的时候,某些cup会通知进程。如果事件包括L1失效多少次这种,我们就能知道程序跑的慢的原因。
c、避免干扰
性能测试最忌讳外界干扰。比如,内存不足,读内存变成了磁盘操作。
参考:malloc
malloc算法根据空闲内存块大小进行分段,每个段有一个字节范围,在这个范围内的空闲内存块都挂在对应链表上面。分配内存的时候,先找到对应的段,然后取链表的第一个内存块分配即可。
TLSF算法是号称最好的内存分配算法。它也是malloc算法的一种变形。
参考:tlsf
2.4库的选择
毫无疑问,首选glibc/stl库,因为他们被论证多年,并且,同样的算法,很难写出更好更快的代码。
1.3、性能分析工具-callgrind
valgrind系列工具因为免费,所以在linux系统上面最常见。callgrind是valgrind工具里面的一员,它的主要功能是模拟cpu的cache,能够计算多级cache的有效、失效次数,以及每个函数的调用耗时统计。
callgrind的实现机理(基于外部中断)决定了它有不少缺点。比如,会导致程序严重变慢、不支持高度优化的程序、耗时统计的结果误差较大等等。
uint64_t preTime = GetTime();
//代码段
uint64_t timeUsed = GetTime() - preTime;
//改进的计算方式
struct TimeHelper{
uint64_t preTime;
TimeHelper():preTime(GetTime())
{}
~TimeHelper(){
g_timeUsed = GetTime() - preTime;
}
};
//调用
{
TimeHelper th;
//代码段
}
// g_timeUsed保存了耗时
//得到cpu的tick count,cpuid(重整时钟周期)消耗约300周期(如果不需要特别精确的精度,可以不执行cpuid
我们注意到,系统在调度程序的时候,可能会把程序放到不同的cpu核心上面运行,而每个cpu核心上面运行的周期不同,从而导致了采用rdtsc时,计算的结果不正确。解决方案是调用linux系统的sched_setaffinity来强制进程只在固定的cpu核心上运行。
有关耗时计算的参考代码:
//通常计算代码耗时
我们编写了一个简单的测试程序,用它来测试常见性能分析工具。代码如下:
//计算最大公约数
inline int gcd(int m, int n)
{
PERFOMANCE("gcd"); //全局计算耗时的define
int d = 0;
do{
d = m % n;
m = n;
n = d;
}while(d > 0);
在某些情况下,如果数组基本有序的话,可能希尔排序也是一个好选择。希尔排序最重要的是其每次选择的数据间隔,这个方面有专门的研究可以参考。
至于其他的特殊算法,如多个有序数组归并等等,大家可以在实际情况中灵活应变。
2.2算法应用优化策略
在实际应用中,有一些基本的优化策略可以借鉴。如:
A)数组化
这条策略的逻辑很简单:访问数组比访问其他结构(如指针)更快。基于这种考虑,我们可以把树结构变成数组结构。数组平衡树,它把一个通常的平衡树修改为数组的形式,但编程比较复杂。双数组Trie树,用2个或者多个数组来描述Trie树,因为trie树是一个多叉树,变成数组后,性能可以提高10多倍。数组hash,hash表用数组描述,最方面最有名的结构是bloom filter和cuckoo hash。
相关文档
最新文档