我最近刚刚做了一个php网站开发技术交流学习的网站,但是百度c优化du88棒的优化一直不是很好请大虾帮忙指点一下啊

PHP优化完全详解 - PHP开发学习门户
& PHP优化完全详解
作者 23摄氏度 in ,
标签: , , ,
以下就几点PHP的优化做下总结:
1、in_array的用法
避免在大的数组上使用 in_array(),同时避免在循环中对包含20个以上元素的数组使用这个函数。 in_array()会非常消耗资源. 对于小的数组这种影响可能很小, 但是在一个循环中检查大数组可能会需要好几秒钟的时间。 如果您确实需要这个功能,请使用isset()来查找数组元素。实际上是使用键名来查询键值。 调用 isset($array[$var]) 会比 in_array($var, array_keys($array)) 要快得多。
2、数组键名
在PHP中, 使用不经单引号包含的字符串作为数组键名是合法的, 但是我们不希望如此 — 键名应该总是由单引号包含而避免引起混淆。 注意这是使用一个字符串, 而不是使用变量做键名的情况。例如:
// 不好的写法
$foo = $assoc_array[blah];
// 好的写法
$foo = $assoc_array[‘blah’];
// 不好的写法
$foo = $assoc_array[“$var”];
// 好的写法
$foo = $assoc_array[$var];
3、字符串表达
在PHP中用两种不同的方式来表示一个字符串 – 单引号或者双引号。 主要的区别在于语法解释器会对双引号表示的字符串进行变量替换, 而不会处理单引号表示的字符串。 因此您应该总是使用单引号, 除非您真的需要在字符串中处理变量。 这样, 我们可以减少程序运行消耗, 因为语法解释器不需要每次多处理一大堆根本没有变量的字符串。
同样, 如果您在函数调用中使用了一个字符串变量作为参数, 您不需要将这个变量包含在引号里。 这会导致语法解释器多做好多无用功。 记住, 几乎所有双引号中的转义符对于单引号都是无效的。 您需要留意以上的规则, 但是有时候为了代码的可读性, 可以适当的破例。 例如:
// 不好的写法
$str = “This is a really long string with no variables for the parser to find.”;
do_stuff(“$str”);
// 好的写法
$str = ‘This is a really long string with no variables for the parser to find.';
do_stuff($str);
// 有时候单引号不是那么合适
$post_url = $phpbb_root_path . ‘posting.’ . $phpEx . ‘?mode=’ . $mode . ‘&start=’ . $
// 双引号有时候能让代码行更集中
$post_url = “{$phpbb_root_path}posting.$phpEx?mode=$mode&start=$start”;
4、循环定义中的操作
在比较部分如果存在运算请一定要进行优化。 因为这部分会在循环中的每一步进行操作:
// 在每次循环中sizeof函数都要被调用
for ($i = 0; $i & sizeof($post_data); $i++)
do_something();
// 您可以在循环起始部分对这个不变的量赋值
for ($i = 0, $size = sizeof($post_data); $i & $ $i++)
do_something();
5、分支判断,switch case好于if else
使用分支语句要比用很多if else好很多。
6、不要滥用@操作符
不要滥用@操作符,看上去很简单,但实际上用@比不用@效率要差几倍。
特别不要在循环中使用@。
7、获取时间的方法
很多时候我们习惯使用time()获取当前时间,但time()终归是一个函数,不如直接用$_SERVER[‘REQUEST_TIME’]好一点。
8、字符串长度判断
两种写法:
(1)if(strlen($str) & 5){/* do something */}
(2)if(isset($str[5])){ /* do something */ }
第二种写法要优于第一种。
找到瓶颈(Finding the Bottleneck)
面对一个性能问题是,第一步永远是找到问题产生的原因,而不是去看技巧列表。搞明白产生瓶颈的原因,找到目标并且实施修复,然后再重新测试。查找瓶颈只是万里长征的第一步,这里有些常用技巧,希望对最重要的第一步找到瓶颈能有所帮助。
使用监控方法(比如监控宝),进行benchmark和监控,网络,特别是网络状况瞬息万变,做得好的话5分钟就可以找到瓶颈。
剖析代码。必须了解那部分代码耗时最多,在这些地方多多关注。
想找到瓶颈,请检查每个资源请求(比如,网络、CPU、内存、共享内存、文件系统、进程管理、网络连接等等……)
先对迭代结构和复杂的代码进行benchmark
在在真实负载下用真实数据进行真实测试,当然,如果可以最好用产品服务器。
缓存 (Caching)
有些人认为缓存是解决性能问题最有效的办法之一,试试这些:
使用OPCODE(操作码)缓存,这样脚本就不会在每次访问时重新编译一次。比如:启用Windows平台上的windows缓存扩展。可以缓存opcode,文件,相对路径,session数据和用户数据。
考虑在多服务器环境下使用分布式缓存
在调用imap_header()之前先调用imap_headers()
编译 vs. 解释(Compiling vs. Interpreting)
将PHP源码编译成机器码。动态解释执行同样的编译,但它是按行执行的。编译为opcode是折中选择,它可以将PHP源码翻译为opcode,之后opcode再转为机器码。以下为关于编译与解释的相关技巧:
上线之前将PHP代码编译为机器码。opcode缓存尽管并不是最好的选择,但依旧比解释型来得强。或者,考虑将PHP代码编译成一个C扩展。
PHP的opcode编译器(bcompiler)还不能在产品环境中使用,但是开发者应该关注http://php.net/manual/en/book.bcompiler.php.
代码减肥 (Content Reduction)
越少越块。 这些技巧可以帮助减少代码:
每页提供更少的功能
清理网页内容
如果解释型执行,请清理注释和其他空白
减少数据库查询
多线程与多进程(Multithreading & Multiprocessing)
由快到慢依次为:
多线程(单一进程中)
多进程(比如,pcntl_fork,计划任务)
单进程(一行又一行)
PHP不支持多线程,但是可以用C写多线程的PHP扩展。有一些办法可以使用多进程或模拟多进程,但支持的并不是很好,没准儿比单进程还慢。
字符串(Strings)
字符串处理,是大多数编程语言中最常用的操作之一。这里有些技巧可以帮我们让字符串处理速度更快一些:
PHP的连接运算(点运算),是最快的链接方式
避免在print中链接字符串,用逗号分割后用ECHO
尽可能使用str_前缀的字符串函数替代正则表达式
pos()比preg_mach()和ereg()都快
有人说单引号包裹字符串比双引号更快,有人说没有区别。当然,如果想在字符串中引用变量,单引号没戏。
如果想判断字符串长度是否小于某值(比如5),请使用isset($s[4])&5。
如需将多个小字符串连接成一个大字符串,试着先开启ob_start输出缓存,再用echo输出到缓冲区,完成后使用ob_get_contents读取字符串
正则表达式(Regular Expressions)
正则表达式为们带来了灵活多样的比较与查找字符串的方法,单他的性能开销却着实不低
尽可能使用STR_前缀的字符串处理函数代替正则表达式
使用[aeiou]的不是(a|e|i|o|u)
正则表达式越简单速度越快
尽可能不要设置PCRE_DOTALL修饰符
用^.*代替.*
简化正则表达式。(比如使用a*代替(a+)*
迭代结构 (Iteration Constructs (for, while))
迭代(重复,循环)是最基本的结构化编程方法,很难想像有不使用它的程序。这里有些技巧,帮助我们改进迭代结构的性能:
尽可能讲代码移出到循环外(函数调用、SQL查询等等……)
使用i=while(i–)代替for(i=0;i&i++),这样可以减少一个操作,如果maxval是一个函数调用就更明显了。
使用foreach迭代集合与数组
选择结构 (Selection Constructs (if, switch))
与迭代结构相同,选择结构也是最基本的结构化变成方法。以下技巧或许能改善性能:
switches和else-if中,应该将最近常出现true的列在前面,较少出现true的请靠后
有人说if-else比swtich/case快,当然,有人反对。
用elseif替代else if.
函数与参数 (Functions & Parameters)
将函数的代码分解成小函数代码可以消除冗余,让代码具有可读性,但代价是什么?这里有些技巧,以帮助更好的使用函数:
引用传递出对象和数组,而不是传值
如果只在一个地方使用,使用内联。如果在多个地方调用,考虑内联,但请注意可维护性
了解你所用函数的复杂度。比如similar_text()为O(N^3),这意味着字符串长度增加一倍,处理时间将增加8倍
不要通过“返回引用”来提升性能,引擎会自动优化它。
以常规方式调用函数,而不是使用call_user_func_array()或eval()
面向对象结构 (Object-Oriented Constructs)
PHP的面向对象特性,可能会影响到性能。以下提示可以帮助我们尽量减少这种影响:
不是一切都需要面向对象, 性能的损失可能会超过其优点本身
创建对象比较慢
如果可以,尽可能时候用数组而不是对象
如果一个方法可以静态化,请静态声明
函数调用比派生类方法调用要快,派生类方法调用比基类调用要快
考虑将基类中最常用的代码复制到派生类中,但要注意维护性隐患
避免使用原生的getters与setters。如果不需要他们,请删除并且属性公开
创建复杂的PHP类时,考虑使用单件模式
Session处理 (Session Handling)
创建sessions有很多好处,但有时会产生没必要的性能开支。以下技巧可以帮助我们最大限度减少性能开支:
不要使用auto_start
不要启用use_trans_sid
将session_cache_limited设置为private_no_expire
为虚拟主机(vhost)中的每个用户分配自己的目录
使用基于内存的session处理,而不是基于文件的session处理
类型转换 (Type Casting)
从一种类型转换为另一种类型需要成本
压缩(Compression)
在传输前,压缩文本和数据:
使用ob_start()在代码起始处
使用ob_gzhandler()可以下载提速,但是注意CPU开支
Apache的mod_gzip模块可以即使压缩
错误处理(Error Handling)
错误处理影响性能。我们能做的是:
记录错误日志,别再使用“@”抑制错误报告,抑制对性能一样有影响
不要只检查错误日志,警告日志一样需要处理
声明、定义与范围(Declarations, Definitions, & Scope)
创建一个变量、数组或者对象,对性能都有影响:
有人说,声明和使用全局变量/对象,比局部变量/对象要快,有人反对。请测试再决定。
在使用变量前声明所有变量,不要声明不使用的变量
在循环中尽可能使用$a[],避免使用$a=array(…)
内存泄漏(Memory Leaks)
如果内存分配后不释放,这绝对是个问题:
坚持释放资源,不要指望自带/自动的垃圾回收
使用完后尽量注销(unset)变量,尤其是资源类和大数组类型的
使用完毕就关闭数据库连接
每次使用ob_start(),记得ob_end_flush()或者ob_end_clean()
不要重复发明轮子(Don’t Reinvent the Wheel)
为什么要花费时间去解决别人已经解决的问题?
了解PHP,了解它的功能和扩展。如果你不知道,可能会无法利用一些现成的功能
使用自带的数组和字符串函数,它们绝对是性能最好的。
前人发明的轮子,并不意味着在你的环境下吸能是最好的,多多测试
代码优化(Code Optimization)
使用一个opcode optimizer
如果将被解释运行,请精简源码
使用RAM(Using RAM Instead of DASD)
RAM比磁盘快很多很多,使用RAM可以提升一些性能:
移动文件到Ramdisk
使用基于内存的session处理,而不是基于文件的session处理
使用服务(Using Services (e.g., SQL))
SQL经常被用来访问关系型数据库,但我们的PHP代码可以访问许多不同的服务。下面是一些访问服务是需要牢记的:
不要一遍又一遍地问服务器向东的事情。使用memoization缓存第一次的结果,以后访问直奔缓存;
在SQL中,使用mysql_fetch_assoc()代替mysql_fetch_array(),可以减少结果集中的整数索引。以字段名访问结果集,而不用索引数字。
对于Oracle数据库,如果没有足够的可用内存,增加oci8.default_prefetch。将oci8.statement_cache_size设置为应用中的语句数
请使用mysqli_fetch_array()替换mysqli_fetch_all(), 除非结果集将发送到其他层进行处理。
安装与配置(Installation & Configuration)
安装与配置PHP时,请考虑性能:
添加更多内存
删除竞争性的应用与服务
只编译所需要用的扩展
将PHP静态编译进APACHE
使用-O3 CFLAGS开启所有编译器优化
只安装所需使用的模块
升级到最新版本的次要版本。主板本升级,等到第一次bug修复后再进行,当然,也别等太久
为多CPU环境进行配置
使用 -enable-inline-optimization
设置session.save_handler=mm ,以 -with-mmto编译,使用共享内存
使用RAM disk
关闭resister_global和magic_quotes_*
关闭expose_php
关闭 always_populate_raw_post_data 除非你必须使用它
非命令行模式下请关闭register_argc_argv
只在.php文件中使用PHP
优化max_execution_time, max_input_time, memory_limit与output_buffering的参数
将Apache配置文件中allowoverride设置为none提升文件/目录的访问速度
使用-march, -mcpu, -msse, -mmmx, and -mfpmath=sseto使CPU最优化
使用MySQL原生驱动(mysqlnd)替换libmysql、mysqli扩展以及PDO MYSQL驱动
关闭 register_globals、register_long_arrays以及register_argc_argv. 开启auto_globals_jit.
其他(Other)
还有些技巧比较难归类:
使用include()、require(),避免使用include_once()和require_once()
在include()/require()中使用绝对路径
静态HTML被PHP生成的HTML要快
使用ctype_alnum、ctype_alpha以及ctype_digit代替正则表达式
使用简单的servlets或CGI
代码在产品环境中使用时,尽可能写日志
使用输出缓冲
请使用isset($a)代替比较$a==null;请使用$a===null代替is_nul($a)
需要脚本开始执行时间,请直接读取$_SERVER[’REQUEST_TIME’],而不是使用time()
使用echo替代print
使用前自增(++i)代替后自增(i++),大多数编译器现在都会优化,但是他们不优化时,请保持这样的写法。
处理XML,使用正则表达式代替DOM或者SAX
HASH算法:md4, md5, crc32, crc32b, sha1比其他的散列速度都要快
使用spl_autoload_extensions时,文件扩展名请按最常用–&最不常用的顺序,尽量排除掉压根不用的。
使用fsockopen或fopen时,使用IP地址代替域名;如果只有一个域名,使用gethostbyname()可以获取IP地址。使用cURL速度会更快。
但凡可能,用静态内容代替动态内容。
如果您觉得本站的内容对您有所帮助,您可以扫描下面的二维码小额支付请我喝杯茶,感谢!
承诺:凡打赏捐助的朋友,留言备注自己的邮箱,在打赏捐助时间点的6个月内,本站会每周邮件推送原创专业技术博文,供大家学习和参考!
一、执行系统外部命令 system() 输出并返回最后一行shell结果。 exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。 passt...
Redis介绍 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Bootstrap后台主题UI框架 在线浏览地址:http://back. 源码包含完整的技术文档、注释、js、CSS、相关图片等。 特点:适合各类主流浏览...
1.作用 使用crontab命令可以修改crontab配置文件,然后该配置由cron公用程序在适当的时间执行,该命令使用权限是所有用户。 2.格式 crontab [-u user...
当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。
df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
du可以查看文件及文件夹的大小。
邮箱(非公开)*
All fields marked (*) are required
PHPthinking致力于成为PHP开发者学习交流平台,从服务器使用,数据模型设计,框架优化,到业务逻辑,页面美化等多方面专业知识分享,为PHP研究做出一份努力。
官网邮箱:
QQ交流群:会员登录 新用户
初到至成科技?赶紧创建一个帐户,
建立您的网上业务,开启您的互联网之旅!
售前免费咨询热线:029-89390727网站开发3个方面浅谈程序优化
时间: 
来源:至成科技 
作者:SEOR 
点击次数:1992 
当初在学校实验室的时候,常常写一个算法,让程序跑着四处去晃荡一下回来,结果也就出来了。可工作后,算法效率似乎重要多了,毕竟得真枪实弹放到产品中,卖给客户的;很多时候,还要搞到嵌入式设备里实时地跑,这么一来真是压力山大了~~~。这期间,对于程序优化也算略知皮毛,下面就针对这个问题讲讲。
首先说明一下,这里说的程序优化是指程序效率的优化。一般来说,程序优化主要是以下三个步骤:
1.算法优化
2.代码优化
3.指令优化
算法上的优化是必须首要考虑的,也是最重要的一步。一般我们需要分析算法的时间复杂度,即处理时间与输入数据规模的一个量级关系,一个优秀的算法可以将算法复杂度降低若干量级,那么同样的实现,其平均耗时一般会比其他复杂度高的算法少(这里不代表任意输入都更快)。
比如说排序算法,快速排序的时间复杂度为O(nlogn),而插入排序的时间复杂度为O(n*n),那么在统计意义下,快速排序会比插入排序快,而且随着输入序列长度n的增加,两者耗时相差会越来越大。但是,假如输入数据本身就已经是升序(或降序),那么实际运行下来,快速排序会更慢。
因此,实现同样的功能,优先选择时间复杂度低的算法。比如对图像进行二维可分的高斯卷积,图像尺寸为MxN,卷积核尺寸为PxQ,那么
直接按卷积的定义计算,时间复杂度为O(MNPQ)
如果使用2个一维卷积计算,则时间复杂度为O(MN(P+Q))
使用2个一位卷积+FFT来实现,时间复杂度为O(MNlogMN)
如果采用高斯滤波的递归实现,时间复杂度为O(MN)(参见paper:Recursive implementation of the Gaussian filter,源码在GIMP中有)
很显然,上面4种算法的效率是逐步提高的。一般情况下,自然会选择最后一种来实现。
还有一种情况,算法本身比较复杂,其时间复杂度难以降低,而其效率又不满足要求。这个时候就需要自己好好地理解算法,做些修改了。一种是保持算法效果来提升效率,另一种是舍弃部分效果来换取一定的效率,具体做法得根据实际情况操作。
代码优化一般需要与算法优化同步进行,代码优化主要是涉及到具体的编码技巧。同样的算法与功能,不同的写法也可能让程序效率差异巨大。一般而言,代码优化主要是针对循环结构进行分析处理,目前想到的几条原则是:
a.避免循环内部的乘(除)法以及冗余计算
这一原则是能把运算放在循环外的尽量提出去放在外部,循环内部不必要的乘除法可使用加法来替代等。如下面的例子,灰度图像数据存在BYTE Img[MxN]的一个数组中,对其子块  (R1至R2行,C1到C2列)像素灰度求和,简单粗暴的写法是:
1 int sum = 0;
2 for(int i = R1; i & R2; i++)
for(int j = C1; j & C2; j++)
sum += Image[i * N + j];
但另一种写法:
1 int sum = 0;
2 BYTE *pTemp = Image + R1 * N;
3 for(int i = R1; i & R2; i++, pTemp += N)
for(int j = C1; j & C2; j++)
sum += pTemp[j];
可以分析一下两种写法的运算次数,假设R=R2-R1,C=C2-C1,前面一种写法i++执行了R次,j++和sum+=…这句执行了RC次,则总执行次数为3RC+R次加法,RC次乘法;同  样地可以分析后面一种写法执行了2RC+2R+1次加法,1次乘法。性能孰好孰坏显然可知。
b.避免循环内部有过多依赖和跳转,使cpu能流水起来
关于CPU流水线技术可google/baidu,循环结构内部计算或逻辑过于复杂,将导致cpu不能流水,那这个循环就相当于拆成了n段重复代码的效率。
另外ii值是衡量循环结构的一个重要指标,ii值是指执行完1次循环所需的指令数,ii值越小,程序执行耗时越短。下图是关于cpu流水的简单示意图:
简单而不严谨地说,cpu流水技术可以使得循环在一定程度上并行,即上次循环未完成时即可处理本次循环,这样总耗时自然也会降低。
先看下面一段代码:
1 for(int i = 0; i & N; i++)
if(i & 100) a[i] += 5;
else if(i & 200) a[i] += 10;
else a[i] += 20;
这段代码实现的功能很简单,对数组a的不同元素累加一个不同的值,但是在循环内部有3个分支需要每次判断,效率太低,有可能不能流水;可以改写为3个循环,这样循环内部就不  用进行判断,这样虽然代码量增多了,但当数组规模很大(N很大)时,其效率能有相当的优势。改写的代码为:
1 for(int i = 0; i & 100; i++)
a[i] += 5;
5 for(int i = 100; i & 200; i++)
a[i] += 10;
9 for(int i = 200; i & N; i++)
a[i] += 20;
关于循环内部的依赖,见如下一段程序:
1 for(int i = 0; i & N; i++)
int x = f(a[i]);
int y = g(x);
int z = h(x,y);
其中f,g,h都是一个函数,可以看到这段代码中x依赖于a[i],y依赖于x,z依赖于xy,每一步计算都需要等前面的都计算完成才能进行,这样对cpu的流水结构也是相当不利的,尽  量避免此类写法。另外C语言中的restrict关键字可以修饰指针变量,即告诉编译器该指针指向的内存只有其自己会修改,这样编译器优化时就可以无所顾忌,但目前VC的编译器似乎不支  持该关键字,而在DSP上,当初使用restrict后,某些循环的效率可提升90%。
定点化的思想是将浮点运算转换为整型运算,目前在PC上我个人感觉差别还不算大,但在很多性能一般的DSP上,其作用也不可小觑。定点化的做法是将数据乘上一个很大的数后,将  所有运算转换为整数计算。例如某个乘法我只关心小数点后3位,那把数据都乘上10000后,进行整型运算的结果也就满足所需的精度了。
d.以空间换时间
空间换时间最经典的就是查表法了,某些计算相当耗时,但其自变量的值域是比较有限的,这样的情况可以预先计算好每个自变量对应的函数值,存在一个表格中,每次根据自变量的  值去索引对应的函数值即可。如下例:
1 //直接计算
2 for(int i = 0 ; i & N; i++)
double z = sin(a[i]);
7 //查表计算
8 double aSinTable[360] = {0, ..., 1,...,0,...,-1,...,0};
9 for(int i = 0 ; i & N; i++)
double z = aSinTable[a[i]];
后面的查表法需要额外耗一个数组double aSinTable[360]的空间,但其运行效率却快了很多很多。
e.预分配内存
预分配内存主要是针对需要循环处理数据的情况的。比如视频处理,每帧图像的处理都需要一定的缓存,如果每帧申请释放,则势必会降低算法效率,如下所示:
1 //处理一帧
2 void Process(BYTE *pimg)
9 //循环处理一个视频
10 for(int i = 0; i & N; i++)
BYTE *pimg = readimage();
Process(pimg);
1 //处理一帧
2 void Process(BYTE *pimg, BYTE *pBuffer)
7 //循环处理一个视频
8 malloc pBuffer
9 for(int i = 0; i & N; i++)
BYTE *pimg = readimage();
Process(pimg, pBuffer);
前一段代码在每帧处理都malloc和free,而后一段代码则是有上层传入缓存,这样内部就不需每次申请和释放了。当然上面只是一个简单说明,实际情况会比这复杂得多,但整体思想  是一致的。
对于经过前面算法和代码优化的程序,一般其效率已经比较不错了。对于某些特殊要求,还需要进一步降低程序耗时,那么指令优化就该上场了。指令优化一般是使用特定的指令集,可快速实现某些运算,同时指令优化的另一个核心思想是打包运算。目前PC上intel指令集有MMX,SSE和SSE2/3/4等,DSP则需要跟具体的型号相关,不同型号支持不同的指令集。intel指令集需要intel编译器才能编译,安装icc后,其中有帮助文档,有所有指令的详细说明。
例如MMX里的指令&__m64 _mm_add_pi8(__m64 m1, __m64 m2),是将m1和m2中8个8bit的数对应相加,结果就存在返回值对应的比特段中。假设2个N数组相加,一般需要执行N个加法指令,但使用上述指令只需执行N/8个指令,因为其1个指令能处理8个数据。
实现求2个BYTE数组的均值,即z[i]=(x[i]+y[i])/2,直接求均值和使用MMX指令实现2种方法如下程序所示:
1 #define N 800
2 BYTE x[N],Y[N], Z[N];
3 inital x,y;...
4 //直接求均值
5 for(int i = 0; i & N; i++)
z[i] = (x[i] + y[i]) && 1;
10 //使用MMX指令求均值,这里N为8的整数倍,不考虑剩余数据处理
11 __m64 m64X, m64Y, m64Z;
12 for(int i = 0; i & N; i+=8)
m64X = *(__m64 *)(x + i);
m64Y = *(__m64 *)(y + i);
m64Z = _mm_avg_pu8(m64X, m64Y);
*(__m64 *)(x + i) = m64Z;
使用指令优化需要注意的问题有:
a.关于值域,比如2个8bit数相加,其值可能会溢出;若能保证其不溢出,则可使用一次处理8个数据,否则,必须降低性能,使用其他指令一次处理4个数据了;
b.剩余数据,使用打包处理的数据一般都是4、8或16的整数倍,若待处理数据长度不是其单次处理数据个数的整数倍,剩余数据需单独处理;
补充——如何定位程序热点
程序热点是指程序中最耗时的部分,一般程序优化工作都是优先去优化热点部分,那么如何来定位程序热点呢?
一般而言,主要有2种方法,一种是通过观察与分析,通过分析算法,自然能知道程序热点;另一方面,观察代码结构,一般具有最大循环的地方就是热点,这也是前面那些优化手段都针对循环结构的原因。
另一种方法就是利用工具来找程序热点。x86下可以使用vtune来定位热点,DSP下可使用ccs的profile功能定位出耗时的函数,更近一步地,通过查看编译保留的asm文件,可具体分析每个循环结构情况,了解到该循环是否能流水,循环ii值,以及制约循环ii值是由于变量的依赖还是运算量等详细信息,从而进行有针对性的优化。由于Vtune刚给卸掉,没法截图;下图是CCS编译生成的一个asm文件中一个循环的截图:
最后提一点,某些代码使用Intel编译器编译可以比vc编译器编译出的程序快很多,我遇到过最快的可相差10倍。对于gcc编译后的效率,目前还没测试过。
上一篇:下一篇:昵称:我要评论全部评论:0条
相关阅读:
版权所有: 西安至成信息科技有限公司
本文链接: 快捷入口销售咨询热线029-029-029-029-029-029-扫描左侧二维码关注至成微信公众号Copyright & 2012- All Rights Reserved
西安至成信息科技有限公司
联系地址:西安市未央区凤城三路凤凰新城3号楼12层C室&&邮政编码:710016&&刘华宁累计服务:932 天累计客户:261 个029-负责+89热情+79友好+94敬业+79守时+73专业+73}

我要回帖

更多关于 百度c优化du88棒 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信