精华内容
下载资源
问答
  • 内存盘--Ramdisk

    2009-06-13 09:48:33
    补充:前面讲的内存盘的用处都属于缓冲数据的用途,以便提高系统的运行效率,下面讲一点用内存盘模拟各种容量软驱的用途。 现在很多朋友的机器上都没有安装软驱,然而有一些程序,必须要有软驱才能运行,如制作...
  • 如何提高程序效率

    2017-02-22 07:12:07
    程序效率,是用执行的步骤(step)数――时间复杂度、占内存的多少来衡量的――空间复杂度。完成某项工作,执行的步骤(step)的次数最少、 占用内存最小是程序员追求的。特别是嵌入式系统的开发,内存等资源都是...
    一、程序效率

    程序效率,是用执行的步骤(step)数――时间复杂度、占内存的多少来衡量的――空间复杂度。完成某项工作,执行的步骤(step)的次数最少、
    占用内存最小是程序员所追求的。特别是嵌入式系统的开发,内存等资源都是有限的。
    因此,提高效率的着眼点应该是
    减少执行次数
    减少占用空间

    二、效率改善的指导原则

    -满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率;
    如果程序的正确性、可靠性得不到保证,提高效率就失去了根本;
    如果程序的健壮性得不到保证,提高效率就失去了目标;
    如果程序的可读性得不到保证,提高效率就失去了方向;

    -以提高程序的全局效率为主,提高局部效率为辅;
    如何只从局部角度出发,局部效率的改善一般对全局效率改善作用不大,有时甚至影响全局效率的改善;
    应该从全局角度出发,整体考虑,作出统一改善的调整,有的时候局部利益为配合整体需要应作出牺牲;

    -在优化程序的效率时,应当先找出限制效率的“瓶颈”;
    非关键点的改善,不会根本改变效率的现状;
    先进行一些基准数据测量和问题收集,寻找提高效率的关键点;
    有时一次关键的改动还不能解决问题,还需要进一步的数据测量和持续的改进,直到符合要求;

    -先优化数据结构和算法,再优化执行代码;
    因为O(n2)的算法写不出O(nlog2n)的程序,因此写程序前应该考虑数据结构和算法的选择和优化;
    如果你已经选择了正确的算法,那么只有到了写程序的最后,才有可能去关心执行代码的优化问题;

    -时间效率和空间效率可能对立,此时应当分析那个更重要,作出适当的折衷;
    一般来讲,在空间允许的时候,我们会花费空间换取时间效率的大幅提升;
    当空间受限--时间效率和空间对立的时候,我们根据需要,在两者之间作出适当折中;

    三、时间效率改善的考虑

    -减少内存分配的次数
    一次能够申请的内存,就不要多次申请;
    被多次访问函数中存储“不变量”的变量请定义成为static。如:

    GetLocalHostName(char* name) 
    {     
    	char funcName[] = "GetLocalHostName";
    
            sys_log( "%s begin......", funcName ); 
    	... 
    	sys_log( "%s end......", funcName ); 
    } 

    如果这是一个经常调用的函数,每次调用时都要对funcName进行分配内存,这个开销很大啊。把这个变量声明成static吧,当函数再次被调用时,就会省去了分配内存的开销,执行效率也很好。 
    -提高循环体效率
    减少循环次数
    减少循环体内执行语句的数量
    在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数
    下面例子a和例子b的功能一样,但效率不同
    例a:  
    for (i=0; i<5;i++)
    {
    	for (j=0; j<100; j++)
    	{
    		Dothing();
    	}
    }
    例b:  
    for (j=0; j<100;j++)
    {
    	for (i=0; i<5; i++)
    	{
    		Dothing();
    	}
    } 

    -减少指针定位
    指针(->)使用很方便,但实际运行往往需要进行地址计算;不必要的地址计算会导致性能的下降;
    尽可能减少->的多级嵌套。

    -提高数学表达式的效率
    a*b + a*c = a*(b+c); 减少一次乘法,但不改变表达式的意义。
    b/a + c/a = (1/a)*(b+c); 把两次除法变成一次除法和一次乘法,在几乎所有的平台上,除法都比乘法慢。
    (a || b ) && c ) = c && ( a || b ); 当c为假时,第一个表达式要计算( a || b ),第二个表达式则不计算。

    四、空间效率改善的考虑

    合理结构体成员定义顺序:按照类型从小到大,相同类型连续存放
    例a和例b的占用的空间是不同的:
    例a
    typedef  struct {
    	short   a;
    	int     b;
    	short   c;
    } AA_t;
    例b
    typedef struct
    	short   a;
    	short   c;
    	int     b;
    } BB_t 

    -冗余数据压缩,可以减少对内存的占用
      如有些矩阵数据的存储。有些矩阵中的非零元素很少,可以考虑通过只存储非零数据来减少对存储空间的占用。

    -动态内存使用的方式,可以提高内存的利用率。
      追求空间的效率和追求时间的效率,往往是矛盾的,需要全面权衡。

    -减少代码的行数可以减少ROM的占用
       对于嵌入系统而言,ROM资源是很宝贵的。减少代码行数是减少ROM占用量 的有效途径;
       减少代码行的方法:
    消除冗余代码可以有效减少代码行数
    通过函数指针和函数表可以减少程序代码规模

    四、几个实例

    效率改善的例A

    请理解下面的代码
    for( int i = 0; i < numPixels;i++ )
    {   
    	rendering_context->back_buffer->surface->bits[i] = some_value; 
    }

    做如下修改是否更好
    unsigned char *back_surface_bits = rendering_context->back_buffer->surface->bits;
    for( int i = 0; i < numPixels;i++ )
    {   
    	back_surface_bits[i] = some_value;
    }

    还可以进一步修改
    unsigned char *back_surface_bits = rendering_context->back_buffer->surface->bits;
    for( int i = 0; i < numPixels;i++,back_surface_bits++ )
    {   
    	*back_surface_bits = some_value;
    }

    效率改善的例B

    问题:有一组处理函数:functionA, functionB,… functionZ,它们的函数形式如下
    	int functionA(int event)
    	int functionB(int event)
    	……
    	int functionZ(int event)

    他们分别是不同状态(A,B…,Z)的处理。编写这段处理代码,我们该如何做?
    下面代码可行吗?
    switch (status) {
    	case A:    functionA(event)
    		break;
    	case B:    functionB(event)
    		break;
    	……
    	case Z:    functionZ(event) 
    		break;
    }

    可行!但是不好!原因是生成目标代码大,而且可维护弱一些。
    这么做可以解决上面提到的缺点
    typdef  int (*pFunc)(int event);
    typedef enum {   A =0,
    	B,
    	…
    	Z
    } Status_t;
    
    
    pFunc  functionlist[Z] ={   
    	functionA,
    	functionB,
    	…
    	functionZ
    }; 
    
    
    Status_t   status;
    ……
    status被赋值
    ……
    functionlist[status](event);	

    这么做是不是更好?

    展开全文
  • 随着时间片的时间减少,对换时间所占的比例随之增大。随着用户数目的不断增加,这种矛盾会越来越突出。 实时是指计算机对于外来信息能够以足够快的速度进行处理,并在被控对象允许的时间范围内做出快速反应。...
  • 补充:前面讲的内存盘的用处都属于缓冲数据的用途,以便提高系统的运行效率,下面讲一点用内存盘模拟各种容量软驱的用途。 现在很多朋友的机器上都没有安装软驱,然而有一些程序,必须要有软驱才能运行,如制作...
  • Ramdisk绿色中文版(gavotte开发的)

    热门讨论 2011-05-19 16:12:08
    补充:前面讲的内存盘的用处都属于缓冲数据的用途,以便提高系统的运行效率,下面讲一点用内存盘模拟各种容量软驱的用途。 现在很多朋友的机器上都没有安装软驱,然而有一些程序,必须要有软驱才能运行,如制作...
  • 比如,跳转页面需要登陆状态如何拦截,跳转页面传递参数该怎么办,程序意外跳转异常或者失败又该如何处理? 使用Arouter注意事项有哪些?如何让代码变得更加容易让人维护? 直接看我这篇博客:...
  • 综上述,“认我测”在线认证检测系统,率先填补了认证检测领域移动端的空缺,提供了Web浏览器+移动端的双端访问模式,给用户提供了多种访问途径,真正实现了用户和检测机构的随时随地在线下单检测。 关键词:...
  • resin-jvm 调优

    2009-03-11 16:05:25
    –Xmx256m为控制新域的大小,可使用-XX:NewRatio设置新域在堆中所占的比例。 下面的命令把整个堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M: java –Xms128m –Xmx128m –XX:...
  • 编辑推荐通过学习《Oracle Database 10g 性能调整与优化》,读者可以了解到如何选择最优化的索引选项,有效地管理驱动器和磁盘阵列,对查询执行故障检修,以及可靠地预测将来的性能。《Oracle Database 10g 性能调整...
  •  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
  • 这个问题给我们教训的是:在直接对内存地址进行操作时,一定要保证其值的合法性,否则容易引起内存操作越界,给系统的稳定性带来潜在的威胁。 【案例1.2.4】 近日在CDB并行测试中发现一个问题:我们需要的小区...
  • java 面试题 总结

    2009-09-16 08:45:34
     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
  • c++ 面试题 总结

    2009-09-16 08:44:40
    15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数 A1: 16位的系统下, int i = 65536; cout ; // 输出0; int i = 65535; cout ; // 输出-1; 32位的系统下, int i = 65536; cout ; ...
  • Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结,这次辛苦老范给我们整理了这份实用的秘笈。 ...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数: GetLength 得到字符串长度 GetAt 得到指定位置处的字符 operator + 相当于strcat void Format( LPCTSTR lpszFormat, ... ); ...
  • 1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。 2.实参可以是常量、变量、表达式、函数...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -Grid1.Columns.FindColumnById函数被Grid1.FindColumn替代。 -为TreeCheckEventArgs,TreeExpandEventArgs,TreeCommandEventArgs增加Node属性。 -为所有控件增加Focus(覆盖Control默认的Focus函数)和...
  • 生命周期管理,完全解耦,方便系统内存管理释放,基于观察者模式实现数据更新等等 Retrofit2:感谢Square公司 rxjava2:感谢ReactiveX,突然发现Rxjava已经发布3.0了 ObjectBox:android上运行速度最快的数据库,...
  • -Grid1.Columns.FindColumnById函数被Grid1.FindColumn替代。 -为TreeCheckEventArgs,TreeExpandEventArgs,TreeCommandEventArgs增加Node属性。 -为所有控件增加Focus(覆盖Control默认的Focus函数)和...
  • 小技巧: 如何更有效率的查看github上的文件 小伙伴可以下载一个插件叫做:Octotree,可以在左侧以树状的形式展示github中目录结构和文件列表,非常好用! 重要! PDF下载出错的小伙伴可以git clone整个项目即可!...
  • 人们可以忽略发动机、液压传输、刹车系统如何工作的细节, 而习惯于把汽车当作一个整体来认识。 包含通用对象类的库叫作类库。 2.2.7 多态型 面向对象程序的最后一个概念是多态性。凭借多态性,你可以...
  • 疯狂的程序员

    热门讨论 2012-07-18 18:05:32
    不光进不了这学校,甚至进不了中国和外国任何一大学。 第二天,王江去退学了。土匪没去。问土匪为什么?土匪说:“他太不成熟了。唉,年龄小,办事不牢靠。” 后来,王江的爸爸到了学校。绝影觉得王江的老爸怎么看...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

如何减少系统所占内存