前端时间一直关注ria对页面的渲染优化,最近应用服务器压力比较大,最终的感觉,代码的质量其实对整个系统的影响不是很大.
源服务器定义:架构基于nginx+squid+apache,apache及源服务器,通俗的称为页面生产机。
经过观察内存足够,I/O负载也不高,但是cpu负载比较高,more/proc/cpuinfo单颗cpu3G,一台服务器总共有4颗cpu,高峰时期经常负载达到10以上.
系统应用软件优化:
源服务器使用的是apache1.3,apache1.3比较稳定,而且处理速度比较快.考虑到源服务器并非真正的
动态程序,使用apache1.3是比较慎重的.
每台服务器的请求高峰的时候也就50次/秒
我觉得以下配置就足够
MinSpareServers5
MaxSpareServers10
MaxClients1024
MaxRequestsPerChild500
KeepAliveOff
预派生的进程不用太多,纯粹浪费内存
服务架构优化
1:源服务器的程序处理
(1):非法请求,比如外部攻击或者非源服务器处理程序的请求.
(2):rss程序,rss订阅一般都发送no-cacheheader头,所以有大量对源服务器的rss请求,从而影响其它程序的处理.
(3):机器人抓取
对于上述的一些请求应该杜绝在源服务器上处理或者剥离,通过七层的nginx将这些请求进行转发.这样也能保证较高的squidcache命中率
2:对于squld,我个人觉得应该禁止no-cache的请求,当然维护的时候比较麻烦.
应用程序优化
1:xdebug
2:apc
2009年5月4日星期一
关于程序优化的八卦
本文出自:
(把八卦和文章重新分了一下类,准备围绕自己的心得写个编程珠玑番外篇,这个算第三篇吧)
代码大全(CodeComplete)是一本很好的书.我建议像我这样写的程序总行数不超过50万的程序员应该买一本放在案头(当然代码大全不如SoftwareTools这本书好,这个我以后有机会写文章细谈)如果你天天编程序,我建议你买一本.如果你已经有了代码大全,我诚心建议你赶快翻开此书,撕去第26章.因为代码大全的其他章节可以让你成为优秀的程序员,唯独第26章,读了之后立即从优秀程序员变成最差的程序员.
为啥?因为第26章讲的,都是怎么调节代码使得代码跑得更加快的技巧,而这些技巧,几乎都是让一个好程序变成差程序的技巧,是教你不管三七二十一先对程序局部优化的技巧.而局部优化是让程序变得糟糕的最主要的一个原因.用高爷爷的话说,提前优化是万恶之源(Prematureoptimizationistherootofallevil).这些技巧,就是带你去万恶之源的捷径.
代码优化究竟是什么洪水猛兽,又究竟有多少伟大的程序员因为代码优化声名扫地,请看本期关于代码优化的八卦.
话说当年在贝尔实验室.一群工程师围着一个巨慢无比的小型机发呆.为啥呢,因为他们觉得这个机器太慢了.什么超频,液氮等技术都用了,这个小型机还是比不上实验室新买的一台桌上计算机.这些家伙很不爽,于是准备去优化这个机器上的操作系统.他们也不管三七二十一,就去看究竟那个进程占用CPU时间最长,然后就集中优化这个进程.他们希望这样把每个程序都优化到特别高效,机器就相对快了.于是,他们终于捕捉到一个平时居然占50%CPU的进程,而且这个进程只有大约20K的代码.他们高兴死了,立即挽起袖子敲键盘,愣是把一个20K的C语言变成了快5倍的汇编.这时候他们把此进程放到机器上这么一实验,发现居然整体效率没变化.百思不得其解的情况下他们去请教其他牛人.那个牛人就说了一句话:你们优化的进程,叫做SystemIdle.
所以说.优化这东西,一定要有一个全局的思路,否则就是纯粹的无用功,有时候还是负功.在编程珠玑II第一章,JonBentley就着重提醒了代码profiling的重要性.说到profiling这个词,就不能不再次提到万众敬仰的高爷爷.高爷爷在1970年的暑假,通过捡Stanford大学机房扔出来的垃圾(其实是含有程序的磁带),写出了一篇震古烁今的论文AnempiricalstudyofFORTRANprograms(FORTRAN程序的实证分析).除了抱怨写程序的人不看他的TAoCP之外(因为一个程序用了被高爷爷定性为史上最差的随机数发生器算法,有兴趣的可阅读TAoCPvol2),这篇论文主要说了三个划时代的东西:
1.对程序进行profile是每个编程系统的居家旅行必备.
2.在没IO操作的情况下,一个程序中4%的代码占用了超过50%的运行时间.
3.97%的情况下对程序进行提前优化是万恶之源.
这三个道理,用大白话说,就是:1程序都存在热点,有优化的空间.2.但是97%的情况下程序员优化的都是错的地方,反而把程序优化糟了.3.想要做优化,第一步就要先知道程序在什么地方耗时间而不是靠猜.
说到热点,顺带拐八卦一下Java的速度.Java1.5的虚拟机的关键技术,就是叫做Hotspot(热点).传统上,大家都认为Java比C要慢.其实不然.Jython的作者JimHugunin就曾经说过,其实两者差别不大(http://hugunin.net/story_of_jython.html).也有一些其他的测评说,Java比C要快.原因就在于,Java虚拟机能够找到热点,对热点专门做优化.而C程序编译好了,即使有热点,也只能靠CPU去优化了.Java的优化比CPU要深且更全局.
言归正传.关于FORTRAN的profile的传统被继承了下来,基本上现在任何的过程式主流编程语言都支持profiling工具.关于profile怎么做的问题,等我有空了好好写文章介绍.(因为我发现,除了编程珠玑,没有一本书提到过).
做程序优化的八卦就太多了,说一个BeautifulCode上的吧.话说世界上做线性代数的库叫做BLAS,基本上是工业标准.因为线性代数运算太重要了,所以各大处理器厂商都有BLAS的实现.Intel的叫MKL,AMD的叫ACML.矩阵乘法实现的好坏,直接决定了处理器的性能测试的分数(因为现代测处理器的速度的程序,比如LAPACK指数,基本上都是用BLAS里的矩阵乘法做基准).去年nVIDIA高调宣传自己的CUDA系统比CPU厂商快10倍到100倍,借此打开了GPU计算的大门(令人发指的达到500GFlops,Intel最新的只有50GFlops).其中CUDA可以理解为是BLAS在nVIDIA平台上的实现.自从nVidia推出CUDA以后,俨然不把intel这些厂商放在眼里,心想,小样,你们还是做通用处理器吧,浮点乘法这些高级的东西,还是放在显卡上比较好.nVidia和IBM/SONY的阴谋很不小呢.要是浮点计算比Intel快这么一两个数量级,以后世界上前五百名超级计算机就全部变成什么用光纤网连起来的PS3机群,nVidia显卡机群之类的.人家外行见了计算机科学家肯定要问:你们搞高性能计算机究竟是搞计算还是打网络游戏啊??
还是言归正传(我怎么老走题?),简要的说一下BLAS优化.单处理器上对BLAS的优化主要体现在对cache的高效使用.矩阵乘法中,如果矩阵都是按照行存储,则在A*B中,对B的访问是按列的.假设B一行有N个元素,那么在存储器中,两个同列不同行的元素所在的存储单元相差N.因此,对B的访问并不是局部化的.因为访问不局部化,所以每次乘法,都需要从内存中调一个cache单元到CPU.这个极大的降低了处理器的执行速度.因此,矩阵乘法的优化的核心,在于局部化B的访问.反过来,如果矩阵按照列存储,则要局部化对A的访问.关于怎样局部化访问还能获得正确的乘法,BeautifulCode一书的第14章有非常好的讲解,我就不废话了.总之,矩阵乘法局部化的好坏,取决于一个机器的cache的大小.
多处理器和向量处理器就又不一样了.要想利用好,就要把计算任务平均的独立的分到不同的处理器上.所以,在这里,优化就变成了分解成若干的小问题.因此,分治算法成了主流.具体矩阵乘法怎么分块,大学数学都讲了,我就不废话了.事实上,之所以nVidia能和Intel干,就是因为显卡上令人发指的有64个计算核心,而Intel最牛X的才4个.那为啥Intel自己不多做几个核心呢?因为Intel自己把自己带沟里去了Intel处理器太复杂支持的功能太多了,一块硅片上根本放不下很多核心.而nVidia一直就是专用处理器,每个核心功能简单,可以做到很小.
(把八卦和文章重新分了一下类,准备围绕自己的心得写个编程珠玑番外篇,这个算第三篇吧)
代码大全(CodeComplete)是一本很好的书.我建议像我这样写的程序总行数不超过50万的程序员应该买一本放在案头(当然代码大全不如SoftwareTools这本书好,这个我以后有机会写文章细谈)如果你天天编程序,我建议你买一本.如果你已经有了代码大全,我诚心建议你赶快翻开此书,撕去第26章.因为代码大全的其他章节可以让你成为优秀的程序员,唯独第26章,读了之后立即从优秀程序员变成最差的程序员.
为啥?因为第26章讲的,都是怎么调节代码使得代码跑得更加快的技巧,而这些技巧,几乎都是让一个好程序变成差程序的技巧,是教你不管三七二十一先对程序局部优化的技巧.而局部优化是让程序变得糟糕的最主要的一个原因.用高爷爷的话说,提前优化是万恶之源(Prematureoptimizationistherootofallevil).这些技巧,就是带你去万恶之源的捷径.
代码优化究竟是什么洪水猛兽,又究竟有多少伟大的程序员因为代码优化声名扫地,请看本期关于代码优化的八卦.
话说当年在贝尔实验室.一群工程师围着一个巨慢无比的小型机发呆.为啥呢,因为他们觉得这个机器太慢了.什么超频,液氮等技术都用了,这个小型机还是比不上实验室新买的一台桌上计算机.这些家伙很不爽,于是准备去优化这个机器上的操作系统.他们也不管三七二十一,就去看究竟那个进程占用CPU时间最长,然后就集中优化这个进程.他们希望这样把每个程序都优化到特别高效,机器就相对快了.于是,他们终于捕捉到一个平时居然占50%CPU的进程,而且这个进程只有大约20K的代码.他们高兴死了,立即挽起袖子敲键盘,愣是把一个20K的C语言变成了快5倍的汇编.这时候他们把此进程放到机器上这么一实验,发现居然整体效率没变化.百思不得其解的情况下他们去请教其他牛人.那个牛人就说了一句话:你们优化的进程,叫做SystemIdle.
所以说.优化这东西,一定要有一个全局的思路,否则就是纯粹的无用功,有时候还是负功.在编程珠玑II第一章,JonBentley就着重提醒了代码profiling的重要性.说到profiling这个词,就不能不再次提到万众敬仰的高爷爷.高爷爷在1970年的暑假,通过捡Stanford大学机房扔出来的垃圾(其实是含有程序的磁带),写出了一篇震古烁今的论文AnempiricalstudyofFORTRANprograms(FORTRAN程序的实证分析).除了抱怨写程序的人不看他的TAoCP之外(因为一个程序用了被高爷爷定性为史上最差的随机数发生器算法,有兴趣的可阅读TAoCPvol2),这篇论文主要说了三个划时代的东西:
1.对程序进行profile是每个编程系统的居家旅行必备.
2.在没IO操作的情况下,一个程序中4%的代码占用了超过50%的运行时间.
3.97%的情况下对程序进行提前优化是万恶之源.
这三个道理,用大白话说,就是:1程序都存在热点,有优化的空间.2.但是97%的情况下程序员优化的都是错的地方,反而把程序优化糟了.3.想要做优化,第一步就要先知道程序在什么地方耗时间而不是靠猜.
说到热点,顺带拐八卦一下Java的速度.Java1.5的虚拟机的关键技术,就是叫做Hotspot(热点).传统上,大家都认为Java比C要慢.其实不然.Jython的作者JimHugunin就曾经说过,其实两者差别不大(http://hugunin.net/story_of_jython.html).也有一些其他的测评说,Java比C要快.原因就在于,Java虚拟机能够找到热点,对热点专门做优化.而C程序编译好了,即使有热点,也只能靠CPU去优化了.Java的优化比CPU要深且更全局.
言归正传.关于FORTRAN的profile的传统被继承了下来,基本上现在任何的过程式主流编程语言都支持profiling工具.关于profile怎么做的问题,等我有空了好好写文章介绍.(因为我发现,除了编程珠玑,没有一本书提到过).
做程序优化的八卦就太多了,说一个BeautifulCode上的吧.话说世界上做线性代数的库叫做BLAS,基本上是工业标准.因为线性代数运算太重要了,所以各大处理器厂商都有BLAS的实现.Intel的叫MKL,AMD的叫ACML.矩阵乘法实现的好坏,直接决定了处理器的性能测试的分数(因为现代测处理器的速度的程序,比如LAPACK指数,基本上都是用BLAS里的矩阵乘法做基准).去年nVIDIA高调宣传自己的CUDA系统比CPU厂商快10倍到100倍,借此打开了GPU计算的大门(令人发指的达到500GFlops,Intel最新的只有50GFlops).其中CUDA可以理解为是BLAS在nVIDIA平台上的实现.自从nVidia推出CUDA以后,俨然不把intel这些厂商放在眼里,心想,小样,你们还是做通用处理器吧,浮点乘法这些高级的东西,还是放在显卡上比较好.nVidia和IBM/SONY的阴谋很不小呢.要是浮点计算比Intel快这么一两个数量级,以后世界上前五百名超级计算机就全部变成什么用光纤网连起来的PS3机群,nVidia显卡机群之类的.人家外行见了计算机科学家肯定要问:你们搞高性能计算机究竟是搞计算还是打网络游戏啊??
还是言归正传(我怎么老走题?),简要的说一下BLAS优化.单处理器上对BLAS的优化主要体现在对cache的高效使用.矩阵乘法中,如果矩阵都是按照行存储,则在A*B中,对B的访问是按列的.假设B一行有N个元素,那么在存储器中,两个同列不同行的元素所在的存储单元相差N.因此,对B的访问并不是局部化的.因为访问不局部化,所以每次乘法,都需要从内存中调一个cache单元到CPU.这个极大的降低了处理器的执行速度.因此,矩阵乘法的优化的核心,在于局部化B的访问.反过来,如果矩阵按照列存储,则要局部化对A的访问.关于怎样局部化访问还能获得正确的乘法,BeautifulCode一书的第14章有非常好的讲解,我就不废话了.总之,矩阵乘法局部化的好坏,取决于一个机器的cache的大小.
多处理器和向量处理器就又不一样了.要想利用好,就要把计算任务平均的独立的分到不同的处理器上.所以,在这里,优化就变成了分解成若干的小问题.因此,分治算法成了主流.具体矩阵乘法怎么分块,大学数学都讲了,我就不废话了.事实上,之所以nVidia能和Intel干,就是因为显卡上令人发指的有64个计算核心,而Intel最牛X的才4个.那为啥Intel自己不多做几个核心呢?因为Intel自己把自己带沟里去了Intel处理器太复杂支持的功能太多了,一块硅片上根本放不下很多核心.而nVidia一直就是专用处理器,每个核心功能简单,可以做到很小.
青少年信息学奥林匹克初级竞赛辅导
【开本】:16开
【ISBN】:9787310027026
编辑推荐内容简介目录本书为修订版,更加突出了算法思想,增加了常用算法、程序优化以及程序调试与测试等内容,其中算法部分涵盖了中学数学课程中算法与程序设计课程的相关内容。本书可以作为小学高年级学生以及初中学生参加青少年信息学奥林匹克竞赛活动(普及组)的培训与辅导用书,同时也可以作为中学生学习数学与信息技术课的参考用书。由特级教师方文祺老师主编的(《青少年信息学奥林匹克》丛书,经
过多年的使用,在吸收了老师们近几年来在竞赛辅导经验的基础上,进行
了全面修订。
丛书修订后仍然分《青少年信息学奥林匹克——QuickBASIC编程基础
》与(《青少年信息学奥林匹克——初级竞赛辅导》两册出版。
《青少年信息学奥林匹克——QuickBASIC编程基础》修订版删除了有
关计算机基础知识部分的内容,增加了有关QuickBASIC集成环境操作以及
数据文件的内容。
《青少年信息学奥林匹克——初级竞赛辅导》修订版则更加突出了算
法思想,增加了常用算法、程序优化以及程序调试与测试等内容,其中算
法部分涵盖了中学数学课程中算法与程序设计课程的相关内容。
本丛书可以作为小学高年级学生以及初中学生参加青少年信息学奥林
匹克竞赛活动(普及组)的培训与辅导用书,同时也可以作为中学生学习
数学与信息技术课的参考用书。再版前言
前言
第一章基本算法举例
1.1程序设计基础
1.2解析法
1.3穷举法
1.4构造法
1.5模拟与随机模拟
1.6递推与迭代
1.7递归
1.8排序与查找
第二章基础知识类型题例解
2.1计算机基本知识
2.2计算机中数的表示
2.3汉字与编码基础知识
2.4计算机软件知识
2.5操作系统基本知识
2.6DOS基本操作
2.7网络基础知识
2.8信息安全基础知识
2.9程序设计基础知识
习题
第三章分析程序类型题例解
3.1循环与分支结构程序的分析
3.2使用数组程序的分析
3.3调用过程程序的分析
3.4完善程序类型题的分析
习题
第四章编程初级类型题例解
4.1有趣的自然数
4.2字符图形
4.3字符串处理
4.4数制及其转换
4.5高精度计算
4.6组合数学题例
4.7其他
习题
第五章搜索算法初步
5.1回溯
5.2程序的优化
习题
第六章程序的调试与测试
6.1程序的静态调试
6.2程序的动态调试
6.3程序动态调试实例
6.4程序测试
6.5生成可执行文件
附录一练习题与习题参考答案
附录二全国青少年信息学奥林匹克联赛天津市(小学组)试题选
【ISBN】:9787310027026
编辑推荐内容简介目录本书为修订版,更加突出了算法思想,增加了常用算法、程序优化以及程序调试与测试等内容,其中算法部分涵盖了中学数学课程中算法与程序设计课程的相关内容。本书可以作为小学高年级学生以及初中学生参加青少年信息学奥林匹克竞赛活动(普及组)的培训与辅导用书,同时也可以作为中学生学习数学与信息技术课的参考用书。由特级教师方文祺老师主编的(《青少年信息学奥林匹克》丛书,经
过多年的使用,在吸收了老师们近几年来在竞赛辅导经验的基础上,进行
了全面修订。
丛书修订后仍然分《青少年信息学奥林匹克——QuickBASIC编程基础
》与(《青少年信息学奥林匹克——初级竞赛辅导》两册出版。
《青少年信息学奥林匹克——QuickBASIC编程基础》修订版删除了有
关计算机基础知识部分的内容,增加了有关QuickBASIC集成环境操作以及
数据文件的内容。
《青少年信息学奥林匹克——初级竞赛辅导》修订版则更加突出了算
法思想,增加了常用算法、程序优化以及程序调试与测试等内容,其中算
法部分涵盖了中学数学课程中算法与程序设计课程的相关内容。
本丛书可以作为小学高年级学生以及初中学生参加青少年信息学奥林
匹克竞赛活动(普及组)的培训与辅导用书,同时也可以作为中学生学习
数学与信息技术课的参考用书。再版前言
前言
第一章基本算法举例
1.1程序设计基础
1.2解析法
1.3穷举法
1.4构造法
1.5模拟与随机模拟
1.6递推与迭代
1.7递归
1.8排序与查找
第二章基础知识类型题例解
2.1计算机基本知识
2.2计算机中数的表示
2.3汉字与编码基础知识
2.4计算机软件知识
2.5操作系统基本知识
2.6DOS基本操作
2.7网络基础知识
2.8信息安全基础知识
2.9程序设计基础知识
习题
第三章分析程序类型题例解
3.1循环与分支结构程序的分析
3.2使用数组程序的分析
3.3调用过程程序的分析
3.4完善程序类型题的分析
习题
第四章编程初级类型题例解
4.1有趣的自然数
4.2字符图形
4.3字符串处理
4.4数制及其转换
4.5高精度计算
4.6组合数学题例
4.7其他
习题
第五章搜索算法初步
5.1回溯
5.2程序的优化
习题
第六章程序的调试与测试
6.1程序的静态调试
6.2程序的动态调试
6.3程序动态调试实例
6.4程序测试
6.5生成可执行文件
附录一练习题与习题参考答案
附录二全国青少年信息学奥林匹克联赛天津市(小学组)试题选
视频聊天换程序,优化有没影响
SEO大学生(可申请达人)
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-11楼大中小发表于2009-2-1922:10视频聊天换程序,优化有没影响打算对[url]www.168vip.com[/url]视频聊天网站进行升级,然后换套厉害的程序。
这样对于收录的影响多大,如何保留以前收录的文章。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
SEO大学生(可申请达人)
积分893威望10推广0达文1解答183注册时间2008-12-10最后登录2009-5-42楼大中小发表于2009-2-1922:49目录形式UID12843帖子401在线时间42小时注册时间2008-12-10最后登录2009-5-4
TOP
SEO大学生(可申请达人)
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-13楼大中小发表于2009-2-1922:55回复2楼uuimei的帖子什么是目录形式,请解释清楚点,谢谢。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
886
SEOWHY资深版主
积分9579威望279推广51达文3解答1610性别男来自西安注册时间2008-4-30最后登录2009-5-4
4楼大中小发表于2009-2-1923:43有影响的,换了程序页面的URL也会变化的!需要重新收录!承接网站SEO项目,擅长百度,联系QQ:15085557
UID453帖子3394性别男来自西安在线时间656小时注册时间2008-4-30最后登录2009-5-4
TOP
SEO大学生(可申请达人)
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-15楼大中小发表于2009-2-1923:50回复4楼hoke的帖子请问关键字排名是否会消失呢。多谢
换了程序之后如何让收录的文章可以打开。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
886
SEOWHY资深版主
积分9579威望279推广51达文3解答1610性别男来自西安注册时间2008-4-30最后登录2009-5-4
6楼大中小发表于2009-2-1923:53回复5楼cljwgh的帖子关键词应该会有影响的,还要看你怎么做了!
换了程序之后如何让收录的文章可以打开。这个是你程序上的事了!!承接网站SEO项目,擅长百度,联系QQ:15085557
UID453帖子3394性别男来自西安在线时间656小时注册时间2008-4-30最后登录2009-5-4
TOP
binbin
SEOWHY达人(已入SEO族)
积分4021威望6推广0达文0解答362性别男注册时间2008-7-15最后登录2009-4-277楼大中小发表于2009-2-2009:27关键是你的程序没有问题重新收录也会很快的UID4144帖子1349性别男在线时间57小时注册时间2008-7-15最后登录2009-4-27
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-11楼大中小发表于2009-2-1922:10视频聊天换程序,优化有没影响打算对[url]www.168vip.com[/url]视频聊天网站进行升级,然后换套厉害的程序。
这样对于收录的影响多大,如何保留以前收录的文章。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
SEO大学生(可申请达人)
积分893威望10推广0达文1解答183注册时间2008-12-10最后登录2009-5-42楼大中小发表于2009-2-1922:49目录形式UID12843帖子401在线时间42小时注册时间2008-12-10最后登录2009-5-4
TOP
SEO大学生(可申请达人)
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-13楼大中小发表于2009-2-1922:55回复2楼uuimei的帖子什么是目录形式,请解释清楚点,谢谢。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
886
SEOWHY资深版主
积分9579威望279推广51达文3解答1610性别男来自西安注册时间2008-4-30最后登录2009-5-4
4楼大中小发表于2009-2-1923:43有影响的,换了程序页面的URL也会变化的!需要重新收录!承接网站SEO项目,擅长百度,联系QQ:15085557
UID453帖子3394性别男来自西安在线时间656小时注册时间2008-4-30最后登录2009-5-4
TOP
SEO大学生(可申请达人)
积分886威望3推广0达文0解答268注册时间2008-9-26最后登录2009-5-15楼大中小发表于2009-2-1923:50回复4楼hoke的帖子请问关键字排名是否会消失呢。多谢
换了程序之后如何让收录的文章可以打开。UID8039帖子400在线时间72小时注册时间2008-9-26最后登录2009-5-1
TOP
886
SEOWHY资深版主
积分9579威望279推广51达文3解答1610性别男来自西安注册时间2008-4-30最后登录2009-5-4
6楼大中小发表于2009-2-1923:53回复5楼cljwgh的帖子关键词应该会有影响的,还要看你怎么做了!
换了程序之后如何让收录的文章可以打开。这个是你程序上的事了!!承接网站SEO项目,擅长百度,联系QQ:15085557
UID453帖子3394性别男来自西安在线时间656小时注册时间2008-4-30最后登录2009-5-4
TOP
binbin
SEOWHY达人(已入SEO族)
积分4021威望6推广0达文0解答362性别男注册时间2008-7-15最后登录2009-4-277楼大中小发表于2009-2-2009:27关键是你的程序没有问题重新收录也会很快的UID4144帖子1349性别男在线时间57小时注册时间2008-7-15最后登录2009-4-27
J2ME中程序优化的十个小方法
本文主要是说明j2me平台上的特殊优化方法,与j2se重复的一些技巧就不再赘述了。
1.显示图象时确定好你的fps,最好先做几次小实验,这样能让你在显示效果和运行速度上有比较好的平衡。
2.GamaCanvas.getGraphics()每次都会产生一个全新的对象,但是对这些对象的操作都是对同一个graphics,所以还是只取一次供后面使用。
3.让多个对象使用同样的监听器,比如让主MIDlet类实现CommandListener和ItemStateListener接口。
4.考虑使用手机开发商提供的一些sdk,没人会比他们更了解他们手机,所以有些时候能显著提高速度,特别是图片,视频使用方面。
5.使用监视工具分析MIDlet的瓶颈,wtk和各个公司提供的开发包里都会有,可以找到程序的弱点。如果是在手机上,用timer测试你认为有可以的地方。
6.使用System.gc(),在无线程阻塞的情况下可以有效的缓解内存压力,但是有些公司不是太推荐使用(如nokia).sun的说法也是越低端的机子执行的越慢,总之,慎用吧。
JAVA手机网[www.cnjm.net]7.用固定的数组代替使用Vector。
8.图片的优化。考虑使用设备的规格,可能高分辨率的图片不一定显示的出来。
9.不用的对象赋值为null,为更快的回收
1.显示图象时确定好你的fps,最好先做几次小实验,这样能让你在显示效果和运行速度上有比较好的平衡。
2.GamaCanvas.getGraphics()每次都会产生一个全新的对象,但是对这些对象的操作都是对同一个graphics,所以还是只取一次供后面使用。
3.让多个对象使用同样的监听器,比如让主MIDlet类实现CommandListener和ItemStateListener接口。
4.考虑使用手机开发商提供的一些sdk,没人会比他们更了解他们手机,所以有些时候能显著提高速度,特别是图片,视频使用方面。
5.使用监视工具分析MIDlet的瓶颈,wtk和各个公司提供的开发包里都会有,可以找到程序的弱点。如果是在手机上,用timer测试你认为有可以的地方。
6.使用System.gc(),在无线程阻塞的情况下可以有效的缓解内存压力,但是有些公司不是太推荐使用(如nokia).sun的说法也是越低端的机子执行的越慢,总之,慎用吧。
JAVA手机网[www.cnjm.net]7.用固定的数组代替使用Vector。
8.图片的优化。考虑使用设备的规格,可能高分辨率的图片不一定显示的出来。
9.不用的对象赋值为null,为更快的回收
学C++不得不看的一篇文章转载
1.是我面试的具体经过
2.是由面试想到的
3.现今我应该做的。
当然这些话很大程度上是我个人的意见,不可能完全得到大家的赞同,所以在某些观点上如果哪位朋友觉得跟我的有很大出入,请不要介意,也不要对我攻击,就当我没有说过,欢迎和我联系共同探讨这些问题!我的EMAIL:wutao8@263.net
1.面试经过
大约在年前我接到了台湾瑞晟(Realtek)苏州公司的面试通知,通知我2月21日到苏州工业园区面试,接到面试后的几天我把一些专业课温习了一遍,特别是C++和数据结构,由于大学几年里,我一直专研这些方面,加上通过了高级程序员的考试,对于一些常用的算法我差不多也达到了烂熟于胸的地步,当时的感觉是如果问了我这些方面的问题我应该是没有问题的!
21日那天我被安排在4:30面试,由一位技术人员单独给我面试,在问了一些简单的问题之后他给我出了一道编程题目,题目是这样的:
(由于具体面试的题目比较烦琐,我将其核心思想提取出来分解成了两个独立的简单的问题,有可能问题分解的不当,请大家见谅,实际面试了一个的问题但比其复杂很多,而且涉及一些高等数学变换)
1)写一个函数计算当参数为n(n很大)时的值1-2+3-4+5-6+7......+n
哼,我的心里冷笑一声!没想到这么简单,我有点紧张的心情顿时放松起来!
于是很快我给出我的解法:
longfn(longn)
{
longtemp=0;
inti,flag=1;
if(n=0)
{
printf("error:nmust0);
exit(1);}
for(i=1;i=n;i++)
{
temp=temp+flag*i;
flag=(-1)*flag;
}
returntemp;
}
搞定!当我用期待的目光看着面试官的时候,他微笑着跟我说,执行结果肯定是没有问题!但当n很大的时候我这个程序执行效率很低,在嵌入式系统的开发中,程序的运行效率很重要,能让CPU少执行一条指令都是好的,他让我看看这个程序还有什么可以修改的地方,把程序优化一下!听了这些话,我的心情当时变的有点沉重,没想到他的要求很严格,之后我对程序进行了严格的分析,给出了改进了的方案!
longfn(longn)
{
longtemp=0;
intj=1,i=1,flag=1;
if(n=0)
{
printf("error:nmust0);
exit(1);
}
while(j=n)
{
temp=temp+i;
i=-i;
i0?i++:i--;
j++;
}
returntemp;
}
虽然我不敢保证我这个算法是最优的,但是比起上一个程序,我将所有涉及到乘法指令的语句改为执行加法指令,既达到要题目的要求而且运算时间上缩短了很多!而代价仅仅是增加了一个整型变量!但是我现在的信心已经受了一点打击,我将信将疑的看者面试官,他还是微笑着跟我说:“不错,这个程序确实在效率上有的很大的提高!”我心里一阵暗喜!但他接着说这个程序仍然不能达到他的要求,要我给出更优的方案!天啊!还有优化!我当时真的有点崩溃了,想了一会后,我请求他给出他的方案!然后他很爽快的给出了他的程序!
longfn(longn)
{
if(n=0)
{
printf("error:nmust0);
exit(1);
}
if(0==n%2)
return(n/2)*(-1);
else
return(n/2)*(-1)+n;
}
搞笑,当时我目瞪口呆,没想到他是这个意思,这么简单的代码我真的不会写吗,但是我为什么没有往那方面上想呢!他说的没有错,在n很大很大的时候这三个程序运行时间的差别简直是天壤之别!当我刚想开口说点什么的时候,他却先开口了:“不要认为CPU运算速度快就把所有的问题都推给它去做,程序员应该将代码优化再优化,我们自己能做的决不要让CPU做,因为CPU是为用户服务的,不是为我们程序员服务的!”多么精辟的语言,我已经不想再说什么了!接着是第二个问题:
2).他要求我用一种技巧性的编程方法来用一个函数实现两个函数的功能n为如:fn1(n)=n/2!+n/3!+n/4!+n/5!+n/6!
fn2(n)=n/5!+n/6!+n/7!+n/8!+n/9!现在用一个函数fn(intn,intflag)实现,当flag为0时,实现fn1功能,如果flag为1时实现fn2功能!他的要求还是效率,效率,效率!说实在话,如果我心情好的话我应该能给出一种比较好的算法,但我那时真的没有什么心思再想了,我在纸上胡乱画了一些诸如6!=6*5!的公式后直截了当的跟他说要他给出他的答案!面试官也没有说什么,给出了他的思路:
定义一个二维数组floatt[2][5]存入{{2!,3!,4!,5!,6!},{5!,6!,7!,8!,9!}}然后给出一个循环:
for(i=0;i6;i++)
{
temp=temp+n/t[flag];
}
最后得到计算值!呵呵,典型的空间换时间的算法!
这些总共花了50分钟的时间,还有十分钟我就跟他很随意的聊聊天,聊了一些编程以及生活的问题,那时的我已经很放松了,因为我知道这次面试结果只有一个:失败。5:30的时候面试官要我等通知,于是我离开了他们公司。这就是面试的整个经过!
2.由面试想到的
真的是很失败啊!我记得那天下好大的雨,气温也很低,我边走边想,从5:30一直走到7:30,全身都湿透了,又冷又饿,但是我只是一直走,脑子里面充满了疑惑,我也想让雨把自己淋醒!看到这里有些朋友可能觉得那些面试题目不算什么如果让自己做的话肯定能全部答对,我肯定相信你,因为我从未怀疑过中国程序员的能力,我认为中国有世界上最好的程序员,我也从未认为自己是高手,所以我做不出来不代表中国程序员比台湾或者别的地方的程序员差,所以我就从我的角度,我的所见所想来谈一些感想:
不错全世界都有优秀的程序员,中国也不例外,但是我疑惑的是:到底中国和台湾或者国外的优秀的程序员的比例到底是多少?台湾我不知道,中国100个程序员里有几个是优秀的呢?我根本算不上,从上面的表现就足以说明一切了!是1个?5个?10个?50个?这个数字我不敢乱猜,恐遭网友一顿痛骂,那么我们国内有多少人学习计算机呢?拿我们学校来说,计算机97级4个班,98级5个班,99级10个班,2000级17个班,人多了,老师怎么办?我们学校的做法是让研究生上课,然后呢?补考一抓一大把,大把大把的补考费落入了学校的口袋,还说现在的学生素质低!真是好笑,我都不知道学校这么做是为了什么,为国内培养大量的程序员吗?学生们能真正学到计算机知识吗?好了,我敢讲,在我们学校学习编程学生和优秀程序员(注意我指的是优秀,只会编几个糟烂程序的人算不上)的比例应该是100:0.1
在这种比例下虽然我们中国学习编程的人铺天盖地,但是想想有多少个人能真正为中国软件业发展作出贡献,有多少人能真正写出优秀的程序名扬海外!
我从学习编程以来,不管是自学还是老师指导,从来都是解决问题就好,编出程序来就行,我的疑惑是:我们有真正的强调过程序的效率,程序的质量吗?我们有仔细分析过我们写的东西,看看有没有可以改进的地方,看看有没有简单的方法来达到同样的目的呢?我问心自问,我发现,我从来没有对我写出来的程序进行过优化,最多就是进行详细的测试,然后Debug,但是这就足够了吗?这些天我偶尔发现我曾经写过的一个游戏,那是一年前我刚加入vcroad.net做为其中一员时候,感觉应该拿点东西出来,然后花了一个星期的时间写出来的!程序不算复杂,但是用到了不少数据结构的东西,也用到了一些精彩的算法,加上windows的界面和游戏的可玩性,写完后受到了不少好评,我当时真的很佩服自己!但是现在看呢:没有一句注释,好多丑陋的函数名比如:voidchushihua(),好多没有必要的变量,可以用简单语句完成工作的我使用华丽的算法,大量使用全局变量.....,说不好听的话,六百多行的程序除了能运行之外就是一陀屎!如果一年前我能听到一些反面意见的话,大概我能早一点觉悟,但是自从原代码在网站发布以来听到的都是赞美之词,没有一个人向我提出程序改进的意见,这又说明了一个什么问题呢?很值得思考啊!
还有一个疑惑是:我们说的和做的真的一样吗?我在学校的时候曾经受学院指派承办过一个计算机大赛,请了一个老师出决赛的题目,主要是一些算法题目,这个老师可能是我上大学以来唯一敬佩的老师了,从程序调试到打分,对于每个程序都仔细分析其时间效率和空间效率,然后综合打分,四十个人的卷子,老师从下午三点一直调试到晚上十点,在有些写的精彩的语句后还加上批注。我真是高兴很遇到这样的老师并且和他做深入的交流,但在事后,却发生了一件不愉快的事,在比赛中获得第二名的学生找到我,说他程序全部调试成功应该给他满分,并且应该得第一,我说不过他,最后调出了他的原程序和第一名的原程序对比,不错,两个程序都运行的很好,这时,那个同学开口了:“我的程序写的十分简捷明了,仅仅数行就完成了题目要求,而他的却写了一大堆,为什么给他的分多过给我的分。”我当时很是气愤,如果不是老师负责的话,那么现在第一名和第二名的位置真的要互调了,拜托,不是程序的行数越少程序的质量就越高,我记得我跟他大谈这方面的道理,最后说服他了!哈哈,但是我,只能说说而已,我不知道还有多少人一样,说起来头头是道,但心里却压根就从未重视过它!
3.我打算做的!
其实那天我想到的远不止上面那么多,但是我不想再说了,因为我猜想看这篇文章的网友大概都有一肚子的感想,一肚子的抱怨,借用这篇文章发泄可不是我想达到的目的,在上面我把自己骂的一文不值也不是妄自菲薄,但是在某些方面我真的做错了,或者说是偏离了正确方向,现在是矫正方向和重整旗鼓的时候了,就象我前面说过的,我相信中国有世界上最好的程序员,我也相信我的水平不会一直保持现状,我现在就收拾起牢骚真正的实干起来!
真的很巧,就写到这里的时候我在网上偶尔发现了这篇手册,我不知道这预示着什么,但是我想如果我照下面这个基本原则一直踏实做下去,我一定会实现我的理想---一名优秀的软件设计师!
(下面这些文字不是我的原创,是我偶尔在网上发现的,我真的很幸运能看到这些,这篇文章也随着下面的文字而结束,我真心的希望您能从这篇文章中得到启发,这篇文章欢迎大家随意转载,您可以不写作者是谁,但是请您写上vcroad.net原创,谢谢您的支持)
作者:金蝶中间件公司CTO袁红岗
不知不觉做软件已经做了十年,有成功的喜悦,也有失败的痛苦,但总不敢称自己是高手,因为和我心目中真正的高手们比起来,还差的太远。世界上并没有成为高手的捷径,但一些基本原则是可以遵循的。
1.扎实的基础。数据结构、离散数学、编译原理,这些是所有计算机科学的基础,如果不掌握他们,很难写出高水平的程序。据我的观察,学计算机专业的人比学其他专业的人更能写出高质量的软件。程序人人都会写,但当你发现写到一定程度很难再提高的时候,就应该想想是不是要回过头来学学这些最基本的理论。不要一开始就去学OOP,即使你再精通OOP,遇到一些基本算法的时候可能也会束手无策。
2.丰富的想象力。不要拘泥于固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,除计算机以外,多涉猎其他的学科,比如天文、物理、数学等等。另外,多看科幻电影也是一个很好的途径。
3.最简单的是最好的。这也许是所有科学都遵循的一条准则,如此复杂的质能互换原理在爱因斯坦眼里不过是一个简单得不能再简单的公式:E=mc2。简单的方法更容易被人理解,更容易实现,也更容易维护。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。
4.不钻牛角尖。当你遇到障碍的时候,不妨暂时远离电脑,看看窗外的风景,听听轻音乐,和朋友聊聊天。当我遇到难题的时候会去玩游戏,而且是那种极暴力的打斗类游戏,当负责游戏的那部分大脑细胞极度亢奋的时候,负责编程的那部分大脑细胞就得到了充分的休息。当重新开始工作的时候,我会发现那些难题现在竟然可以迎刃而解。
5.对答案的渴求。人类自然科学的发展史就是一个渴求得到答案的过程,即使只能知道答案的一小部分也值得我们去付出。只要你坚定信念,一定要找到问题的答案,你才会付出精力去探索,即使最后没有得到答案,在过程中你也会学到很多东西。
6.多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。多上上网,看看别人对同一问题的看法,会给你很大的启发。
7.良好的编程风格。注意养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致。大家都知道如何排除代码中错误,却往往忽视了对注释的排错。注释是程序的一个重要组成部分,它可以使你的代码更容易理解,而如果代码已经清楚地表达了你的思想,就不必再加注释了,如果注释和代码不一致,那就更加糟糕。
8.韧性和毅力。这也许是"高手"和一般程序员最大的区别。Agoodprogrammingis99weatand1offee。高手们并不是天才,他们是在无数个日日夜夜中磨练出来的。成功能给我们带来无比的喜悦,但过程却是无比的枯燥乏味。你不妨做个测试,找个10000以内的素数表,把它们全都抄下来,然后再检查三遍,如果能够不间断地完成这一工作,你就可以满足这一条。
秋无痕论坛Windows 7 RC 7100 X86 双语增强安装旗舰版
制作时间:2009.5.2
声明:本系统版权归微软所有,集成的软件,归原作者所有,请勿用于商业用途。
有技术问题欢迎到秋无痕论坛探讨:http://bbs.realqwh.cn
特点:
以官方Windows7RC7100为蓝本,用官方方式集成官方简体中文包,制作成双语版。
不作任何精简,保留其兼容性。
集成可选的常用软件。
集成可选的无损优化。
安装后自动以Administrator登录,用此帐户可增强WIN7的系统兼容性。
本身已集成了可激活的KEY,安装后,可右击计算机属性,联网激活。
友情提示(重要):
若你要安装双语版中的英文版,而你又是中文使用者,请在安装界面中,将Timeandcurrencyformat选择为Chinese(Simplified,PRC),这样可避免乱码现象和软件安装异常现象。
安装过程中,若界面可能出现英文或乱码,并不影响正常安装,安装完成后,已是中文界面,官方存在的个别没有汉化的地方并不影响使用,为保稳定性,不作修正。
本版为测试版,激活后仍有使用期限,有效期为2010年6月(那时大家都早已换正式版系统了)。
安装方式指导(以下两种方式均不会出现乱码):
刻盘安装
1、确认你的电脑有DVD刻录机,安装了NERO刻录软件,然后打开开始菜单-所有程序NERO-NeroBurningROM,再点击刻录器-刻录映像文件,再选中你下载到的系统镜像,再选择以较低速度刻录本镜像,请用较好的盘,在刻录时电脑不要做其他操作。
2、在安装系统之前首先需要在BIOS中将光驱设置为第一启动项:进入BIOS的方法随不同BIOS而不同,一般来说有在开机自检通过后按Del键或者是F2键等。进入BIOS以后,找到“Boot”项目,然后在列表中将第一启动项设置为“CD-ROM”(CD-ROM表示光驱。)即可。不同品牌的BIOS设置有所不同,详细内容请参考主板说明书。设置后一般按F10保存重启。
3、设置成功后,重启即可用本光盘引导电脑安装系统(在出现pressanykeytobootcdordvd...按下回车开始安装)
硬盘安装(推荐)
1、虚拟光驱加载后复制或UltraISO/WINRAR解压ISO文件至硬盘一非系统分区的根目录
注意:是复制或解压至根目录,而不是某文件夹,这一点和其他硬盘安装方法不同
2、安装本光盘TOOLS目录下的nt6hddinstaller(WIN7硬盘安装器)(提示:如最终装成多系统后需卸载Nt6hddInstaller启动菜单最好在旧系统中进行卸载操作)
3、重启选择Nt6hddInstaller后自动进入安装界面,安装操作和光盘一样,装在其它分区上成双系统、格式化C盘结果为单系统就随你所需了
软件及优化列表(全部可选安装):
使用说明
系统软件
MicrosoftVisualC++2005SP1RedistributablePackagex86(VC2005运行库)
MicrosoftVisualC++2008SP1RedistributablePackagex86(VC2008运行库)
AdobeFlashPlayerActiveX
微软Java虚拟机(MicrosoftJavaVirtualMachine)简体中文版
WinRARv3.80Final简体中文美化版by烈火
精选侧边栏[农历、CPU内存显示、多用电子钟、搜索引擎]
精美屏保
网络软件
傲游(Maxthon)2.1.5.1250秋无痕增强版
迅雷5.8.13.699烈火增强版(去广告支持快车超级旋风等专用链)
腾讯QQ2009正式版
赛博QQ1.7MyCrack去广告绿色版(支持QQ2009版显IP的辅助工具)
BitComet比特彗星1.02绿色去广告版
FlashFXPv3.6.0(Build1240)绿色注册版
IE7Pro2.4.5
图像影音
ACDSeePhotoManagerV10.0.238完美者精简版
AdobePhotoshopCS411.0.1Extended官方简体中文精简版
完美解码2009(全能视频播放器)
千千静听TTPlayer5.30简体中文完美者美化增强版
办公及安全软件
极点五笔v6.5正式版
搜狗拼音输入法4.1正式版
WPSOffice2009个人版
FoxitReader3.0build1222去广告增强版
瑞星杀毒软件2009支付宝专版(免费一年)
其他软件
Unlocker(最好的顽固软件删除工具)v1.8.7去插件版
SPX随手抓5.0绿色破解版
雨林木风OneKeyGhostY5.5正式版
UltraISOv9.3.3.2685多国语言注册版
优化设置
关闭IE8“启用内存保护帮助减少联机攻击”以解决支付宝问题(推荐)
IE8中启用内存保护帮助减少联机攻击
修复IE8上支付宝的800A138F错误(推荐)
卸载“修复IE8上支付宝的800A138F错误”
尝试解决WIN7使用支付宝的80070057错误
解决IE8在DISCUZ论坛上传图片问题(需要安装好IE8重启后执行才有效)
尝试解决WIN7英文版和汉化版的乱码
恢复预读
关闭预读以减少开机进程条等待时间加快启动
恢复在启动时自动检测不存在设备的IDE接口
禁止在启动时自动检测不存在设备的IDE接口
恢复登录后创建成功登录报告功能
禁止登录后创建成功登录报告功能
将开机磁盘扫描等待时间设为2秒
恢复关闭服务等待时间
加快关闭服务等待时间
恢复关闭程序等待时间
加快关闭程序等待时间
恢复结束出错程序等待时间
加快结束出错程序等待时间
不从内存中卸载无用的动态链接
总是从内存中卸载无用的动态链接
不自动关闭停止响应的程序
自动关闭停止响应的程序
当资源管理器崩溃时则不自动重启资源管理器
当资源管理器崩溃时则自动重启资源管理器
恢复Win7崩溃时系统自动重启
禁止Win7崩溃时系统自动重启
开启休眠
禁止休眠
恢复我的文档位置
指定我的文档到D盘
恢复我的图片位置
指定我的图片到D盘
恢复我的收藏夹
指定我的收藏夹到D盘
恢复个人下载位置
指定个人下载位置到D盘下载夹
设定任务栏按钮为始终合并
设定任务栏按钮为被占满时合并
恢复菜单显示速度
加快菜单显示速度
恢复快捷方式字样
去掉快捷方式字样
在Win7资源管理器中不显示菜单栏
在Win7资源管理器中显示菜单栏
恢复视频预览
禁用视频预览
不显示超级隐藏文件
显示超级隐藏文件
隐藏IE7/IE8菜单栏
显示IE7/IE8菜单栏
IE7/IE8工具栏使用小图标
IE7/IE8工具栏使用大图标
搜索没有索引的位置时不包括压缩文件
搜索没有索引的位置时包括压缩文件
显示运行
启动时禁止运行欢迎中心
把IE可同时下载数目增到10
跳过IE7/IE8首次运行自定义设置
检查更新但让我选择是否下载和安装
设置首页为百度搜索
安装精选网址收藏夹(需选中“指定我的收藏夹到D盘”)
为IE8添加功能强大的搜索引擎(包括百度、谷歌、搜狗、淘宝、有道海量词典、卓越亚马逊等)
在桌面上显示个人文件夹
在桌面上显示回收站
在桌面上显示计算机
去掉DLL文件右键(反)注册菜单
为DLL文件右键加上(反)注册菜单
去掉OCX文件右键(反)注册菜单
为OCX文件右键加上(反)注册菜单
去掉右键管理员取得所有权菜单
为右键加上管理员取得所有权菜单
去掉右键加上在此处打开命令提示符
为右键加上在此处打开命令提示符
去掉右键的复制到和移动到键
为右键加上复制到和移动到键
去掉右键菜单中记事本打开项
为右键菜单中加上记事本打开项
为右键添上“显示/隐藏系统文件+扩展名”菜单
为文件属性添加文件哈希值选项
恢复我最近的文档记录内容
禁止我最近的文档记录内容
Antiactivex插件免疫
将常用工具添加到开始菜单中
自动清除多余的快捷方式及启动项(推荐)
---------------------------------------------------------------------------------
下载信息:
文件:realqwh_win7_rc_7100_x86_cn_en.iso
大小:3138179072字节(2.92G)
修改时间:2009年5月2日,23:58:19
MD5:BCFBC79BBFC141BF5766B1851D4FA86A
SHA1:4BE378BD29503A4293C3F3995DB8F096F84DB17E
CRC32:44D956B4
网盘下载:http://www.rayfile.com/files/668c4587-37d2-11de-81c3-0014221b798a/
声明:本系统版权归微软所有,集成的软件,归原作者所有,请勿用于商业用途。
有技术问题欢迎到秋无痕论坛探讨:http://bbs.realqwh.cn
特点:
以官方Windows7RC7100为蓝本,用官方方式集成官方简体中文包,制作成双语版。
不作任何精简,保留其兼容性。
集成可选的常用软件。
集成可选的无损优化。
安装后自动以Administrator登录,用此帐户可增强WIN7的系统兼容性。
本身已集成了可激活的KEY,安装后,可右击计算机属性,联网激活。
友情提示(重要):
若你要安装双语版中的英文版,而你又是中文使用者,请在安装界面中,将Timeandcurrencyformat选择为Chinese(Simplified,PRC),这样可避免乱码现象和软件安装异常现象。
安装过程中,若界面可能出现英文或乱码,并不影响正常安装,安装完成后,已是中文界面,官方存在的个别没有汉化的地方并不影响使用,为保稳定性,不作修正。
本版为测试版,激活后仍有使用期限,有效期为2010年6月(那时大家都早已换正式版系统了)。
安装方式指导(以下两种方式均不会出现乱码):
刻盘安装
1、确认你的电脑有DVD刻录机,安装了NERO刻录软件,然后打开开始菜单-所有程序NERO-NeroBurningROM,再点击刻录器-刻录映像文件,再选中你下载到的系统镜像,再选择以较低速度刻录本镜像,请用较好的盘,在刻录时电脑不要做其他操作。
2、在安装系统之前首先需要在BIOS中将光驱设置为第一启动项:进入BIOS的方法随不同BIOS而不同,一般来说有在开机自检通过后按Del键或者是F2键等。进入BIOS以后,找到“Boot”项目,然后在列表中将第一启动项设置为“CD-ROM”(CD-ROM表示光驱。)即可。不同品牌的BIOS设置有所不同,详细内容请参考主板说明书。设置后一般按F10保存重启。
3、设置成功后,重启即可用本光盘引导电脑安装系统(在出现pressanykeytobootcdordvd...按下回车开始安装)
硬盘安装(推荐)
1、虚拟光驱加载后复制或UltraISO/WINRAR解压ISO文件至硬盘一非系统分区的根目录
注意:是复制或解压至根目录,而不是某文件夹,这一点和其他硬盘安装方法不同
2、安装本光盘TOOLS目录下的nt6hddinstaller(WIN7硬盘安装器)(提示:如最终装成多系统后需卸载Nt6hddInstaller启动菜单最好在旧系统中进行卸载操作)
3、重启选择Nt6hddInstaller后自动进入安装界面,安装操作和光盘一样,装在其它分区上成双系统、格式化C盘结果为单系统就随你所需了
软件及优化列表(全部可选安装):
使用说明
系统软件
MicrosoftVisualC++2005SP1RedistributablePackagex86(VC2005运行库)
MicrosoftVisualC++2008SP1RedistributablePackagex86(VC2008运行库)
AdobeFlashPlayerActiveX
微软Java虚拟机(MicrosoftJavaVirtualMachine)简体中文版
WinRARv3.80Final简体中文美化版by烈火
精选侧边栏[农历、CPU内存显示、多用电子钟、搜索引擎]
精美屏保
网络软件
傲游(Maxthon)2.1.5.1250秋无痕增强版
迅雷5.8.13.699烈火增强版(去广告支持快车超级旋风等专用链)
腾讯QQ2009正式版
赛博QQ1.7MyCrack去广告绿色版(支持QQ2009版显IP的辅助工具)
BitComet比特彗星1.02绿色去广告版
FlashFXPv3.6.0(Build1240)绿色注册版
IE7Pro2.4.5
图像影音
ACDSeePhotoManagerV10.0.238完美者精简版
AdobePhotoshopCS411.0.1Extended官方简体中文精简版
完美解码2009(全能视频播放器)
千千静听TTPlayer5.30简体中文完美者美化增强版
办公及安全软件
极点五笔v6.5正式版
搜狗拼音输入法4.1正式版
WPSOffice2009个人版
FoxitReader3.0build1222去广告增强版
瑞星杀毒软件2009支付宝专版(免费一年)
其他软件
Unlocker(最好的顽固软件删除工具)v1.8.7去插件版
SPX随手抓5.0绿色破解版
雨林木风OneKeyGhostY5.5正式版
UltraISOv9.3.3.2685多国语言注册版
优化设置
关闭IE8“启用内存保护帮助减少联机攻击”以解决支付宝问题(推荐)
IE8中启用内存保护帮助减少联机攻击
修复IE8上支付宝的800A138F错误(推荐)
卸载“修复IE8上支付宝的800A138F错误”
尝试解决WIN7使用支付宝的80070057错误
解决IE8在DISCUZ论坛上传图片问题(需要安装好IE8重启后执行才有效)
尝试解决WIN7英文版和汉化版的乱码
恢复预读
关闭预读以减少开机进程条等待时间加快启动
恢复在启动时自动检测不存在设备的IDE接口
禁止在启动时自动检测不存在设备的IDE接口
恢复登录后创建成功登录报告功能
禁止登录后创建成功登录报告功能
将开机磁盘扫描等待时间设为2秒
恢复关闭服务等待时间
加快关闭服务等待时间
恢复关闭程序等待时间
加快关闭程序等待时间
恢复结束出错程序等待时间
加快结束出错程序等待时间
不从内存中卸载无用的动态链接
总是从内存中卸载无用的动态链接
不自动关闭停止响应的程序
自动关闭停止响应的程序
当资源管理器崩溃时则不自动重启资源管理器
当资源管理器崩溃时则自动重启资源管理器
恢复Win7崩溃时系统自动重启
禁止Win7崩溃时系统自动重启
开启休眠
禁止休眠
恢复我的文档位置
指定我的文档到D盘
恢复我的图片位置
指定我的图片到D盘
恢复我的收藏夹
指定我的收藏夹到D盘
恢复个人下载位置
指定个人下载位置到D盘下载夹
设定任务栏按钮为始终合并
设定任务栏按钮为被占满时合并
恢复菜单显示速度
加快菜单显示速度
恢复快捷方式字样
去掉快捷方式字样
在Win7资源管理器中不显示菜单栏
在Win7资源管理器中显示菜单栏
恢复视频预览
禁用视频预览
不显示超级隐藏文件
显示超级隐藏文件
隐藏IE7/IE8菜单栏
显示IE7/IE8菜单栏
IE7/IE8工具栏使用小图标
IE7/IE8工具栏使用大图标
搜索没有索引的位置时不包括压缩文件
搜索没有索引的位置时包括压缩文件
显示运行
启动时禁止运行欢迎中心
把IE可同时下载数目增到10
跳过IE7/IE8首次运行自定义设置
检查更新但让我选择是否下载和安装
设置首页为百度搜索
安装精选网址收藏夹(需选中“指定我的收藏夹到D盘”)
为IE8添加功能强大的搜索引擎(包括百度、谷歌、搜狗、淘宝、有道海量词典、卓越亚马逊等)
在桌面上显示个人文件夹
在桌面上显示回收站
在桌面上显示计算机
去掉DLL文件右键(反)注册菜单
为DLL文件右键加上(反)注册菜单
去掉OCX文件右键(反)注册菜单
为OCX文件右键加上(反)注册菜单
去掉右键管理员取得所有权菜单
为右键加上管理员取得所有权菜单
去掉右键加上在此处打开命令提示符
为右键加上在此处打开命令提示符
去掉右键的复制到和移动到键
为右键加上复制到和移动到键
去掉右键菜单中记事本打开项
为右键菜单中加上记事本打开项
为右键添上“显示/隐藏系统文件+扩展名”菜单
为文件属性添加文件哈希值选项
恢复我最近的文档记录内容
禁止我最近的文档记录内容
Antiactivex插件免疫
将常用工具添加到开始菜单中
自动清除多余的快捷方式及启动项(推荐)
---------------------------------------------------------------------------------
下载信息:
文件:realqwh_win7_rc_7100_x86_cn_en.iso
大小:3138179072字节(2.92G)
修改时间:2009年5月2日,23:58:19
MD5:BCFBC79BBFC141BF5766B1851D4FA86A
SHA1:4BE378BD29503A4293C3F3995DB8F096F84DB17E
CRC32:44D956B4
网盘下载:http://www.rayfile.com/files/668c4587-37d2-11de-81c3-0014221b798a/
JSP/Servlet应用程序优化八法
你的J2EE应用是不是运行的很慢?它们能不能接受住不断上升的访问量?本文讲述了开发高性能、高弹性的JSP(SUN企业级应用的首选)页面和SERVLET的性能优化技术。其意思是建立尽可能快的并能顺应数量增长的用户及其请求。在本文中,我将带领你进修已经实践和得到证实的性能调整技术,它将大大地提高你的SERVLET和JSP(SUN企业级应用的首选)页面的性能,进而提升J2EE的性能。这些技术的部分用于开发阶段,例如,设计和编码阶段。另一部分技术则与配置相关。
技术1:在HTTPSERVLETINIT()方法中缓存数据
服务器会在创建SERVLET实例之后和SERVLET处理任何请求之前调用SERVLET的INIT()方法。该方法在SERVLET的生命周期中仅调用一次。为了提高性能,在INIT()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了JAVAX.SQL.DATASOURCE接口的JDBC连接池。
DATASOURCE从JNDI树中获得。每调用一次SQL就要使用JNDI查找DATASOURCE是非常昂贵的工作,而且严重影响了应用的性能。SERVLET的INIT()方法可以用于获取DATASOURCE并缓存它以便之后的重用:
PUBLICCLASSCONTROLLERSERVLETEXTENDSHTTPSERVLET
PRIVATEJAVAX.SQL.DATASOURCETESTDS=NULL;
PUBLICVOIDINIT(SERVLETCONFIGCONFIG)THROWSSERVLETEXCEPTION
SUPER.INIT(CONFIG);
CONTEXTCTX=NULL;
TRY
CTX=NEWINITIALCONTEXT();
TESTDS=(JAVAX.SQL.DATASOURCE)CTX.LOOKUP("JDBC/TESTDS");
CATCH(NAMINGEXCEPTIONNE)
NE.PRINTSTACKTRACE();
CATCH(EXCEPTIONE)
E.PRINTSTACKTRACE();
PUBLICJAVAX.SQL.DATASOURCEGETTESTDS()
RETURNTESTDS;
...
...
技术2:禁用SERVLET和JSP(SUN企业级应用的首选)的自动装载功能
当每次修改了SERVLET/JSP(SUN企业级应用的首选)之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;SERVLET/JSP(SUN企业级应用的首选)由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突景象。因此,在运行环境中为了得到更好的性能,关闭SERVLET/JSP(SUN企业级应用的首选)的自动装载功能。
技术3:控制HTTPSESSION
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于WEB的应用需要负责维护这样一个叫做SESSION的状态。为了支持必须维护状态的应用,JAVASERVLET技术提供了管理SESSION和允许多种机制实现SESSION的API。HTTPSESSION对象扮演了SESSION,但是使用它需要成本。无论何时HTTPSESSION被使用和重写,它都由SERVLET读取。你可以通过使用下面的技术来提高性能:
L在JSP(SUN企业级应用的首选)页面中不要创建默认的HTTPSESSION:默认状况下,JSP(SUN企业级应用的首选)页面创建HTTPSESSION。如果你在JSP(SUN企业级应用的首选)页面中不用HTTPSESSION,为了节省性能开销,使用下边的页面指令可以避免自动创建HTTPSESSION对象:
<%@PAGESESSION="FALSE"%>
1)不要将大的对象图存储在HTTPSESSION中:如果你将数据当作一个大的对象图存储在HTTPSESSION中,应用服务器每次将不得不处理整个HTTPSESSION对象。这将迫使JAVA序列化和增加计算开销。由于序列化的开销,随着存储在HTTPSESSION对象中数据对象的增大,系统的吞吐量将会下降。
2)用完后释放HTTPSESSION:当不在使用HTTPSESSION时,使用HTTPSESSION.INVALIDATE()方法使SESION失效。
技术1:在HTTPSERVLETINIT()方法中缓存数据
服务器会在创建SERVLET实例之后和SERVLET处理任何请求之前调用SERVLET的INIT()方法。该方法在SERVLET的生命周期中仅调用一次。为了提高性能,在INIT()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了JAVAX.SQL.DATASOURCE接口的JDBC连接池。
DATASOURCE从JNDI树中获得。每调用一次SQL就要使用JNDI查找DATASOURCE是非常昂贵的工作,而且严重影响了应用的性能。SERVLET的INIT()方法可以用于获取DATASOURCE并缓存它以便之后的重用:
PUBLICCLASSCONTROLLERSERVLETEXTENDSHTTPSERVLET
PRIVATEJAVAX.SQL.DATASOURCETESTDS=NULL;
PUBLICVOIDINIT(SERVLETCONFIGCONFIG)THROWSSERVLETEXCEPTION
SUPER.INIT(CONFIG);
CONTEXTCTX=NULL;
TRY
CTX=NEWINITIALCONTEXT();
TESTDS=(JAVAX.SQL.DATASOURCE)CTX.LOOKUP("JDBC/TESTDS");
CATCH(NAMINGEXCEPTIONNE)
NE.PRINTSTACKTRACE();
CATCH(EXCEPTIONE)
E.PRINTSTACKTRACE();
PUBLICJAVAX.SQL.DATASOURCEGETTESTDS()
RETURNTESTDS;
...
...
技术2:禁用SERVLET和JSP(SUN企业级应用的首选)的自动装载功能
当每次修改了SERVLET/JSP(SUN企业级应用的首选)之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;SERVLET/JSP(SUN企业级应用的首选)由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突景象。因此,在运行环境中为了得到更好的性能,关闭SERVLET/JSP(SUN企业级应用的首选)的自动装载功能。
技术3:控制HTTPSESSION
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于WEB的应用需要负责维护这样一个叫做SESSION的状态。为了支持必须维护状态的应用,JAVASERVLET技术提供了管理SESSION和允许多种机制实现SESSION的API。HTTPSESSION对象扮演了SESSION,但是使用它需要成本。无论何时HTTPSESSION被使用和重写,它都由SERVLET读取。你可以通过使用下面的技术来提高性能:
L在JSP(SUN企业级应用的首选)页面中不要创建默认的HTTPSESSION:默认状况下,JSP(SUN企业级应用的首选)页面创建HTTPSESSION。如果你在JSP(SUN企业级应用的首选)页面中不用HTTPSESSION,为了节省性能开销,使用下边的页面指令可以避免自动创建HTTPSESSION对象:
<%@PAGESESSION="FALSE"%>
1)不要将大的对象图存储在HTTPSESSION中:如果你将数据当作一个大的对象图存储在HTTPSESSION中,应用服务器每次将不得不处理整个HTTPSESSION对象。这将迫使JAVA序列化和增加计算开销。由于序列化的开销,随着存储在HTTPSESSION对象中数据对象的增大,系统的吞吐量将会下降。
2)用完后释放HTTPSESSION:当不在使用HTTPSESSION时,使用HTTPSESSION.INVALIDATE()方法使SESION失效。
心灵旅行
眼下最牵动人心、最迫切需要解决的社会问题,非就业莫属。日前,《国家人权行动计划(2009~2010年)》发布,其中就明确提出,要保障公民工作权利,重点解决高校毕业生和农民工就业问题(《中国青年报》4月14日)。
农民工返乡尚有田地可供经营,毕业的大学生若是工作没有着落,何以立身?
事实上,全国上下,促进就业的政策层出不穷,各种招聘会纷至沓来,硕士扩招、大学生村官工程、见习基地等等应对措施也不一而足。但是俗话说得好,授之以鱼,不如授之以渔,进一步来讲,授之以渔,不如授之以鱼塘。对于一些条件适合的大学生而言,与其千方百计就业,不如自己创业,不仅能解决自己的就业,也能创造就业机会。
《中国青年报》公布的一项调查数据就显示,79%的被调查大学生有自主创业的意向。这无疑是个令人欣喜的消息,但根据全国人大代表王建华掌握的数据,目前我国真正选择创业的大学生只有0.3%,广东是全国比例最高的省份,也只有1%,但这个比例在美国却高达25%。
为什么我国大学生创业会出现心很热,手很凉的怪象?试举其中两个方面的原因。
一是创业门槛问题。严格死板的登记制度、繁琐低效的审批程序,往往让创业者望而生畏。创办一个企业往往要盖十几甚至几十个公章,每个部门都得照顾到。一项跨国调查表明,从注册一家公司到开业平均所需审批时间,加拿大要2天,而我国则要111天。再如注册审批费用,在美、英等国不到其人均年薪的1%,而我们达到了人均年薪的11%,传说中的一元公司更是可望而不可及。此外,有时大学生并不缺创意和项目,缺的是融资渠道。调查显示,61.63%的大学生认为缺乏启动资金是创业的最大障碍。
二是生存环境问题。在你耗费了大量金钱和精力后开张了,随即而来的就是所得税、增值税、营业税和各种附加税等,五花八门。而且税赋之外还有费负,工商管理费、市场管理费、质量检验费等,接踵而至。你一开张,根据你的经营范围,城管、工商、质监、卫生防疫、环保、消防等都有可能会来收费。要是你一不小心,再给你来点罚款、滞纳金什么的,也很难说。
创业之难,可见一斑。就算你顺顺当当开张了,市场环境、经营状况也都是未知数。2005年的一项统计表明,大学生创业成功率只有2%~3%;但到了2007年,零点公司的调查显示,大学生创业成功率只有0.01%。
按说,全国各地推出的各种措施不可谓不多,如创业基金等。但是,治标之策无法治本,只要竭泽而渔式的税费负担不减轻,政策瓶颈不打开,制度环境不改善,一个适合大学生创业的宽松环境就无法形成。显然,这需要各级政府部门轻税薄费,简化审批程序,优化制度设置,提高工作效率,给大学生创造一个宽松的创业制度环境。
(作者:薛世君)
J2ME编程技巧+程序优化
出自j2megame
编码技巧:
1.用StringBuffer代替String,因为String对象不能被更改,任何对String对象的更改都是创建一个新的String对象
2.直接存取类中的变量要比通过setter和getter方法快
3.使用本地变量比使用类或实例变量更有效率
4.使用变量比使用数组更有效率
5.避免在循环中进行同步,因为每一次循环都会有lock和unlock的过程,会严重影响程序执行效率
6.循环中倒数(递减)比正数(递增)要快
7.使用类似于x+=1代替x=x+1,因为这样生成的代码小
8.删除循环中的常量运算
9.重复利用对象
10.把不再使用的对象赋值为null,特别是不再使用的thread
11.尽量使用内置的方法.比如,想实现将数据从一个数组拷贝到另一个数组的功能,使用System.arraycopy比自己创建新的方法的效率更有效率
编码技巧:
1.用StringBuffer代替String,因为String对象不能被更改,任何对String对象的更改都是创建一个新的String对象
2.直接存取类中的变量要比通过setter和getter方法快
3.使用本地变量比使用类或实例变量更有效率
4.使用变量比使用数组更有效率
5.避免在循环中进行同步,因为每一次循环都会有lock和unlock的过程,会严重影响程序执行效率
6.循环中倒数(递减)比正数(递增)要快
7.使用类似于x+=1代替x=x+1,因为这样生成的代码小
8.删除循环中的常量运算
9.重复利用对象
10.把不再使用的对象赋值为null,特别是不再使用的thread
11.尽量使用内置的方法.比如,想实现将数据从一个数组拷贝到另一个数组的功能,使用System.arraycopy比自己创建新的方法的效率更有效率
什么是CUDA?显卡厂商NVidia推出的运算平台
随着显卡的发展,GPU越来越强大,而且GPU为显示图像做了优化。在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的。
目前只有G80、G92、G94和GT200平台的NVidia显卡才能使用CUDA,工具集的核心是一个C语言编译器。G80中拥有128个单独的ALU,因此非常适合并行计算,而且数值计算的速度远远优于CPU。
CUDA的SDK中的编译器和开发平台支持Windows、Linux系统,可以与VisualStudio2005集成在一起。
目前这项技术处在起步阶段,仅支持32位系统,编译器不支持双精度数据等问题要在晚些时候解决。Geforce8CUDA(ComputeUnifiedDeviceArchitecture)是一个新的基础架构,这个架构可以使用GPU来解决商业、工业以及科学方面的复杂计算问题。它是一个完整的GPGPU解决方案,提供了硬件的直接访问接口,而不必像传统方式一样必须依赖图形API接口来实现GPU的访问。在架构上采用了一种全新的计算体系结构来使用GPU提供的硬件资源,从而给大规模的数据计算应用提供了一种比CPU更加强大的计算能力。CUDA采用C语言作为编程语言提供大量的高性能计算指令开发能力,使开发者能够在GPU的强大计算能力的基础上建立起一种效率更高的密集数据计算解决方案。
从CUDA体系结构的组成来说,包含了三个部分:开发库、运行期环境和驱动(表2)。
开发库是基于CUDA技术所提供的应用开发库。目前CUDA的1.1版提供了两个标准的数学运算库——CUFFT(离散快速傅立叶变换)和CUBLAS(离散基本线性计算)的实现。这两个数学运算库所解决的是典型的大规模的并行计算问题,也是在密集数据计算中非常常见的计算类型。开发人员在开发库的基础上可以快速、方便的建立起自己的计算应用。此外,开发人员也可以在CUDA的技术基础上实现出更多的开发库。
运行期环境提供了应用开发接口和运行期组件,包括基本数据类型的定义和各类计算、类型转换、内存管理、设备访问和执行调度等函数。基于CUDA开发的程序代码在实际执行中分为两种,一种是运行在CPU上的宿主代码(HostCode),一种是运行在GPU上的设备代码(DeviceCode)。不同类型的代码由于其运行的物理位置不同,能够访问到的资源不同,因此对应的运行期组件也分为公共组件、宿主组件和设备组件三个部分,基本上囊括了所有在GPGPU开发中所需要的功能和能够使用到的资源接口,开发人员可以通过运行期环境的编程接口实现各种类型的计算。
由于目前存在着多种GPU版本的NVidia显卡,不同版本的GPU之间都有不同的差异,因此驱动部分基本上可以理解为是CUDA-enable的GPU的设备抽象层,提供硬件设备的抽象访问接口。CUDA提供运行期环境也是通过这一层来实现各种功能的。目前基于CUDA开发的应用必须有NVIDIACUDA-enable的硬件支持,NVidia公司GPU运算事业部总经理AndyKeane在一次活动中表示:一个充满生命力的技术平台应该是开放的,CUDA未来也会向这个方向发展。由于CUDA的体系结构中有硬件抽象层的存在,因此今后也有可能发展成为一个通用的GPGPU标准接口,兼容不同厂商的GPU产品
CUDA工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境。CUDA开发环境包括:
·nvccC语言编译器
·适用于GPU(图形处理器)的CUDAFFT和BLAS库
·分析器
·适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版)
·CUDA运行时(CUDAruntime)驱动程序(目前在标准的NVIDIAGPU驱动中也提供)
·CUDA编程手册
CUDA开发者软件开发包(SDK)提供了一些范例(附有源代码),以帮助使用者开始CUDA编程。这些范例包括:
·并行双调排序
·矩阵乘法
·矩阵转置
·利用计时器进行性能评价
·并行大数组的前缀和(扫描)
·图像卷积
·使用Haar小波的一维DWT
·OpenGL和Direct3D图形互操作示例
·CUDABLAS和FFT库的使用示例
·CPU-GPUC—和C++—代码集成
·二项式期权定价模型
·Black-Scholes期权定价模型
·Monte-Carlo期权定价模型
·并行MersenneTwister(随机数生成)
·并行直方图
·图像去噪
·Sobel边缘检测滤波器
·MathWorksMATLAB插件(点击这里下载)
新的基于1.1版CUDA的SDK范例现在也已经发布了。要查看完整的列表、下载代码,请点击此处。
技术功能
·在GPU(图形处理器)上提供标准C编程语言
·为在支持CUDA的NVIDIAGPU(图形处理器)上进行并行计算而提供了统一的软硬件解决方案
·CUDA兼容的GPU(图形处理器)包括很多:从低功耗的笔记本上用的GPU到高性能的,多GPU的系统。
·支持CUDA的GPU(图形处理器)支持并行数据缓存和线程执行管理器
·标准FFT(快速傅立叶变换)和BLAS(基本线性代数子程序)数值程序库
·针对计算的专用CUDA驱动
·经过优化的,从中央处理器(CPU)到支持CUDA的GPU(图形处理器)的直接上传、下载通道
·CUDA驱动可与OpenGL和DirectX图形驱动程序实现互操作
·支持Linux32位/64位以及WindowsXP32位/64位操作系统
·为了研究以及开发语言的目的,CUDA提供对驱动程序的直接访问,以及汇编语言级的访问
NVIDIA进军高性能计算领域,推出了TeslaCUDA高性能计算系列解决方案,CUDA技术,一种基于NVIDIA图形处理器(GPU)上全新的并行计算体系架构,让科学家、工程师和其他专业技术人员能够解决以前无法解决的问题,作为一个专用高性能GPU计算解决方案,NVIDIA把超级计算能够带给任何工作站或服务器,以及标准、基于CPU的服务器集群
CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。
由于GPU的特点是处理密集型数据和并行数据计算,因此CUDA非常适合需要大规模并行计算的领域。目前CUDA除了可以用C语言开发,也已经提供FORTRAN的应用接口,未来可以预计CUDA会支持C++、Java、Python等各类语言。可广泛的应用在图形动画、科学计算、地质、生物、物理模拟等领域。
中文博客赚钱 » Blog Archive » SEO优化效果的优势
SEO发展进程及其作弊行为
号称SEO作弊手段不仅仅在中国,在全球都有,只是程度不一样而已,其实,作弊是对规则的过度利用,其根本也是出于对搜索引擎自然排名规则的研究。但是出于对“相关性”的维护和对“作恶”的惩罚,相当多的作弊行为都得到搜索引擎的重点关照,搜索引擎公司里面都有专门的部门和人员负责关照“作弊”行为。在搜索技术人员中有很高知名度的Googler,MattCutts,日常就是负责这个工作。
所以作弊的SEO公司是一种类型,他们的收费是根据短时间内排名的位置来收费的,而收费的金额和方式也各种各样。但是购买他们的服务是一种高风险的行为,随时都有被“株连”的可能。
正规的SEO都是在搜索引擎的规则内来进行网站的优化,优化的重点涉及网站程序优化、内容优化、购买流程优化等。其实还有更多优化的细节,但都是围绕这几个重点来展开的。程序的优化是基础,内容的优化是除了最大限度提升“相关性”之外,还关注对目标客户的正确吸引,购买的流程的优化是访问转化为交易的关键。
这样的SEO公司根据服务的不同还有两个很典型的类型。
首先是顾问公司,SEO顾问公司,只提供咨询服务,更多地是网站的诊断并出具相关的建议。这样的服务一般是按照时间收费,基本单位是天,在美国和英国,有些顾问公司的收费是每天5000美金,一般和客户签长期(一年以上)合同,每月两天以上。
其次就是实施公司,本来我想说是技术公司,但是感觉实施公司更符合实际的操作情况。SEO实施公司一般根据客户的意见(有时候是顾问的意见)整理出可实施的优化方案来,但是收费的方式就多了。曾经在欧洲和美国有过两次调查,调查的前后间隔有五到六年的时间,调查的目的就是SEO的收费方式,结果是,没有任何两家公司的收费方式是一样的。至今也是。不过有一个可参考的要素是,人工和页面。就是按照总的工时量来收费,或者按照优化的页面数量来收费,还有一个参考的因素是关键词的数量,但是有个很有意思的部分就是,几乎都不保证绝对排名,只有相对自身的参考排名。
这里又引出一个关键点,就是这些SEO公司和他们的客户(或者说是广告主)关注的都不是排名,而是访问量和转化率,或者说是ROI(投资回报率)。所以才有了之前文章提到的那种理想收费方式,就是按照客户通过搜索优化/营销带来的收益多少进行分成。有点象业务提成了。
几乎所有的我接触过SEO/SEM专家在谈到搜索引擎营销,说起优化的时候,都是先一句带过“Coding”,然后就马上转入内容的优化了。难怪大家都有一个几乎共同的意见,在招收公司的SEO/SEM人才,或者要培训这些方向的人才的时候,都说,最佳的人员都来自商学院。也就是说商学院的学生最合适从事搜索引擎营销的工作。
如此说来,SEO更象是一个商业行为,而不是技术手段。而SEO和SEM不应该是分开的两个范畴,搜索引擎优化(SEO)是搜索引擎营销(SEM)的重要组成部分。这样的观点也开始在全球各地普及起来,一个完整的搜索引擎营销解决方案,应该包括优化和所有的付费排名策略。但是这样解决方案,依然存在着收费方式的问题。div之家本身和所有海内外伙伴,正在针对典型的客户制定标准化的服务模式,并与所有的伙伴分享模式和相关资源。同时也透过搜索引擎战略大会及相关的活动,传播这样的理念,交流SEM的资源。
号称SEO作弊手段不仅仅在中国,在全球都有,只是程度不一样而已,其实,作弊是对规则的过度利用,其根本也是出于对搜索引擎自然排名规则的研究。但是出于对“相关性”的维护和对“作恶”的惩罚,相当多的作弊行为都得到搜索引擎的重点关照,搜索引擎公司里面都有专门的部门和人员负责关照“作弊”行为。在搜索技术人员中有很高知名度的Googler,MattCutts,日常就是负责这个工作。
所以作弊的SEO公司是一种类型,他们的收费是根据短时间内排名的位置来收费的,而收费的金额和方式也各种各样。但是购买他们的服务是一种高风险的行为,随时都有被“株连”的可能。
正规的SEO都是在搜索引擎的规则内来进行网站的优化,优化的重点涉及网站程序优化、内容优化、购买流程优化等。其实还有更多优化的细节,但都是围绕这几个重点来展开的。程序的优化是基础,内容的优化是除了最大限度提升“相关性”之外,还关注对目标客户的正确吸引,购买的流程的优化是访问转化为交易的关键。
这样的SEO公司根据服务的不同还有两个很典型的类型。
首先是顾问公司,SEO顾问公司,只提供咨询服务,更多地是网站的诊断并出具相关的建议。这样的服务一般是按照时间收费,基本单位是天,在美国和英国,有些顾问公司的收费是每天5000美金,一般和客户签长期(一年以上)合同,每月两天以上。
其次就是实施公司,本来我想说是技术公司,但是感觉实施公司更符合实际的操作情况。SEO实施公司一般根据客户的意见(有时候是顾问的意见)整理出可实施的优化方案来,但是收费的方式就多了。曾经在欧洲和美国有过两次调查,调查的前后间隔有五到六年的时间,调查的目的就是SEO的收费方式,结果是,没有任何两家公司的收费方式是一样的。至今也是。不过有一个可参考的要素是,人工和页面。就是按照总的工时量来收费,或者按照优化的页面数量来收费,还有一个参考的因素是关键词的数量,但是有个很有意思的部分就是,几乎都不保证绝对排名,只有相对自身的参考排名。
这里又引出一个关键点,就是这些SEO公司和他们的客户(或者说是广告主)关注的都不是排名,而是访问量和转化率,或者说是ROI(投资回报率)。所以才有了之前文章提到的那种理想收费方式,就是按照客户通过搜索优化/营销带来的收益多少进行分成。有点象业务提成了。
几乎所有的我接触过SEO/SEM专家在谈到搜索引擎营销,说起优化的时候,都是先一句带过“Coding”,然后就马上转入内容的优化了。难怪大家都有一个几乎共同的意见,在招收公司的SEO/SEM人才,或者要培训这些方向的人才的时候,都说,最佳的人员都来自商学院。也就是说商学院的学生最合适从事搜索引擎营销的工作。
如此说来,SEO更象是一个商业行为,而不是技术手段。而SEO和SEM不应该是分开的两个范畴,搜索引擎优化(SEO)是搜索引擎营销(SEM)的重要组成部分。这样的观点也开始在全球各地普及起来,一个完整的搜索引擎营销解决方案,应该包括优化和所有的付费排名策略。但是这样解决方案,依然存在着收费方式的问题。div之家本身和所有海内外伙伴,正在针对典型的客户制定标准化的服务模式,并与所有的伙伴分享模式和相关资源。同时也透过搜索引擎战略大会及相关的活动,传播这样的理念,交流SEM的资源。
在 UNIX 操作系统上优化 N 层 J2EE 应用程序
UNIX?和类UNIX操作系统通过Internet托管大部分Web浏览器和基于Web的应用程序。尽管这些操作系统主要针对多处理、网络和性能进行设计,但是如今的分布式n层Web应用程序引入了其他很多可影响应用程序性能的因素。常用缩写词
在Web的早期,Web服务器使用HTML以及位于给定Web服务器的本地图形文件交付静态数据。尽管这种方法适用于静态类内容,但是,企业应用程序需要访问动态的内容,包括客户信息、库存和定价信息,以及其他频繁变化、保存在数据库而非Web服务器内容目录(通常保存在数据库之类的外部资源中)的信息。
通过允许Web服务器直接访问包含动态内容的其他数据资源(比如数据库),2层Web架构可以满足这些需求。2层Web应用程序是一种标准的客户机服务器系统,通过使用诸如CommonGatewayInterface(CGI)之类的数据接口协议和各种Web脚本语言实现Web服务器和外部数据资源之间的直接通信。面向Web应用程序和相关数据源的所有连接和业务逻辑都在Web应用程序内完成编码,并且不管数据是本地存储还是远程存储,该应用程序都可以直接访问所需数据。UNIX和类UNIX操作系统是2层Web应用程序的理想选择,因为它们的设计目标就是实现多处理、支持大量物理内存,并且包括高性能虚拟内存功能来解决应用程序内存需求超出物理内存容量的问题。
然而,不管底层操作系统和硬件有多么强大,2层应用程序在处理大量请求或维护大量Web客户机的状态信息时变得有些低效,因为应用程序的所有组件通常都运行在同一台机器上。使用数据库和Web服务器上的本地数据源将增加复制和备份的难度,并且加重了Web服务器的负荷。同样,如果系统被侵入并受到破坏,那么将数据库或数据库访问信息存储在正在运行Web服务器的机器上会引发安全性问题。
n层Web应用程序架构解决了这些问题,它在不同的机器上运行不同的服务,并使用称为应用服务器的中间件充当Web应用程序逻辑和远程数据需求之间的中介层。N层架构提供了大量其他简单架构无法比拟的优势,其中包括:
N层架构依赖于多个计算机系统的相互操作,根据所提供的服务的类型,每个计算机系统具有不同的性能考虑因素。这些计算机系统之间的互操作常常需要对IT基础设施进行额外的投入,这是因为对网络负载和应用程序响应性的需求更加迫切,包括与监视和同步多个系统来支持冗余和故障转移所需的额外通信量,以及与集中化网络附加存储(NetworkAttachedStorage,NAS)和存储区域网络(StorageAreaNetwork,SAN)数据存储资源相关的网络通信量。
在Web的早期,Web服务器使用HTML以及位于给定Web服务器的本地图形文件交付静态数据。尽管这种方法适用于静态类内容,但是,企业应用程序需要访问动态的内容,包括客户信息、库存和定价信息,以及其他频繁变化、保存在数据库而非Web服务器内容目录(通常保存在数据库之类的外部资源中)的信息。
通过允许Web服务器直接访问包含动态内容的其他数据资源(比如数据库),2层Web架构可以满足这些需求。2层Web应用程序是一种标准的客户机服务器系统,通过使用诸如CommonGatewayInterface(CGI)之类的数据接口协议和各种Web脚本语言实现Web服务器和外部数据资源之间的直接通信。面向Web应用程序和相关数据源的所有连接和业务逻辑都在Web应用程序内完成编码,并且不管数据是本地存储还是远程存储,该应用程序都可以直接访问所需数据。UNIX和类UNIX操作系统是2层Web应用程序的理想选择,因为它们的设计目标就是实现多处理、支持大量物理内存,并且包括高性能虚拟内存功能来解决应用程序内存需求超出物理内存容量的问题。
然而,不管底层操作系统和硬件有多么强大,2层应用程序在处理大量请求或维护大量Web客户机的状态信息时变得有些低效,因为应用程序的所有组件通常都运行在同一台机器上。使用数据库和Web服务器上的本地数据源将增加复制和备份的难度,并且加重了Web服务器的负荷。同样,如果系统被侵入并受到破坏,那么将数据库或数据库访问信息存储在正在运行Web服务器的机器上会引发安全性问题。
n层Web应用程序架构解决了这些问题,它在不同的机器上运行不同的服务,并使用称为应用服务器的中间件充当Web应用程序逻辑和远程数据需求之间的中介层。N层架构提供了大量其他简单架构无法比拟的优势,其中包括:
N层架构依赖于多个计算机系统的相互操作,根据所提供的服务的类型,每个计算机系统具有不同的性能考虑因素。这些计算机系统之间的互操作常常需要对IT基础设施进行额外的投入,这是因为对网络负载和应用程序响应性的需求更加迫切,包括与监视和同步多个系统来支持冗余和故障转移所需的额外通信量,以及与集中化网络附加存储(NetworkAttachedStorage,NAS)和存储区域网络(StorageAreaNetwork,SAN)数据存储资源相关的网络通信量。
JSP/Servlet应用程序优化八法
你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能、高弹性的JSP页面和Servlet的性能优化技术。其意思是建立尽可能快的并能适应数量增长的用户及其请求。在本文中,我将带领你学习已经实践和得到证实的性能调整技术,它将大大地提高你的servlet和jsp页面的性能,进而提升J2EE的性能。这些技术的部分用于开发阶段,例如,设计和编码阶段。另一部分技术则与配置相关。
技术1:在HttpServletinit()方法中缓存数据
服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。为了提高性能,在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了javax.sql.DataSource接口的JDBC连接池。
DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作,而且严重影响了应用的性能。Servlet的init()方法可以用于获取DataSource并缓存它以便之后的重用:
publicclassControllerServletextendsHttpServlet
{
privatejavax.sql.DataSourcetestDS=null;
publicvoidinit(ServletConfigconfig)throwsServletException
{
super.init(config);
Contextctx=null;
try
{
ctx=newInitialContext();
testDS=(javax.sql.DataSource)ctx.lookup(jdbc/testDS);
}
catch(NamingExceptionne)
{
ne.printStackTrace();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
publicjavax.sql.DataSourcegetTestDS()
{
returntestDS;
}
...
...
}
技术2:禁用servlet和Jsp的自动装载功能
当每次修改了Servlet/JSP之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;servlet/JSP由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此,在运行环境中为了得到更好的性能,关闭servlet/JSP的自动装载功能。
技术3:控制HttpSession
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用,Javaservlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session,但是使用它需要成本。无论何时HttpSession被使用和重写,它都由servlet读取。你可以通过使用下面的技术来提高性能:
l在JSP页面中不要创建默认的HttpSession:默认情况下,JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession,为了节省性能开销,使用下边的页面指令可以避免自动创建HttpSession对象:
<%@pagesession=false%>
1)不要将大的对象图存储在HttpSession中:如果你将数据当作一个大的对象图存储在HttpSession中,应用服务器每次将不得不处理整个HttpSession对象。这将迫使Java序列化和增加计算开销。由于序列化的开销,随着存储在HttpSession对象中数据对象的增大,系统的吞吐量将会下降。
2)用完后释放HttpSession:当不在使用HttpSession时,使用HttpSession.invalidate()方法使sesion失效。
3)设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。
技术4:使用gzip压缩
压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(GNUzip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
OutputStreamout=null
//ChecktheAccepting-EncodingheaderfromtheHTTPrequest.
//Iftheheaderincludesgzip,chooseGZIP.
//Iftheheaderincludescompress,chooseZIP.
//Otherwisechoosenocompression.
Stringencoding=request.getHeader(Accept-Encoding);
if(encoding!=nullencoding.indexOf(gzip)!=-1)
{
response.setHeader(Content-Encoding,gzip);
out=newGZIPOutputStream(response.getOutputStream());
}
elseif(encoding!=nullencoding.indexOf(compress)!=-1)
{
response.setHeader(Content-Encoding,compress);
out=newZIPOutputStream(response.getOutputStream());
}
else
{
out=response.getOutputStream();
}
...
...
}
技术5:不要使用SingleThreadModel
SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。SingleThreadModel在Servlet2.4中是不再提倡使用。
技术6:使用线程池
servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。
技术7:选择正确的包括机制
在JSP页面中,有两中方式可以包括文件:包括指令(<%@includefile=test.jsp%>)和包括动作(<jsp:includepage=test.jspflush=true/>)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。
技术8:在useBean动作中使用合适的范围
使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用<jsp:useBean>标签可以嵌入到JSP页面中。语法如下:
<jsp:useBeanid=namescope=page|request|session|applicationclass=
package.classNametype=typeName>
</jsp:useBean>
scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。
例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
杂项技术
1)避免字符串连接:由于String对象是不可变对象,使用“+”操作符将会导致创建大量的零时对象。你使用的“+”越多,产出的零时对象就越多,这将影响性能。当你需要连接字符串时,使用StringBuffer替代“+”操作。
2)避免使用System.out.println:System.out.println同步处理磁盘输入/输出,这大大地降低了系统吞吐量。尽可能地避免使用System.out.println。尽管有很多成熟的调试工具可以用,但有时System.out.println为了跟踪、或调试的情况下依然很有用。你应该配置System.out.println仅在错误和调试阶段打开它。使用finalBoolean型的变量,当配置成false时,在编译阶段完成优化检查和执行跟踪输出。
3)ServletOutputStream与PrintWriter比较:由于字符输出流和把数据编码成字节,使用PrintWriter引入了小的性能开销。因此,PrintWriter应该用在所有的字符集都正确地转换做完之后。另一方面,当你知道你的servlet仅返回二进制数据,使用ServletOutputStream,因为servlet容器不编码二进制数据,这样你就能消除字符集转换开销。
总结
技术1:在HttpServletinit()方法中缓存数据
服务器会在创建servlet实例之后和servlet处理任何请求之前调用servlet的init()方法。该方法在servlet的生命周期中仅调用一次。为了提高性能,在init()中缓存静态数据或完成要在初始化期间完成的代价昂贵的操作。例如,一个最佳实践是使用实现了javax.sql.DataSource接口的JDBC连接池。
DataSource从JNDI树中获得。每调用一次SQL就要使用JNDI查找DataSource是非常昂贵的工作,而且严重影响了应用的性能。Servlet的init()方法可以用于获取DataSource并缓存它以便之后的重用:
publicclassControllerServletextendsHttpServlet
{
privatejavax.sql.DataSourcetestDS=null;
publicvoidinit(ServletConfigconfig)throwsServletException
{
super.init(config);
Contextctx=null;
try
{
ctx=newInitialContext();
testDS=(javax.sql.DataSource)ctx.lookup(jdbc/testDS);
}
catch(NamingExceptionne)
{
ne.printStackTrace();
}
catch(Exceptione)
{
e.printStackTrace();
}
}
publicjavax.sql.DataSourcegetTestDS()
{
returntestDS;
}
...
...
}
技术2:禁用servlet和Jsp的自动装载功能
当每次修改了Servlet/JSP之后,你将不得不重新启动服务器。由于自动装载功能减少开发时间,该功能被认为在开发阶段是非常有用的。但是,它在运行阶段是非常昂贵的;servlet/JSP由于不必要的装载,增加类装载器的负担而造成很差的性能。同样,这会使你的应用由于已被某种类装载器装载的类不能和当前类装载器装载的类不能相互协作而出现奇怪的冲突现象。因此,在运行环境中为了得到更好的性能,关闭servlet/JSP的自动装载功能。
技术3:控制HttpSession
许多应用需要一系列客户端的请求,因此他们能互相相关联。由于HTTP协议是无状态的,所以基于Web的应用需要负责维护这样一个叫做session的状态。为了支持必须维护状态的应用,Javaservlet技术提供了管理session和允许多种机制实现session的API。HttpSession对象扮演了session,但是使用它需要成本。无论何时HttpSession被使用和重写,它都由servlet读取。你可以通过使用下面的技术来提高性能:
l在JSP页面中不要创建默认的HttpSession:默认情况下,JSP页面创建HttpSession。如果你在JSP页面中不用HttpSession,为了节省性能开销,使用下边的页面指令可以避免自动创建HttpSession对象:
<%@pagesession=false%>
1)不要将大的对象图存储在HttpSession中:如果你将数据当作一个大的对象图存储在HttpSession中,应用服务器每次将不得不处理整个HttpSession对象。这将迫使Java序列化和增加计算开销。由于序列化的开销,随着存储在HttpSession对象中数据对象的增大,系统的吞吐量将会下降。
2)用完后释放HttpSession:当不在使用HttpSession时,使用HttpSession.invalidate()方法使sesion失效。
3)设置超时值:一个servlet引擎有一个默认的超时值。如果你不删除session或者一直把session用到它超时的时候,servlet引擎将把session从内存中删除。由于在内存和垃圾收集上的开销,session的超时值越大,它对系统弹性和性能的影响也越大。试着将session的超时值设置的尽可能低。
技术4:使用gzip压缩
压缩是删除冗余信息的作法,用尽可能小的空间描述你的信息。使用gzip(GNUzip)压缩文档能有效地减少下载HTML文件的时间。你的信息量越小,它们被送出的速度越快。因此,如果你压缩了由你web应用产生的内容,它到达用户并显示在用户屏幕上的速度就越快。不是任何浏览器都支持gzip压缩的,但检查一个浏览器是否支持它并发送gzip压缩内容到浏览器是很容易的事情。下边的代码段说明了如何发送压缩的内容。
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException
{
OutputStreamout=null
//ChecktheAccepting-EncodingheaderfromtheHTTPrequest.
//Iftheheaderincludesgzip,chooseGZIP.
//Iftheheaderincludescompress,chooseZIP.
//Otherwisechoosenocompression.
Stringencoding=request.getHeader(Accept-Encoding);
if(encoding!=nullencoding.indexOf(gzip)!=-1)
{
response.setHeader(Content-Encoding,gzip);
out=newGZIPOutputStream(response.getOutputStream());
}
elseif(encoding!=nullencoding.indexOf(compress)!=-1)
{
response.setHeader(Content-Encoding,compress);
out=newZIPOutputStream(response.getOutputStream());
}
else
{
out=response.getOutputStream();
}
...
...
}
技术5:不要使用SingleThreadModel
SingleThreadModel保证servlet一次仅处理一个请求。如果一个servlet实现了这个接口,servlet引擎将为每个新的请求创建一个单独的servlet实例,这将引起大量的系统开销。如果你需要解决线程安全问题,请使用其他的办法替代这个接口。SingleThreadModel在Servlet2.4中是不再提倡使用。
技术6:使用线程池
servlet引擎为每个请求创建一个单独的线程,将该线程指派给service()方法,然后在service()方法执行完后删除该线程。默认情况下,servlet引擎可能为每个请求创建一个新的线程。由于创建和删除线程的开销是很昂贵的,于是这种默认行为降低了系统的性能。我们可以使用线程池来提高性能。根据预期的并发用户数量,配置一个线程池,设置好线程池里的线程数量的最小和最大值以及增长的最小和最大值。起初,servlet引擎创建一个线程数与配置中的最小线程数量相等的线程池。然后servlet引擎把池中的一个线程指派给一个请求而不是每次都创建新的线程,完成操作之后,servlet引擎把线程放回到线程池中。使用线程池,性能可以显著地提高。如果需要,根据线程的最大数和增长数,可以创建更多的线程。
技术7:选择正确的包括机制
在JSP页面中,有两中方式可以包括文件:包括指令(<%@includefile=test.jsp%>)和包括动作(<jsp:includepage=test.jspflush=true/>)。包括指令在编译阶段包括一个指定文件的内容;例如,当一个页面编译成一个servlet时。包括动作是指在请求阶段包括文件内容;例如,当一个用户请求一个页面时。包括指令要比包括动作快些。因此除非被包括的文件经常变动,否则使用包括指令将会获得更好的性能。
技术8:在useBean动作中使用合适的范围
使用JSP页面最强大方式之一是和JavaBean组件协同工作。JavaBean使用<jsp:useBean>标签可以嵌入到JSP页面中。语法如下:
<jsp:useBeanid=namescope=page|request|session|applicationclass=
package.classNametype=typeName>
</jsp:useBean>
scope属性说明了bean的可见范围。scope属性的默认值是page。你应该根据你应用的需求选择正确的范围,否则它将影响应用的性能。
例如,如果你需要一个专用于某些请求的对象,但是你把范围设置成了session,那么那个对象将在请求结束之后还保留在内存中。它将一直保留在内存中除非你明确地把它从内存中删除、使session无效或session超时。如果你没有选择正确的范围属性,由于内存和垃圾收集的开销将会影响性能。因此为对象设置合适的范围并在用完它们之后立即删除。
杂项技术
1)避免字符串连接:由于String对象是不可变对象,使用“+”操作符将会导致创建大量的零时对象。你使用的“+”越多,产出的零时对象就越多,这将影响性能。当你需要连接字符串时,使用StringBuffer替代“+”操作。
2)避免使用System.out.println:System.out.println同步处理磁盘输入/输出,这大大地降低了系统吞吐量。尽可能地避免使用System.out.println。尽管有很多成熟的调试工具可以用,但有时System.out.println为了跟踪、或调试的情况下依然很有用。你应该配置System.out.println仅在错误和调试阶段打开它。使用finalBoolean型的变量,当配置成false时,在编译阶段完成优化检查和执行跟踪输出。
3)ServletOutputStream与PrintWriter比较:由于字符输出流和把数据编码成字节,使用PrintWriter引入了小的性能开销。因此,PrintWriter应该用在所有的字符集都正确地转换做完之后。另一方面,当你知道你的servlet仅返回二进制数据,使用ServletOutputStream,因为servlet容器不编码二进制数据,这样你就能消除字符集转换开销。
总结
搜索引擎营销与优化和div+css网页制作: 网站SEO工作流程图
SEO工作第一步关键字锁定
再强的SEO专家都不可能在一个网站内一网打尽所有关键词在一个网站内生硬的做不相干的热门关键词也是不利于网站的所有我们必须选定一个符合网站的定位方向的关键词关键字的锁定与选择是SEO工作的起头也是决定效益最重要的一步没有选择合适的关键词您将无法做到有的放矢
SEO工作第二步针对搜索引擎友好规范设计
在大的公司内这块工作需要UIUEDQA及程序开发部门协同完成前期设计后续需要持续分析网站对搜寻引擎的友善度了解目前对搜寻引擎爬行的障碍与需要修正的部份让网站能够符合搜寻引擎的爬行Crawl惯性轻松顺畅地漫游你的网站
SEO工作第三步站点内容强化
随着搜索引擎技术的进步内容为王更显其真理性内容除了尽量原创性外还需要网站内容与对应的关键字做最恰当的融合其中包含了Title关键词Meta关键词Header关键词Body内容Alt关键词等等举例说如果某网页的内容是写QQ空间免费代码我们可能就需要将QQ空间QQ空间代码这两个关键字放入上述的标签当中借此让搜寻引擎了解该网页的主题中心思想TopicofPage是什么
SEO工作第四步链接建立
链接被认为是SEO中最重要的工作之一其中包括向搜索引擎递交收录与其他站点进行交换友情链接或者购买付费链接等等链接也很有技巧性链接的质量直接影响SEO的成效及该站点在搜索引擎中的各关键词排名
SEO工作第五步分析与观察
分析和观察是SEO人几乎每天都要做的工作SEO整个工作流程不是一条流水线而是轮回的流程SEOer利用统计分析工具持续追踪锁定的关键字消长分析关键字排名问题解决排名困境了解搜寻引擎每次更新的重点与特性分析后及时进行调整并重新轮回
SEO工作第六步网站数据分析
这个部份就是要对SEO执行的成效做效益分析互联网孵化专家黄相如指出首先当然要了解执行前后的网站数据变化访客数的增加访客来源的比例变动透过搜寻引擎了解访客的造访情况网站整体转换率的变动等等对于数据的掌握度越高就越能够了解执行前后的消长变化
除此之外更能透过数据的呈现了解关键字的选择是否正确借由了解访客从不同关键字进入网站之后的转换率Conversion平均停留时间AvgTimeonSite等等的信息来回馈到最初的关键字锁定策略的正确性当然也可进行关键字的调整执行关键词调整轮回提升执行SEO的效益
再强的SEO专家都不可能在一个网站内一网打尽所有关键词在一个网站内生硬的做不相干的热门关键词也是不利于网站的所有我们必须选定一个符合网站的定位方向的关键词关键字的锁定与选择是SEO工作的起头也是决定效益最重要的一步没有选择合适的关键词您将无法做到有的放矢
SEO工作第二步针对搜索引擎友好规范设计
在大的公司内这块工作需要UIUEDQA及程序开发部门协同完成前期设计后续需要持续分析网站对搜寻引擎的友善度了解目前对搜寻引擎爬行的障碍与需要修正的部份让网站能够符合搜寻引擎的爬行Crawl惯性轻松顺畅地漫游你的网站
SEO工作第三步站点内容强化
随着搜索引擎技术的进步内容为王更显其真理性内容除了尽量原创性外还需要网站内容与对应的关键字做最恰当的融合其中包含了Title关键词Meta关键词Header关键词Body内容Alt关键词等等举例说如果某网页的内容是写QQ空间免费代码我们可能就需要将QQ空间QQ空间代码这两个关键字放入上述的标签当中借此让搜寻引擎了解该网页的主题中心思想TopicofPage是什么
SEO工作第四步链接建立
链接被认为是SEO中最重要的工作之一其中包括向搜索引擎递交收录与其他站点进行交换友情链接或者购买付费链接等等链接也很有技巧性链接的质量直接影响SEO的成效及该站点在搜索引擎中的各关键词排名
SEO工作第五步分析与观察
分析和观察是SEO人几乎每天都要做的工作SEO整个工作流程不是一条流水线而是轮回的流程SEOer利用统计分析工具持续追踪锁定的关键字消长分析关键字排名问题解决排名困境了解搜寻引擎每次更新的重点与特性分析后及时进行调整并重新轮回
SEO工作第六步网站数据分析
这个部份就是要对SEO执行的成效做效益分析互联网孵化专家黄相如指出首先当然要了解执行前后的网站数据变化访客数的增加访客来源的比例变动透过搜寻引擎了解访客的造访情况网站整体转换率的变动等等对于数据的掌握度越高就越能够了解执行前后的消长变化
除此之外更能透过数据的呈现了解关键字的选择是否正确借由了解访客从不同关键字进入网站之后的转换率Conversion平均停留时间AvgTimeonSite等等的信息来回馈到最初的关键字锁定策略的正确性当然也可进行关键字的调整执行关键词调整轮回提升执行SEO的效益
今天为大家写一套百度SEO 优化全套教程。
本文为转载:
这个教程都是本人自己实践得到的经验。
由于时间的关系,一星期出一篇,首发SEOWHY大家可以转载,但是转载的名字要写上小三儿。
一些SEO新手总是喜欢把已经优化好的网站再做宣传,在实践中认为,先把网站权重做好再做SEO优化效果比先做优化的好!我做过一些站,百度三个小时收录首页,下面我来说说如何让百度在三天之内收录你的网页准备好你要的程序,一定要在自己的电脑上把程序编好再上传到你的空间或服务器上。不会编的可以上网上找找一些源码(要开源的哦,要不然以后你可不好改)。
首先你要选好一个或几个关键词,新手建议选一个关键词(为了新站的发展,不要选太热门的词,百度指数在500-1000左右)。
1.新站的建立。
第一步:写好网站标题(title),网站标题一定不要改(有些人做了几个月没有流量就总是改标题,这是错误的。)。
问:那意思永远不要改标题了!那不是永远没有流量了吗?
答:没有流量说明,你的网站没有优化好,没有优化好怎么办,改标题了,什么时候改标题,网站权重高的时候就可以改了。
问:怎么样才能看出来网站在百度的权重呢?
答:百度上SITE一下你的网站,收录中有当天的收录的网页,说明你的网站权重增加。(例如今天是4月1号SITE:你的网站,百度快照有2009-4-1说明网站权重增加。)
第二步:写好你网站关键词(keywords)。
问:怎么样写好我想要的关键词呢?
答:如何不会写的话可以不要写,百度收录正常了再写(新手建议),关键词选择方法:例如我做一个音乐网站,关键词:音乐下载,免费音乐,在线音乐,关键词不要多写,有些人一写就是一大堆,这样对网站优化很不利。
第三步:写好网站(description)网站description在百度和GOOGLE中非常的重要。
问:重要要怎么写啊?
答:新手建议不要写,你在网站中增加你要的关键词,我一般做网站都不写description,因为我也不太会写description,如何想写的话你可看看别的网站是怎么写的,把别人网站排名很高的description复制下来,自己改改,一定要改,不改的话,百度认为你作弊,会被K的哦。
问:怎么看出来description在百度中比较重要呢?
答:你可以在百度中搜索一下,比如:音乐。
一听音乐网:中国最大的在线音乐网站(网站的标题)。
免费音乐试听下载,提供网友翻唱原创音乐平台。(写了description)。
QQ163音乐网--小游戏-在线试听---www.qq163.com(网站的标题)。
4399小游戏┊手机世界┊网址之家┊动漫flash┊iP查询┊qq表情大全┊音乐MTV┊MM翻....(没写description)。
大家可以看到了吧,一个写了,和没写的区别。
问:没写description的网站排名会高吗?
答:写了会排名好一些,对优化影响不大。【以后几篇我会教大怎么不写(description)怎么优化】
【一个刚建立的网站已经成型了】
2.内容的添加。
内容添加有两种,一是采集,二是手动添加。
手动添加如何不改的话和采集没有什么区别。
问:采集不是原创的文章吗?会被降权的。
答:对于我这种人比较懒喜欢采集,我把采集的东西处理一下,就可以变成原创了。
注:我教大家一个新方法,可能网上有,把采集的文章去掉前100个字就可以了。或者直接采集博客的文章(可改可不改)。
问:采集这么多文章怎么去掉前100个字啊,不累死啊
答:你可以找人写采集器啊,我是不会,我就采集博客的文章,这样内容就有了!
3.如何让百度快速收录你的网站。
我有些网站,建站3个小时收录网站首页,什么网站在这里我就不说了,容易被K,有多少个网站呢,我都不记得了,我是一个做站卖站的人!
问:怎么才能让网站快速收录呢。
答:这就是勤奋和智慧的问题了。
快速收录方法:
(1)做友情链接。(2)宣传你的网站。(3)在百度上提交你的网站(你等吧,等百度收录你吧)。
(1)有些人说了,百度不收录,不做友情链接,我也会这样做的,百度不收录我也不跟你友情链接。
问:不做友情链接,百度不是,难收录了吗?
答:用第2种方法啊,宣传你的网站
(2)怎么样宣传你的网站,当然是用你的键盘和鼠标去宣传了。呵呵,看了这么长了,也乐一乐吧。
问:我喜欢用一些群发软件去宣传快。
答:错,千万不要用群发软件去宣传,这会让你的网站降权的,百度不会收录这样的网站的,一夜之间你的网址出现在各个网站中。
问:那我怎么去宣传呢?
答:我用的方法是在论坛上做宣传。
问:论坛会让你宣传吗?
答:我不会直接像发广告一样去发贴子的。
问:不发广告,怎么宣传啊?
答:我一般就发3-5个贴子,以下的时间就是回贴和顶贴了,几本都是见到贴子就顶。【顶贴也要的方法的】
注:发贴一定要有方法:
第一步,一定要找论坛权重高的论坛去发贴。【怎么看权重,上面有,自己找】
第二步,在网站找一些要相当引人的文章或贴了,在权重高的论坛去发。
第三步,让你的贴子让大家去顶,一直顶,没人顶的时候,自己要顶,换号顶,
问:得顶多长时间啊,一夜啊。
答:你想顶一夜也可以,我不介意,笑话啊顶个2-3小时就可以了,在百度上能查到你发的贴子或百度收录你的首页就OK了,百度收录这样的贴子非常快,贴子要加上你的网址,有没有链接都可以。
问:百度收录了我发的贴了但是没有收录我的网站,怎么办?
答:你的贴子一定不要在一个论坛上发,发个两三个论坛就可以了,随时去顶你的贴子,让贴子一直在版块的第一页上,别的时间你就可以去顶贴子了。
注:顶贴子,一定要顶新贴,就是刚发的贴子。
问:怎么找新贴子啊?
答:这个方法,文字不太好说,有喜欢我的朋友可以加QQ群:2154850在群里我会教大家的,找新贴很好找。
【以上的方法是新站建站和百度快速收录的方法,按我的方法去做,勤奋点的人一般3个小时百度就会收录的,如何不收录,三天之内就按我的方法一直做下去,三天保证收录,不收录我帮你,被K的域名,我也没办法】
4.注意事项。
以上的方法是对一般的网站而言的,如果你的网站前期做好优化,我的建议如下:
(1)优化不要过度,不要出现关键词堆积的现象你可以在站长工具中去查查你的关键词密度,一般在3%-9%中间就可以了。
(2)如果有或关键词出现不要和网页一个颜色,例如:我的网站以黑色为主题,为了隐藏我的关键词,把关键词变成了黑色字,这是错误的,千万不要这样做,或者网站背景是黑色图片,关键字也不要是黑色,我有一个网站就出现了这样的错误,结果2小时收录首页,第二天一查,没了,结果我改了过来,2个星期后又收录了。
(3)就是采集的内容了,一定要天天采集,要定时采集,在以后的文章中,我会教大家怎么处理你的网站内容,什么时候采集,采集多少。
(4)百度收录了,马上去找站长做友情链接吧,多点友情链接。
(5)说到友情链接我想起来一件事,我非常讨厌一做友情链接时问你,你的站PR为多好,我的站PR=1不跟PR1的做,靠不做不就做,以后你求我,我也不做,你的站明明是做百度的,为什么总是要问PR呢,PR和百度一点关系都没有,有些站长想PR都想疯了,天呢,你快给PR磕俩头。还有一些站长不喜欢和只收录首页的人做友情链接,没办法,谁让咱是新站呢,如果我有100个站的话,我不会去求爷爷告奶奶似的求你做链接。这还好一点,不做就不做,气人的是,和你做了友情链接没几天撤了,TMD玩我,这样的直接在我QQ备住上都标上,以后求我都不做,还有些人,做了一大堆友情链接,最后把你的站的链接放到次页上去了,人家说了,你的站收录不好,放到次页上了,我一查,你的站和我的站没有什么别区,还不如我的呢,靠,不做了,撤了,这样的人,直接就撤链接。我建议大家做链接,要诚心点,做就做长点,别以为你的站行了,就把链接撤了,当处你的站还不如人家呢,人家是帮你,如果有人做链接可以找我,只要百度有收录,长时间做链接,不K不撤,你不撤我不撤。
行了,说多了,打字多了,手疼了,下个星期继续,说一说以下的课程。
1.新站建立和百度快速收录方法(今天发的哦)。
2.内容的采集方法和你的坚持。
3.初级百度SEO优化。
4.中级百度SEO优化。
5.高级百度SEO优化。
6.单关键词快速优化。
7.长尾词优化。
8.网站模试与发展。
9.网站盈利与广告优化。
10.如何留住你的用户。
以上教程出完,再出一套GOOGLE教程,可以中间有所变成。
个人建议,不一定优化百要做百度和GOOGLE的,你要是做好YAHOO和有道的,也相当不错了。
以后出的教程以问答型式放出,比较好理解。
这个教程都是本人自己实践得到的经验。
由于时间的关系,一星期出一篇,首发SEOWHY大家可以转载,但是转载的名字要写上小三儿。
一些SEO新手总是喜欢把已经优化好的网站再做宣传,在实践中认为,先把网站权重做好再做SEO优化效果比先做优化的好!我做过一些站,百度三个小时收录首页,下面我来说说如何让百度在三天之内收录你的网页准备好你要的程序,一定要在自己的电脑上把程序编好再上传到你的空间或服务器上。不会编的可以上网上找找一些源码(要开源的哦,要不然以后你可不好改)。
首先你要选好一个或几个关键词,新手建议选一个关键词(为了新站的发展,不要选太热门的词,百度指数在500-1000左右)。
1.新站的建立。
第一步:写好网站标题(title),网站标题一定不要改(有些人做了几个月没有流量就总是改标题,这是错误的。)。
问:那意思永远不要改标题了!那不是永远没有流量了吗?
答:没有流量说明,你的网站没有优化好,没有优化好怎么办,改标题了,什么时候改标题,网站权重高的时候就可以改了。
问:怎么样才能看出来网站在百度的权重呢?
答:百度上SITE一下你的网站,收录中有当天的收录的网页,说明你的网站权重增加。(例如今天是4月1号SITE:你的网站,百度快照有2009-4-1说明网站权重增加。)
第二步:写好你网站关键词(keywords)。
问:怎么样写好我想要的关键词呢?
答:如何不会写的话可以不要写,百度收录正常了再写(新手建议),关键词选择方法:例如我做一个音乐网站,关键词:音乐下载,免费音乐,在线音乐,关键词不要多写,有些人一写就是一大堆,这样对网站优化很不利。
第三步:写好网站(description)网站description在百度和GOOGLE中非常的重要。
问:重要要怎么写啊?
答:新手建议不要写,你在网站中增加你要的关键词,我一般做网站都不写description,因为我也不太会写description,如何想写的话你可看看别的网站是怎么写的,把别人网站排名很高的description复制下来,自己改改,一定要改,不改的话,百度认为你作弊,会被K的哦。
问:怎么看出来description在百度中比较重要呢?
答:你可以在百度中搜索一下,比如:音乐。
一听音乐网:中国最大的在线音乐网站(网站的标题)。
免费音乐试听下载,提供网友翻唱原创音乐平台。(写了description)。
QQ163音乐网--小游戏-在线试听---www.qq163.com(网站的标题)。
4399小游戏┊手机世界┊网址之家┊动漫flash┊iP查询┊qq表情大全┊音乐MTV┊MM翻....(没写description)。
大家可以看到了吧,一个写了,和没写的区别。
问:没写description的网站排名会高吗?
答:写了会排名好一些,对优化影响不大。【以后几篇我会教大怎么不写(description)怎么优化】
【一个刚建立的网站已经成型了】
2.内容的添加。
内容添加有两种,一是采集,二是手动添加。
手动添加如何不改的话和采集没有什么区别。
问:采集不是原创的文章吗?会被降权的。
答:对于我这种人比较懒喜欢采集,我把采集的东西处理一下,就可以变成原创了。
注:我教大家一个新方法,可能网上有,把采集的文章去掉前100个字就可以了。或者直接采集博客的文章(可改可不改)。
问:采集这么多文章怎么去掉前100个字啊,不累死啊
答:你可以找人写采集器啊,我是不会,我就采集博客的文章,这样内容就有了!
3.如何让百度快速收录你的网站。
我有些网站,建站3个小时收录网站首页,什么网站在这里我就不说了,容易被K,有多少个网站呢,我都不记得了,我是一个做站卖站的人!
问:怎么才能让网站快速收录呢。
答:这就是勤奋和智慧的问题了。
快速收录方法:
(1)做友情链接。(2)宣传你的网站。(3)在百度上提交你的网站(你等吧,等百度收录你吧)。
(1)有些人说了,百度不收录,不做友情链接,我也会这样做的,百度不收录我也不跟你友情链接。
问:不做友情链接,百度不是,难收录了吗?
答:用第2种方法啊,宣传你的网站
(2)怎么样宣传你的网站,当然是用你的键盘和鼠标去宣传了。呵呵,看了这么长了,也乐一乐吧。
问:我喜欢用一些群发软件去宣传快。
答:错,千万不要用群发软件去宣传,这会让你的网站降权的,百度不会收录这样的网站的,一夜之间你的网址出现在各个网站中。
问:那我怎么去宣传呢?
答:我用的方法是在论坛上做宣传。
问:论坛会让你宣传吗?
答:我不会直接像发广告一样去发贴子的。
问:不发广告,怎么宣传啊?
答:我一般就发3-5个贴子,以下的时间就是回贴和顶贴了,几本都是见到贴子就顶。【顶贴也要的方法的】
注:发贴一定要有方法:
第一步,一定要找论坛权重高的论坛去发贴。【怎么看权重,上面有,自己找】
第二步,在网站找一些要相当引人的文章或贴了,在权重高的论坛去发。
第三步,让你的贴子让大家去顶,一直顶,没人顶的时候,自己要顶,换号顶,
问:得顶多长时间啊,一夜啊。
答:你想顶一夜也可以,我不介意,笑话啊顶个2-3小时就可以了,在百度上能查到你发的贴子或百度收录你的首页就OK了,百度收录这样的贴子非常快,贴子要加上你的网址,有没有链接都可以。
问:百度收录了我发的贴了但是没有收录我的网站,怎么办?
答:你的贴子一定不要在一个论坛上发,发个两三个论坛就可以了,随时去顶你的贴子,让贴子一直在版块的第一页上,别的时间你就可以去顶贴子了。
注:顶贴子,一定要顶新贴,就是刚发的贴子。
问:怎么找新贴子啊?
答:这个方法,文字不太好说,有喜欢我的朋友可以加QQ群:2154850在群里我会教大家的,找新贴很好找。
【以上的方法是新站建站和百度快速收录的方法,按我的方法去做,勤奋点的人一般3个小时百度就会收录的,如何不收录,三天之内就按我的方法一直做下去,三天保证收录,不收录我帮你,被K的域名,我也没办法】
4.注意事项。
以上的方法是对一般的网站而言的,如果你的网站前期做好优化,我的建议如下:
(1)优化不要过度,不要出现关键词堆积的现象你可以在站长工具中去查查你的关键词密度,一般在3%-9%中间就可以了。
(2)如果有或关键词出现不要和网页一个颜色,例如:我的网站以黑色为主题,为了隐藏我的关键词,把关键词变成了黑色字,这是错误的,千万不要这样做,或者网站背景是黑色图片,关键字也不要是黑色,我有一个网站就出现了这样的错误,结果2小时收录首页,第二天一查,没了,结果我改了过来,2个星期后又收录了。
(3)就是采集的内容了,一定要天天采集,要定时采集,在以后的文章中,我会教大家怎么处理你的网站内容,什么时候采集,采集多少。
(4)百度收录了,马上去找站长做友情链接吧,多点友情链接。
(5)说到友情链接我想起来一件事,我非常讨厌一做友情链接时问你,你的站PR为多好,我的站PR=1不跟PR1的做,靠不做不就做,以后你求我,我也不做,你的站明明是做百度的,为什么总是要问PR呢,PR和百度一点关系都没有,有些站长想PR都想疯了,天呢,你快给PR磕俩头。还有一些站长不喜欢和只收录首页的人做友情链接,没办法,谁让咱是新站呢,如果我有100个站的话,我不会去求爷爷告奶奶似的求你做链接。这还好一点,不做就不做,气人的是,和你做了友情链接没几天撤了,TMD玩我,这样的直接在我QQ备住上都标上,以后求我都不做,还有些人,做了一大堆友情链接,最后把你的站的链接放到次页上去了,人家说了,你的站收录不好,放到次页上了,我一查,你的站和我的站没有什么别区,还不如我的呢,靠,不做了,撤了,这样的人,直接就撤链接。我建议大家做链接,要诚心点,做就做长点,别以为你的站行了,就把链接撤了,当处你的站还不如人家呢,人家是帮你,如果有人做链接可以找我,只要百度有收录,长时间做链接,不K不撤,你不撤我不撤。
行了,说多了,打字多了,手疼了,下个星期继续,说一说以下的课程。
1.新站建立和百度快速收录方法(今天发的哦)。
2.内容的采集方法和你的坚持。
3.初级百度SEO优化。
4.中级百度SEO优化。
5.高级百度SEO优化。
6.单关键词快速优化。
7.长尾词优化。
8.网站模试与发展。
9.网站盈利与广告优化。
10.如何留住你的用户。
以上教程出完,再出一套GOOGLE教程,可以中间有所变成。
个人建议,不一定优化百要做百度和GOOGLE的,你要是做好YAHOO和有道的,也相当不错了。
以后出的教程以问答型式放出,比较好理解。
AS3程序优化
最近我在整理以前的AS1,AS2代码的时候,发现了很多好玩的小DEMO。不过在我改成AS3之后,性能并不是让我很满意,AS3很完整,很程序化,不过在一些性能方面,如果你没有及时释放掉内存,可能会跑的比AS2来编写的还慢,很奇怪吧。不过在FlashPlayer10推出之后,有一个对性能极大有帮助的命令很重要,就是:Vector,感兴趣的,可以打开帮助文档好好看看,不过我今天并不是要讲这个。
我也是刚看到ArmandNiculescu的AS3PerformanceOptimization的这篇文章,才随机写写。在我之前有篇文章写过对于全选数组的方法,怎么样才是最好。同时我顺便把他的文章,重要的一些方式提出来,放在自己的BLOG,同时也是给自己做个资料备份。
我个人认为,一款程序的性能高与低,完全是在于程序员的写代码的方法,虽然我提倡的很自由的代码写作方法,不过,在需要耗费大量CPU性能的地方,还是需要按照严格的:命令的规范,变量定义的规范等等。特别是你如果已经知道某个变量大概的范围,比如是int类型的,就不要偷懒搞成Number类型。
比如把偷懒的一长句改成勤劳的几个小短句
varary:Array=newArray();
for(vari:int=0;idatas.length;i++){
ary.push(i);
}
写成
varary:Array=newArray();
varn:uint=datas.length;
vari:int;
for(i=0;in;i++){
ary=i;
}
这样的做法,是对性能是有非常大的帮助的,再比如,我们已经知道一个数组(Array),里面包含的全都是Object.那么需要知道每个Object.id的话,这样写
varcurrentId:int=array.id
需要改写成下面的格式就会好点
varobj:Object=array;
varcurrentId:int=obj.id;
你可以注意到,这些所谓的性能优化,就是一个要点,把简单的写法写的复杂了。不过这是一个好习惯,对你的程序的性能优化也是有非常大的帮助的。当然这些的优化将会在你使用一千次,或者上万次就会体现出来了。
在一些算法上,尽量用自己写的构造函数,比如那篇文章里提到了比较两个数大小的构造函数,一般人偷懒就直接来:
varx:int=Math.min(a,b)
这个很简单,我也很喜欢,如果不是自己去写一些变态的运算法则,我一般都是这么写的。不过,不过,个人建议还是这个好:
varx:int=(ab)?a:b;
简直好太多了,对于这种写法在辨别条件语句的时候,是非常好的。
同时也要注意了,数组的一些语句并不好用,比如push(),pop(),shift()orunshift();当然这些性能上的优越也是在大量的运算下才会体现出来,如果你是那种力求完美的家伙,就该改用自己写的构造函数。
当然如果你足够变态,像下面的语句改写:
varx:int=a*2;
vary:int=b*16;
varz:int=c/4;
写成
varx:int=a1;//2^1=2;
vary:int=b4;//2^4=16;
varz:int=c2;//2^2=4;
呵呵,这个就过于烦琐了,一不小心还会搞错。起码我是不会用。还有其他的方法都可以去看看里面的文章,不过我一般用以上几个,其他的过于烦琐,就懒的用了,除非真的碰到上万个,极端夸张的运算方式。下面就来说下怎么搞定上万,不,就上千个图标的排列吧。
我们试想一种情况(当然,本人是绝对反对这种方式的),我们在点击某个点,然后蹦的跳出来上千个细小的图标。然后在屏幕上晃啊晃的。如果你写成MovieClip,Sprite,Shape等等,甚至你开启了cacheAsBitmap为true,我保证,你的电脑绝对会卡死你(当然,如果让你老板看到了也是不错的,你看,我的电脑很破旧了,该升级了)。那么我们该如何解决这个呢。
第一,不要那么多的细小的图标,换成50个,50个的来。这是我比较提倡的方式,毕竟操作者谁也不喜欢满屏幕都在晃。
第二,化你的MovieClip也好,Sprite也好,Shape也好,通通搞成Bitmap。明白了吧,而且你如果删除Bitmap的话,还可以用dispose(),命令清空内存。
那么,你肯定会说,我在舞台上addChild一个Sprite,然后再removeChild,是否会清空掉内存呢?很遗憾,不会。不过在我两个多小时无聊的测试中,我发现,只要你在后期removeChild后,虽然内存未清空,在不停的运算中,不停的增长,但是到了一定的阶段,他就STOP了,WHY?我不知道。不过哪怕就算是这样,内存占用的状况还是不容乐观。所以改写成Bitmap,就是最好的方式。那怎么做?
先期,你addChild一个Bitmap后,在后面不需要的时候,在removeChild之前,加上Bitmap.bitmapData.dispose();和Bitmap.bitmapData=null;这个很重要。
差点忘了也是很重要的一个,就是记得要removeAddEventListener。监听事件如果不需要了,就一定要remove掉。特别是EnterFrame事件。
头晕了没?我想你已经晕了,性能优化一般都是源于良好的写作习惯,和追求完美的精神。在FLASH上,你就需要做到:
体积能小就小,
性能能快就快,
界面能简洁就简洁,
组件能不用就不用,
图片能用画就画。
其他的暂时没想到。:)
我也是刚看到ArmandNiculescu的AS3PerformanceOptimization的这篇文章,才随机写写。在我之前有篇文章写过对于全选数组的方法,怎么样才是最好。同时我顺便把他的文章,重要的一些方式提出来,放在自己的BLOG,同时也是给自己做个资料备份。
我个人认为,一款程序的性能高与低,完全是在于程序员的写代码的方法,虽然我提倡的很自由的代码写作方法,不过,在需要耗费大量CPU性能的地方,还是需要按照严格的:命令的规范,变量定义的规范等等。特别是你如果已经知道某个变量大概的范围,比如是int类型的,就不要偷懒搞成Number类型。
比如把偷懒的一长句改成勤劳的几个小短句
varary:Array=newArray();
for(vari:int=0;idatas.length;i++){
ary.push(i);
}
写成
varary:Array=newArray();
varn:uint=datas.length;
vari:int;
for(i=0;in;i++){
ary=i;
}
这样的做法,是对性能是有非常大的帮助的,再比如,我们已经知道一个数组(Array),里面包含的全都是Object.那么需要知道每个Object.id的话,这样写
varcurrentId:int=array.id
需要改写成下面的格式就会好点
varobj:Object=array;
varcurrentId:int=obj.id;
你可以注意到,这些所谓的性能优化,就是一个要点,把简单的写法写的复杂了。不过这是一个好习惯,对你的程序的性能优化也是有非常大的帮助的。当然这些的优化将会在你使用一千次,或者上万次就会体现出来了。
在一些算法上,尽量用自己写的构造函数,比如那篇文章里提到了比较两个数大小的构造函数,一般人偷懒就直接来:
varx:int=Math.min(a,b)
这个很简单,我也很喜欢,如果不是自己去写一些变态的运算法则,我一般都是这么写的。不过,不过,个人建议还是这个好:
varx:int=(ab)?a:b;
简直好太多了,对于这种写法在辨别条件语句的时候,是非常好的。
同时也要注意了,数组的一些语句并不好用,比如push(),pop(),shift()orunshift();当然这些性能上的优越也是在大量的运算下才会体现出来,如果你是那种力求完美的家伙,就该改用自己写的构造函数。
当然如果你足够变态,像下面的语句改写:
varx:int=a*2;
vary:int=b*16;
varz:int=c/4;
写成
varx:int=a1;//2^1=2;
vary:int=b4;//2^4=16;
varz:int=c2;//2^2=4;
呵呵,这个就过于烦琐了,一不小心还会搞错。起码我是不会用。还有其他的方法都可以去看看里面的文章,不过我一般用以上几个,其他的过于烦琐,就懒的用了,除非真的碰到上万个,极端夸张的运算方式。下面就来说下怎么搞定上万,不,就上千个图标的排列吧。
我们试想一种情况(当然,本人是绝对反对这种方式的),我们在点击某个点,然后蹦的跳出来上千个细小的图标。然后在屏幕上晃啊晃的。如果你写成MovieClip,Sprite,Shape等等,甚至你开启了cacheAsBitmap为true,我保证,你的电脑绝对会卡死你(当然,如果让你老板看到了也是不错的,你看,我的电脑很破旧了,该升级了)。那么我们该如何解决这个呢。
第一,不要那么多的细小的图标,换成50个,50个的来。这是我比较提倡的方式,毕竟操作者谁也不喜欢满屏幕都在晃。
第二,化你的MovieClip也好,Sprite也好,Shape也好,通通搞成Bitmap。明白了吧,而且你如果删除Bitmap的话,还可以用dispose(),命令清空内存。
那么,你肯定会说,我在舞台上addChild一个Sprite,然后再removeChild,是否会清空掉内存呢?很遗憾,不会。不过在我两个多小时无聊的测试中,我发现,只要你在后期removeChild后,虽然内存未清空,在不停的运算中,不停的增长,但是到了一定的阶段,他就STOP了,WHY?我不知道。不过哪怕就算是这样,内存占用的状况还是不容乐观。所以改写成Bitmap,就是最好的方式。那怎么做?
先期,你addChild一个Bitmap后,在后面不需要的时候,在removeChild之前,加上Bitmap.bitmapData.dispose();和Bitmap.bitmapData=null;这个很重要。
差点忘了也是很重要的一个,就是记得要removeAddEventListener。监听事件如果不需要了,就一定要remove掉。特别是EnterFrame事件。
头晕了没?我想你已经晕了,性能优化一般都是源于良好的写作习惯,和追求完美的精神。在FLASH上,你就需要做到:
体积能小就小,
性能能快就快,
界面能简洁就简洁,
组件能不用就不用,
图片能用画就画。
其他的暂时没想到。:)
分析WAP小说网站的发展和定位
起点中文是老大,其他的17k等算老二,晋江、潇湘、红袖算是言情小说的带头者。而玄幻小说网,世纪中文等是盗贴发展起来的老大,还有目前崛起的君子堂。那么,其他的免费小说网还有其发展的空间吗?
答案当然是肯定的,主要是看你想发展的方向,如果你想做一个IP一万左右的免费小说网,那比较容易,下载个程序,优化下,设置好采集点,做些宣传,一般2-3个月就可以搞定。
如果你想做个小说原创网,那就难度很大,不过可以先做免费类的,人气起来了再转。世纪文学就是一个比较成功的例子。
如果你想做个定位精确点的,例如爱情小说,言情小说等专一的小说网,那就比较简单,按这个类别分类,定好关键词,做下优化,采集下相关,量不用多,然后有了人气再推出版权签约,也不算太难,半年内一般也可以做起来。
如果你想做个偏门点的,例如文学类,文学和小说是两回事。难度也不是很大,但问题是文学城的百度收录很多,但流量很小。呵呵,现在文学类已经不是主流,关注的人渐渐减少。
当然,如果你想做个大些的,也可以,召集几个人,租个办公室,自己写程序,自己优化,自己和出版社谈好合作,然后前期广告费投些,也可以搞起来,但很难很难,流量可能不如某些单一站长负责的网站,至少目前来说风险很大。并且VC也不看好这类站。
所以,目前做小说网站最最重要的就是定位,只要根据自己的能力做好定位,小说网站的前途还是很光明的,特别再和wap手机站,txt下载,语音功能等结合起来,通过合理的宣传,在几个月内做成个IP超过十万的小说网站,并不是个梦想。
起点中文是老大,其他的17k等算老二,晋江、潇湘、红袖算是言情小说的带头者。而玄幻小说网,世纪中文等是盗贴发展起来的老大,还有目前崛起的君子堂。那么,其他的免费小说网还有其发展的空间吗?
答案当然是肯定的,主要是看你想发展的方向,如果你想做一个IP一万左右的免费小说网,那比较容易,下载个程序,优化下,设置好采集点,做些宣传,一般2-3个月就可以搞定。
如果你想做个小说原创网,那就难度很大,不过可以先做免费类的,人气起来了再转。世纪文学就是一个比较成功的例子。
如果你想做个定位精确点的,例如爱情小说,言情小说等专一的小说网,那就比较简单,按这个类别分类,定好关键词,做下优化,采集下相关,量不用多,然后有了人气再推出版权签约,也不算太难,半年内一般也可以做起来。
如果你想做个偏门点的,例如文学类,文学和小说是两回事。难度也不是很大,但问题是文学城的百度收录很多,但流量很小。呵呵,现在文学类已经不是主流,关注的人渐渐减少。
当然,如果你想做个大些的,也可以,召集几个人,租个办公室,自己写程序,自己优化,自己和出版社谈好合作,然后前期广告费投些,也可以搞起来,但很难很难,流量可能不如某些单一站长负责的网站,至少目前来说风险很大。并且VC也不看好这类站。
所以,目前做小说网站最最重要的就是定位,只要根据自己的能力做好定位,小说网站的前途还是很光明的,特别再和wap手机站,txt下载,语音功能等结合起来,通过合理的宣传,在几个月内做成个IP超过十万的小说网站,并不是个梦想。
答案当然是肯定的,主要是看你想发展的方向,如果你想做一个IP一万左右的免费小说网,那比较容易,下载个程序,优化下,设置好采集点,做些宣传,一般2-3个月就可以搞定。
如果你想做个小说原创网,那就难度很大,不过可以先做免费类的,人气起来了再转。世纪文学就是一个比较成功的例子。
如果你想做个定位精确点的,例如爱情小说,言情小说等专一的小说网,那就比较简单,按这个类别分类,定好关键词,做下优化,采集下相关,量不用多,然后有了人气再推出版权签约,也不算太难,半年内一般也可以做起来。
如果你想做个偏门点的,例如文学类,文学和小说是两回事。难度也不是很大,但问题是文学城的百度收录很多,但流量很小。呵呵,现在文学类已经不是主流,关注的人渐渐减少。
当然,如果你想做个大些的,也可以,召集几个人,租个办公室,自己写程序,自己优化,自己和出版社谈好合作,然后前期广告费投些,也可以搞起来,但很难很难,流量可能不如某些单一站长负责的网站,至少目前来说风险很大。并且VC也不看好这类站。
所以,目前做小说网站最最重要的就是定位,只要根据自己的能力做好定位,小说网站的前途还是很光明的,特别再和wap手机站,txt下载,语音功能等结合起来,通过合理的宣传,在几个月内做成个IP超过十万的小说网站,并不是个梦想。
起点中文是老大,其他的17k等算老二,晋江、潇湘、红袖算是言情小说的带头者。而玄幻小说网,世纪中文等是盗贴发展起来的老大,还有目前崛起的君子堂。那么,其他的免费小说网还有其发展的空间吗?
答案当然是肯定的,主要是看你想发展的方向,如果你想做一个IP一万左右的免费小说网,那比较容易,下载个程序,优化下,设置好采集点,做些宣传,一般2-3个月就可以搞定。
如果你想做个小说原创网,那就难度很大,不过可以先做免费类的,人气起来了再转。世纪文学就是一个比较成功的例子。
如果你想做个定位精确点的,例如爱情小说,言情小说等专一的小说网,那就比较简单,按这个类别分类,定好关键词,做下优化,采集下相关,量不用多,然后有了人气再推出版权签约,也不算太难,半年内一般也可以做起来。
如果你想做个偏门点的,例如文学类,文学和小说是两回事。难度也不是很大,但问题是文学城的百度收录很多,但流量很小。呵呵,现在文学类已经不是主流,关注的人渐渐减少。
当然,如果你想做个大些的,也可以,召集几个人,租个办公室,自己写程序,自己优化,自己和出版社谈好合作,然后前期广告费投些,也可以搞起来,但很难很难,流量可能不如某些单一站长负责的网站,至少目前来说风险很大。并且VC也不看好这类站。
所以,目前做小说网站最最重要的就是定位,只要根据自己的能力做好定位,小说网站的前途还是很光明的,特别再和wap手机站,txt下载,语音功能等结合起来,通过合理的宣传,在几个月内做成个IP超过十万的小说网站,并不是个梦想。
PB程序优化建议
①每个pbl不要过大。对于比较大的要经行功能分离。
②尽量使用数据窗口和DATASTORE.即使是必须用SQL语句的时候,也应该尽量将它们定义为存储过程(特别是在多用户的环境中),以提高应用程序的性能.
③在程序中应当尽量使用SETTRANSOBJECT(),因为SETTRANS()函数在每次调用RETRIEVE(),UPDATE()等函数之后,都要执行数据库的连接和断开操作.
④多处频繁使用的数据考虑共享dw_main.Share(dw_suborder)
⑤数据窗口之间的copy:
dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)
dw_2.object.data=da_1.object.data.selected
第二种方法要快
⑥在程序中访问数据窗口的属性有下列几种方法:
A1.采用点表达式访问
A2.应用多个独立的DESCRIBE()函数访问
A3.只使用一个DESCRIBE()函数,采用复合参数访问多个属性
上面三中方法,通常第一种方法最慢,第三种方法最快.
⑦在程序中修改数据窗口的属性有下列几种方法:
A1.采用点表达式修改
A2.应用多个独立的MODIFY()函数访问
A3.只使用一个MODIFY()函数,采用复合参数访问多个属性
上面三种方法,通常第一种方法最慢,第三种方法最快.
⑧使用setredraw((FALSE)与setredraw(true)函数以减少屏幕的重绘,否则,执行速度将严重下降。
⑨获得当前行号,应尽量使用数据窗口的CURRENTROW变量,而少用GETROW()函数
⑩数据窗多用object.的形式,少用getitem,setitem函数
11对于数据窗口控制中经常发生的事件,应当尽量减少其中的程序代码.特别是如下事件:
a.itemchanged
b.editchanged
c.itemfocuschanged
d.pbm_dwnkey
e.rowfocuschanged
f.retrieverow
在这些事件中的任何处理程序,都会降低应用程序的处理速度.所以应当尽量减少这些事件中的处理程序,必要时,可以考虑只将重要的代码放在这些事件中,而将剩余的代码放在一个传递的事件中.
例如,如果需要用到数据窗口的ROWFOCUSCHANGED事件,可以为数据窗口定义一用户事件UE_RE,而在数据窗口的ROWFOCUSCHANGED事件中写如下代码:
PARENT.postevent(ue_re)
在UE_RE事件中再编写相应的程序代码
12数据窗口中包含许多复杂的计算域,将严重影响数据窗口的执行速度。
②尽量使用数据窗口和DATASTORE.即使是必须用SQL语句的时候,也应该尽量将它们定义为存储过程(特别是在多用户的环境中),以提高应用程序的性能.
③在程序中应当尽量使用SETTRANSOBJECT(),因为SETTRANS()函数在每次调用RETRIEVE(),UPDATE()等函数之后,都要执行数据库的连接和断开操作.
④多处频繁使用的数据考虑共享dw_main.Share(dw_suborder)
⑤数据窗口之间的copy:
dw_1.rowscopy(lr,lr,primary!,dw_2,100,primary!)
dw_2.object.data=da_1.object.data.selected
第二种方法要快
⑥在程序中访问数据窗口的属性有下列几种方法:
A1.采用点表达式访问
A2.应用多个独立的DESCRIBE()函数访问
A3.只使用一个DESCRIBE()函数,采用复合参数访问多个属性
上面三中方法,通常第一种方法最慢,第三种方法最快.
⑦在程序中修改数据窗口的属性有下列几种方法:
A1.采用点表达式修改
A2.应用多个独立的MODIFY()函数访问
A3.只使用一个MODIFY()函数,采用复合参数访问多个属性
上面三种方法,通常第一种方法最慢,第三种方法最快.
⑧使用setredraw((FALSE)与setredraw(true)函数以减少屏幕的重绘,否则,执行速度将严重下降。
⑨获得当前行号,应尽量使用数据窗口的CURRENTROW变量,而少用GETROW()函数
⑩数据窗多用object.的形式,少用getitem,setitem函数
11对于数据窗口控制中经常发生的事件,应当尽量减少其中的程序代码.特别是如下事件:
a.itemchanged
b.editchanged
c.itemfocuschanged
d.pbm_dwnkey
e.rowfocuschanged
f.retrieverow
在这些事件中的任何处理程序,都会降低应用程序的处理速度.所以应当尽量减少这些事件中的处理程序,必要时,可以考虑只将重要的代码放在这些事件中,而将剩余的代码放在一个传递的事件中.
例如,如果需要用到数据窗口的ROWFOCUSCHANGED事件,可以为数据窗口定义一用户事件UE_RE,而在数据窗口的ROWFOCUSCHANGED事件中写如下代码:
PARENT.postevent(ue_re)
在UE_RE事件中再编写相应的程序代码
12数据窗口中包含许多复杂的计算域,将严重影响数据窗口的执行速度。
极限编程
XP是一个轻量级的、灵巧的软件开发方法;同时它也是一个非常严谨和周密的方法。它的基础和价值观是交流、朴素、反馈和勇气;即,任何一个软件项目都可以从四个方面入手进行改善:加强交流;从简单做起;寻求反馈;勇于实事求是。XP是一种近螺旋式的开发方法,它将复杂的开发过程分解为一个个相对比较简单的小周期;通过积极的交流、反馈以及其它一系列的方法,开发人员和客户可以非常清楚开发进度、变化、待解决的问题和潜在的困难等,并根据实际情况及时地调整开发过程。
什么是软件开发
软件开发的内容是:需求、设计、编程和测试!
需求:不仅仅是用户需求,应该是开发中遇到的所有的需求。比如,你首先要知道做这个项目是为了解决什么问题;测试案例中应该输入什么数据……为了清楚地知道这些需求,你经常要和客户、项目经理等交流。
设计:编码前,肯定有个计划告诉你要做什么,结构是怎样等等。你一定要按照这个来做,否则可能会一团糟。
编程:如果在项目截止日,你的程序不能跑起来或达不到客户的要求,你就拿不到钱。
测试:目的是让你知道,什么时候算是完成了。如果你聪明,你就应该先写测试,这样可以及时知道你是否真地完成了。否则,你经常会不知道,到底有哪些功能是真正完成了,离预期目标还差多远。
软件开发中,客户和开发人员都有自己的基本权利和义务。
客户:
定义每个用户需求的商业优先级;
制订总体计划,包括用多少投资、经过多长时间、达到什么目的;
在项目开发过程中的每个工作周,都能让投资获得最大的收益;
通过重复运行你所指定的功能测试,准确地掌握项目进展情况;
能随时改变需求、功能或优先级,同时避免昂贵的再投资;能够根据各种变化及时调整项目计划;
能够随时取消项目;项目取消时,以前的开发工作不是一堆垃圾,已开发完的功能是合乎要求的,正在进行或未完成的的工作则应该是不难接手的。
开发人员:
知道要做什么,以及要优先做什么;
工作有效率;
有问题或困难时,能得到客户、同事、上级的回答或帮助;
对工作做评估,并根据周围情况的变化及时重新评估;
积极承担工作,而不是消极接受分配;
一周40小时工作制,不加班。
这就是软件开发,除此之外再还有其它要关心的问题!
灵巧的轻量级软件开发方法
一套软件开发方法是由一系列与开发相关的规则、规范和惯例。重量级的开发方法严格定义了许多的规则、流程和相关的文档工作。灵巧的轻量级开发方法,其规则和文档相对较少,流程更加灵活,实施起来相对较容易。
在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很繁琐,程序员之间也很难读懂对方写的代码。1968年,EdsgerDijkstra给CACM写了一封题为GOTOStatementConsideredHarmful的信,软件工程的概念由此诞生。程序员们开始摒弃以前的做法,转而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,规则和流程也越来越精细和复杂。
到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大的辅助开发工具(CaseTools),但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。
为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。
失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流水生产线,而是更加灵活。
ExtremeProgramming(XP)就是这样一种灵巧的轻量级软件开发方法。
为什么称为“Extreme”(极限)
“Extreme”(极限)是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、做到最好;其它XP所不提倡的,则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。
XP的软件开发是什么样
1极限的工作环境
为了在软件开发过程中最大程度地实现和满足客户和开发人员的基本权利和义务,XP要求把工作环境也做得最好。每个参加项目开发的人都将担任一个角色(项目经理、项目监督人等等)并履行相应的权利和义务。所有的人都在同一个开放的开发环境中工作,最好是所有人在同一个大房子中工作,还有茶点供应;每周40小时,不提倡加班;每天早晨,所有人一起站着开个短会;墙上有一些大白板,所有的Story卡、CRC卡等都贴在上面,讨论问题的时候可以在上面写写画画;下班后大家可以一起玩电脑游戏……。
2极限的需求
客户应该是项目开发队伍中的一员,而不是和开发人员分开的;因为从项目的计划到最后验收,客户一直起着很重要的作用。开发人员和客户一起,把各种需求变成一个个小的需求模块(UserStory),例如“计算年级的总人数,就是把该年级所有班的人数累加。”;这些模块又会根据实际情况被组合在一起或者被分解成更小的模块;它们都被记录在一些小卡片(StoryCard)上,之后分别被程序员们在各个小的周期开发中(Iteration,通常不超过3个星期)实现;客户根据每个模块的商业价值来指定它们的优先级;开发人员要做的是确定每个需求模块的开发风险,风险高的(通常是因为缺乏类似的经验)需求模块将被优先研究、探索和开发;经过开发人员和客户分别从不同的角度评估每个模块后,它们被安排在不同的开发周期里,客户将得到一个尽可能准确的开发计划;客户为每个需求模块指定验收测试(功能测试)。
每发布一次开发的软件(经过一个开发周期),用户都能得到一个可以开始使用的系统,这个系统全面实现了相应的计划中的所有需求。而在一些传统的开发模式中,无论什么功能,用户都要等到所有开发完成后才能开始使用。
3极限的设计
从具体开发的角度来看,XP内层的过程是一个个基于测试驱动的开发(TestDrivenDevelopment)周期,诸如计划和设计等外层的过程都是围绕这些展开的。每个开发周期都有很多相应的单元测试(UnitTest)。刚开始,因为什么都没有实现,所以所有的单元测试都是失败的;随着一个个小的需求模块的完成,通过的单元测试也越来越多。通过这种方式,客户和开发人员都很容易检验,是否履行了对客户的承诺。XP提倡对于简单的设计(SimpleDesign),就是用最简单的方式,使得为每个简单的需求写出来的程序可以通过所有相关的单元测试。XP强调抛弃那种一揽子详细设计方式(BigDesignUpFront),因为这种设计中有很多内容是你现在或最近都根本不需要的。XP还大力提倡设计复核(Review)、代码复核以及重整和优化(Refectory),所有的这些过程其实也是优化设计的过程;在这些过程中不断运行单元测试和功能测试,可以保证经过重整和优化后的系统仍然符合所有需求。
4极限的编程
既然编程很重要,XP就提倡两个人一起写同一段程序(PairProgramming),而且代码所有权是归于整个开发队伍(CollectiveCodeOwnership)。程序员在写程序和重整优化程序的时候,都要严格遵守编程规范。任何人都可以修改其他人写的程序,修改后要确定新程序能通过单元测试。
5极限的测试
既然测试很重要,XP就提倡在开始写程序之前先写单元测试。开发人员应该经常把开发好的模块整合到一起(ContinuousIntegration),每次整合后都要运行单元测试;做任何的代码复核和修改,都要运行单元测试;发现了BUG,就要增加相应的测试(因此XP方法不需要BUG数据库)。除了单元测试之外,还有整合测试,功能测试、负荷测试和系统测试等。所有这些测试,是XP开发过程中最重要的文档之一,也是最终交付给用户的内容之一。
XP中的重要惯例和规则
1项目开发小组(Team)
在XP中,每个对项目做贡献的人都应该是项目开发小组中的一员。而且,这个小组中必须至少有一个人对用户需求非常清晰,能够提出需求、决定各个需求的商业价值(优先级)、根据需求等的变化调整项目计划等。这个人扮演的是“客户”这个角色,当然最好就是实际的最终用户,因为整个项目就是围绕最终用户的需求而展开的。程序员是项目开发小组中必不可少的成员。小组中可以有测试员,他们帮助客户制订验收测试;有分析员,帮助客户确定需求;通常还有个Coach(教练),负责跟踪开发进度、解决开发中遇到的一些问题、推动项目进行;还可以又一个项目经理,负责调配资源、协助项目内外的交流沟通等等。项目小组中有这么多角色,但并不是说,每个人做的工作是别人不能插手或干预的,XP鼓励每个人尽可能地为项目多做贡献。平等相处,取长补短;这就是最好的XP开发小组。
2计划项目(PlanningGame)、验收测试、小规模发布(SmallReleases)
XP开发小组使用简单的方式进行项目计划和开发跟踪,并以次预测项目进展情况和决定未来的步骤。根据需求的商业价值,开发小组针对一组组的需求进行一系列的开发和整合,每次开发都会产生一个通过测试的、可以使用的系统。
计划项目
XP的计划过程主要针对软件开发中的两个问题:预测在交付日期前可以完成多少工作;现在和下一步该做些什么。不断的回答这两个问题,就是直接服务于如何实施及调整开发过程;与此相比,希望一开始就精确定义整个开发过程要做什么事情以及每件事情要花多少时间,则事倍功半。针对这两个问题,XP中又两个主要的相应过程:
软件发布计划(ReleasePlanning)。客户阐述需求,开发人员估算开发成本和风险。客户根据开发成本、风险和每个需求的重要性,制订一个大致的项目计划。最初的项目计划没有必要(也没有可能)非常准确,因为每个需求的开发成本、风险及其重要性都不是一成不变的。而且,这个计划会在实施过程中被不断地调整以趋精确。
周期开发计划(IterationPlanning)。开发过程中,应该有很多阶段计划(比如每三个星期一个计划)。开发人员可能在某个周期对系统进行内部的重整和优化(代码和设计),而在某个周期增加了新功能,或者会在一个周期内同时做两方面的工作。但是,经过每个开发周期,用户都应该能得到一个已经实现了一些功能的系统。而且,每经过一个周期,客户就会再提出确定下一个周期要完成的需求。在每个开发周期中,开发人员会把需求分解成一个个很小的任务,然后估计每个任务的开发成本和风险。这些估算是基于实际开发经验的,项目做得多了,估算自然更加准确和精确;在同一个项目中,每经过一个开发周期,下一次的估算都会有更过的经验、参照和依据,从而更加准确。这些简单的步骤对客户提供了丰富的、足够的信息,使之能灵活有效地调控开发进程。每过两三个星期,客户总能够实实在在地看到开发人员已经完成的需求。在XP里,没有什么“快要完成了”、“完成了90%”的模糊说法,要不是完成了,要不就是没完成。这种做法看起来好像有利有弊:好处是客户可以马上知道完成了哪些、做出来的东西是否合用、下面还要做些什么或改进什么等等;坏处是客户看到做出来的东西,可能会很不满意甚至中止合同。实际上,XP的这种做法是为了及早发现问题、解决问题,而不是等到过了几个月,用户终于看到开发完的系统了,然后才告诉你这个不行、那个变了、还要增加
哪个内容等等。
验收测试
客户对每个需求都定义了一些验收测试。通过运行验收测试,开发人员和客户可以知道开发出来的软件是否符合要求。XP开发人员把这些验收测试看得和单元测试一样重要。为了不浪费宝贵的时间,最好能将这些测试过程自动化。
频繁地小规模发布软件(SmallReleases)
每个周期(Iteration)开发的需求都是用户最需要的东西。在XP中,对于每个周期完成时发布的系统,用户都应该可以很容易地进行评估,或者已经能够投入实际使用。这样,软件开发对于客户来说,不再是看不见摸不着的东西,而是实实在在的。XP要求频繁地发布软件,如果有可能,应该每天都发布一个新版本;而且在完成任何一个改动、整合或者新需求后,就应该立即发布一个新版本。这些版本的一致性和可靠性,是靠验收测试和测试驱动的开发来保证的。
3简单设计,PairProgramming,测试驱动开发,重整和优化
XP程序员不但做为一个开发小组共同工作,还以两个人为一个小开发单元编写同一个程序。开发人员们进行简单的设计,编写单元测试后再编写符合测试要求的代码,并在满足需求的前提下不断地优化设计。
简单设计
XP中让初学者感到最困惑的就是这点。XP要求用最简单的办法实现每个小需求,前提是按照这些简单设计开发出来的软件必须通过测试。这些设计只要能满足系统和客户在当下的需求就可以了,不需要任何画蛇添足的设计,而且所有这些设计都将在后续的开发过程中就被不断地重整和优化。
在XP中,没有那种传统开发模式中一次性的、针对所有需求的总体设计。在XP中,设计过程几乎一直贯穿着整个项目开发:从制订项目的计划,到制订每个开发周期(Iteration)的计划,到针对每个需求模块的简捷设计,到设计的复核,以及一直不间断的设计重整和优化。整个设计过程是个螺旋式的、不断前进和发展的过程。从这个角度看,XP是把设计做到了极致。
PairProgramming
XP中,所有的代码都是由两个程序员在同一台机器上一起写的——这是XP中让人争议最多、也是最难实施的一点。这保证了所有的代码、设计和单元测试至少被另一个人复核过,代码、设计和测试的质量因此得到提高。看起来这样象是在浪费人力资源,但是各种研究表明事实恰恰相反。——这种工作方式极大地提高了工作强度和工作效率。
很多程序员一开始是被迫尝试这点的(XP也需要行政命令的支持)。开始时总是不习惯的,而且两个人的效率不会比一个人的效率高。这种做法的效果往往要坚持几个星期或一两个月后才能很显著。据统计,在所有刚开始PairProgramming的程序员中,90%的人在两个月以后都很认为这种工作方式更加高效。
项目开发中,每个人会不断地更换合作编程的伙伴。因此,PairProgramming不但提高了软件质量,还增强了相互之间的知识交流和更新,增强了相互之间的沟通和理解。这不但有利于个人,也有利于整个项目、开发队伍和公司。从这点看,PairProgramming不仅仅适用于XP,也适用于所有其它的软件开发方法。
测试驱动开发
反馈是XP的四个基本的价值观之一——在软件开发中,只有通过充分的测试才能获得充分的反馈。XP中提出的测试,在其它软件开发方法中都可以见到,比如功能测试、单元测试、系统测试和负荷测试等;与众不同的是,XP将测试结合到它独特的螺旋式增量型开发过程中,测试随着项目的进展而不断积累。另外,由于强调整个开发小组拥有代码,测试也是由大家共同维护的。即,任何人在往代码库中放程序(CheckIn)前,都应该运行一遍所有的测试;任何人如果发现了一个BUG,都应该立即为这个BUG增加一个测试,而不是等待写那个程序的人来完成;任何人接手其他人的任务,或者修改其他人的代码和设计,改动完以后如果能通过所有测试,就证明他的工作没有破坏愿系统。这样,测试才能真正起到帮助获得反馈的作用;而且,通过不断地优先编写和累积,测试应该可以基本覆盖全部的客户和开发需求,因此开发人员和客户可以得到尽可能充足的反馈。
重构(Refactoring)
XP强调简单的设计,但简单的设计并不是没有设计的流水账式的程序,也不是没有结构、缺乏重用性的程序设计。开发人员虽然对每个USERSTORY都进行简单设计,但同时也在不断地对设计进行改进,这个过程叫设计的重构(Refactoring)。这个名字最早出现在MartinFowler写的《Refactoring:ImprovingtheDesignofExistingCode》这本书中。
Refactoring主要是努力减少程序和设计中重复出现的部分,增强程序和设计的可重用性。Refactoring的概念并不是XP首创的,它已经被提出了近30年了,而且一直被认为是高质量的代码的特点之一。但XP强调,把Refactoring做到极致,应该随时随地、尽可能地进行Refactoring,只要有可能,程序员都不应该心疼以前写的程序,而要毫不留情地改进程序。当然,每次改动后,程序员都应该运行测试程序,保证新系统仍然符合预定的要求。
4频繁地整合,集体拥有代码(CollectiveCodeOwnership),编程规范
XP开发小组经常整合不同的模块。为了提高软件质量,除了测试驱动开发和PairProgramming以外,XP要求每个人的代码都要遵守编程规范,任何人都可以修改其他人写的代码,而且所有人都应该主动检查其他人写的代码。
频繁地整合(Integration)
在很多项目中,开发人员往往很迟才把各个模块整合在一起。在这些项目中,开发人员经常在整合过程中发现很多问题,但不能肯定到底是谁的程序出了问题;而且,只有整合完成后,开发人员才开始稍稍使用整个系统,然后就马上交付给客户验收。对于客户来说,即使这些系统能够通过终验收测试,因为使用时间短,客户门心里并没有多少把握。
为了解决这些问题,XP提出,整个项目过程中,应该频繁地,尽可能地整合已经开发完的USERSTORY(每次整合一个新的USERSTORY)。每次整合,都要运行相应的单元测试和验收测试,保证符合客户和开发的要求。整合后,就发布一个新的应用系统。这样,整个项目开发过程中,几乎每隔一两天,都会发布一个新系统,有时甚至会一天发布好几个版本。通过这个过程,客户能非常清楚地掌握已经完成的功能和开发进度,并基于这些情况和开发人员进行有效地、及时地交流,以确保项目顺利完成。
集体拥有代码(CollectiveCodeOwnership)
在很多项目开发过程中,开发人员只维护自己的代码,而且很多人不喜欢其他人随意修改自己的代码。因此,即使可能有相应的比较详细的开发文档,但一个程序员却很少、也不太愿意去读其他程序员的代码;而且,因为不清楚其他人的程序到底实现了什么功能,一个程序员一般也不敢随便改动其他人的代码。同时,因为是自己维护自己的代码,可能因为时间紧张或技术水平的局限性,某些问题一直不能被发现或得到比较好的解决。针对这点,XP提倡大家共同拥有代码,每个人都有权利和义务阅读其他代码,发现和纠正错误,重整和优化代码。这样,这些代码就不仅仅是一两个人写的,而是由整个项目开发队伍共同完成的,错误会减少很多,重用性会尽可能地得到提高,代码质量是非常好。
为了防止修改其他人的代码而引起系统崩溃,每个人在修改后都应该运行测试程序。(从这点,我们可以再次看到,XP的各个惯例和规则是怎样有机地结合在一起的。)
编程规范
XP开发小组中的所有人都遵循一个统一的编程标准,因此,所有的代码看起来好像是一个人写的。因为有了统一的编程规范,每个程序员更加容易读懂其他人写的代码,这是是实现CollectiveCodeOwnership的重要前提之一。
5Metaphor(系统比喻),不加班
XP过程通过使用一些形象的比喻让所有人对系统有个共同的、简洁的认识。XP认为加班是不正常的,因为这说明关于项目进度的估计和安排有问题。
Metaphor(系统比喻)
为了帮助每个人一致清楚地理解要完成的客户需求、要开发的系统功能,XP开发小组用很多形象的比喻来描述系统或功能模块是怎样工作的。比如,对于一个搜索引擎,它的Metaphor可能就是“一大群蜘蛛,在网上四处寻找要捕捉的东西,然后把东西带回巢穴。”
不加班
大量的加班意味着原来的计划是不准确的,或者是程序远不清楚自己到底什么时候能完成什么工作。而且,开发管理人员和客户也因此无法准确掌握开发速度;开发人员也因此非常疲劳。XP认为,如果出现大量的加班现象,开发管理人员(比如Coach)应该和客户一起确定加班的原因,并及时调整项目计划、进度和资源。
XP中一些基本概念的简介
UserStory:开发人员要求客户把所有的需求写成一个个独立的小故事,每个只需要几天时间就可以完成。开发过程中,客户可以随时提出新的UserStory,或者更改以前的UserStory。
StoryEstimates和开发速度:开发小组对每个UserStory进行估算,并根据每个开发周期(Iteration)中的实际情况反复计算开发速度。这样,开发人员和客户能知道每个星期到底能开发多少UserStory。
ReleasePlan和ReleaseScope:整个开发过程中,开发人员将不断地发布新版本。开发人员和客户一起确定每个发布所包含的UserStory。
Iteration(开发周期,或称迭代)和IterationPlan:在一个Release过程中,开发人员要求客户选择最有价值的UserStory作为未来一两个星期的开发内容。
TheSeed:第一个迭代(Iteration)完成后,提交给客户的系统。虽然这不是最终的产品,但它已经实现了几个客户认为是最重要的Story,开发人员将逐步在其基础上增加新的模块。
ContinuousIntegration(整合):把开发完的UserStory的模块一个个拼装起来,一步步接近乃至最终完成最终产品。
验收测试(功能测试):对于每个UserStory,客户将定义一些测试案例,开发人员将使运行这些测试案例的过程自动化。
UnitTest(单元测试):在开始写程序前,程序员针对大部分类的方法,先写出相应的测试程序。
Refactoring(重构):去掉代码中的冗余部分,增加代码的可重用性和伸缩性。
小结
XP的一个成功因素是重视客户的反馈——开发的目的就是为了满足客户的需要。XP方法使开发人员始终都能自信地面对客户需求的变化。XP强调团队合作,经理、客户和开发人员都是开发团队中的一员。团队通过相互之间的充分交流和合作,使用XP这种简单但有效的方式,努力开发出高质量的软件。XP的设计简单而高效;程序员们通过测试获得客户反馈,并根据变化修改代码和设计,他们总是争取尽可能早地将软件交付给客户。XP程序员能够勇于面对需求和技术上的变化。
什么是软件开发
软件开发的内容是:需求、设计、编程和测试!
需求:不仅仅是用户需求,应该是开发中遇到的所有的需求。比如,你首先要知道做这个项目是为了解决什么问题;测试案例中应该输入什么数据……为了清楚地知道这些需求,你经常要和客户、项目经理等交流。
设计:编码前,肯定有个计划告诉你要做什么,结构是怎样等等。你一定要按照这个来做,否则可能会一团糟。
编程:如果在项目截止日,你的程序不能跑起来或达不到客户的要求,你就拿不到钱。
测试:目的是让你知道,什么时候算是完成了。如果你聪明,你就应该先写测试,这样可以及时知道你是否真地完成了。否则,你经常会不知道,到底有哪些功能是真正完成了,离预期目标还差多远。
软件开发中,客户和开发人员都有自己的基本权利和义务。
客户:
定义每个用户需求的商业优先级;
制订总体计划,包括用多少投资、经过多长时间、达到什么目的;
在项目开发过程中的每个工作周,都能让投资获得最大的收益;
通过重复运行你所指定的功能测试,准确地掌握项目进展情况;
能随时改变需求、功能或优先级,同时避免昂贵的再投资;能够根据各种变化及时调整项目计划;
能够随时取消项目;项目取消时,以前的开发工作不是一堆垃圾,已开发完的功能是合乎要求的,正在进行或未完成的的工作则应该是不难接手的。
开发人员:
知道要做什么,以及要优先做什么;
工作有效率;
有问题或困难时,能得到客户、同事、上级的回答或帮助;
对工作做评估,并根据周围情况的变化及时重新评估;
积极承担工作,而不是消极接受分配;
一周40小时工作制,不加班。
这就是软件开发,除此之外再还有其它要关心的问题!
灵巧的轻量级软件开发方法
一套软件开发方法是由一系列与开发相关的规则、规范和惯例。重量级的开发方法严格定义了许多的规则、流程和相关的文档工作。灵巧的轻量级开发方法,其规则和文档相对较少,流程更加灵活,实施起来相对较容易。
在软件工程概念出现以前,程序员们按照自己喜欢的方式开发软件。程序的质量很难控制,调试程序很繁琐,程序员之间也很难读懂对方写的代码。1968年,EdsgerDijkstra给CACM写了一封题为GOTOStatementConsideredHarmful的信,软件工程的概念由此诞生。程序员们开始摒弃以前的做法,转而使用更系统、更严格的开发方法。为了使控制软件开发和控制其它产品生产一样严格,人们陆续制定了很多规则和做法,发明了很多软件工程方法,软件质量开始得到大幅度提高。随着遇到的问题更多,规则和流程也越来越精细和复杂。
到了今天,在实际开发过程中,很多规则已经难于遵循,很多流程复杂而难于理解,很多项目中文档的制作过程正在失去控制。人们试图提出更全面更好的一揽子方案,或者寄希望于更复杂的、功能更强大的辅助开发工具(CaseTools),但总是不能成功,而且开发规范和流程变得越来越复杂和难以实施。
为了赶进度,程序员们经常跳过一些指定的流程,很少人能全面遵循那些重量级开发方法。
失败的原因很简单,这个世界没有万能药。因此,一些人提出,将重量级开发方法中的规则和流程进行删减、重整和优化,这样就产生了很多适应不同需要的轻量级流程。在这些流程中,合乎实际需要的规则被保留下来,不必要的复杂化开发的规被抛弃。而且,和传统的开发方法相比,轻量级流程不再象流水生产线,而是更加灵活。
ExtremeProgramming(XP)就是这样一种灵巧的轻量级软件开发方法。
为什么称为“Extreme”(极限)
“Extreme”(极限)是指,对比传统的项目开发方式,XP强调把它列出的每个方法和思想做到极限、做到最好;其它XP所不提倡的,则一概忽略(如开发前期的整体设计等)。一个严格实施XP的项目,其开发过程应该是平稳的、高效的和快速的,能够做到一周40小时工作制而不拖延项目进度。
XP的软件开发是什么样
1极限的工作环境
为了在软件开发过程中最大程度地实现和满足客户和开发人员的基本权利和义务,XP要求把工作环境也做得最好。每个参加项目开发的人都将担任一个角色(项目经理、项目监督人等等)并履行相应的权利和义务。所有的人都在同一个开放的开发环境中工作,最好是所有人在同一个大房子中工作,还有茶点供应;每周40小时,不提倡加班;每天早晨,所有人一起站着开个短会;墙上有一些大白板,所有的Story卡、CRC卡等都贴在上面,讨论问题的时候可以在上面写写画画;下班后大家可以一起玩电脑游戏……。
2极限的需求
客户应该是项目开发队伍中的一员,而不是和开发人员分开的;因为从项目的计划到最后验收,客户一直起着很重要的作用。开发人员和客户一起,把各种需求变成一个个小的需求模块(UserStory),例如“计算年级的总人数,就是把该年级所有班的人数累加。”;这些模块又会根据实际情况被组合在一起或者被分解成更小的模块;它们都被记录在一些小卡片(StoryCard)上,之后分别被程序员们在各个小的周期开发中(Iteration,通常不超过3个星期)实现;客户根据每个模块的商业价值来指定它们的优先级;开发人员要做的是确定每个需求模块的开发风险,风险高的(通常是因为缺乏类似的经验)需求模块将被优先研究、探索和开发;经过开发人员和客户分别从不同的角度评估每个模块后,它们被安排在不同的开发周期里,客户将得到一个尽可能准确的开发计划;客户为每个需求模块指定验收测试(功能测试)。
每发布一次开发的软件(经过一个开发周期),用户都能得到一个可以开始使用的系统,这个系统全面实现了相应的计划中的所有需求。而在一些传统的开发模式中,无论什么功能,用户都要等到所有开发完成后才能开始使用。
3极限的设计
从具体开发的角度来看,XP内层的过程是一个个基于测试驱动的开发(TestDrivenDevelopment)周期,诸如计划和设计等外层的过程都是围绕这些展开的。每个开发周期都有很多相应的单元测试(UnitTest)。刚开始,因为什么都没有实现,所以所有的单元测试都是失败的;随着一个个小的需求模块的完成,通过的单元测试也越来越多。通过这种方式,客户和开发人员都很容易检验,是否履行了对客户的承诺。XP提倡对于简单的设计(SimpleDesign),就是用最简单的方式,使得为每个简单的需求写出来的程序可以通过所有相关的单元测试。XP强调抛弃那种一揽子详细设计方式(BigDesignUpFront),因为这种设计中有很多内容是你现在或最近都根本不需要的。XP还大力提倡设计复核(Review)、代码复核以及重整和优化(Refectory),所有的这些过程其实也是优化设计的过程;在这些过程中不断运行单元测试和功能测试,可以保证经过重整和优化后的系统仍然符合所有需求。
4极限的编程
既然编程很重要,XP就提倡两个人一起写同一段程序(PairProgramming),而且代码所有权是归于整个开发队伍(CollectiveCodeOwnership)。程序员在写程序和重整优化程序的时候,都要严格遵守编程规范。任何人都可以修改其他人写的程序,修改后要确定新程序能通过单元测试。
5极限的测试
既然测试很重要,XP就提倡在开始写程序之前先写单元测试。开发人员应该经常把开发好的模块整合到一起(ContinuousIntegration),每次整合后都要运行单元测试;做任何的代码复核和修改,都要运行单元测试;发现了BUG,就要增加相应的测试(因此XP方法不需要BUG数据库)。除了单元测试之外,还有整合测试,功能测试、负荷测试和系统测试等。所有这些测试,是XP开发过程中最重要的文档之一,也是最终交付给用户的内容之一。
XP中的重要惯例和规则
1项目开发小组(Team)
在XP中,每个对项目做贡献的人都应该是项目开发小组中的一员。而且,这个小组中必须至少有一个人对用户需求非常清晰,能够提出需求、决定各个需求的商业价值(优先级)、根据需求等的变化调整项目计划等。这个人扮演的是“客户”这个角色,当然最好就是实际的最终用户,因为整个项目就是围绕最终用户的需求而展开的。程序员是项目开发小组中必不可少的成员。小组中可以有测试员,他们帮助客户制订验收测试;有分析员,帮助客户确定需求;通常还有个Coach(教练),负责跟踪开发进度、解决开发中遇到的一些问题、推动项目进行;还可以又一个项目经理,负责调配资源、协助项目内外的交流沟通等等。项目小组中有这么多角色,但并不是说,每个人做的工作是别人不能插手或干预的,XP鼓励每个人尽可能地为项目多做贡献。平等相处,取长补短;这就是最好的XP开发小组。
2计划项目(PlanningGame)、验收测试、小规模发布(SmallReleases)
XP开发小组使用简单的方式进行项目计划和开发跟踪,并以次预测项目进展情况和决定未来的步骤。根据需求的商业价值,开发小组针对一组组的需求进行一系列的开发和整合,每次开发都会产生一个通过测试的、可以使用的系统。
计划项目
XP的计划过程主要针对软件开发中的两个问题:预测在交付日期前可以完成多少工作;现在和下一步该做些什么。不断的回答这两个问题,就是直接服务于如何实施及调整开发过程;与此相比,希望一开始就精确定义整个开发过程要做什么事情以及每件事情要花多少时间,则事倍功半。针对这两个问题,XP中又两个主要的相应过程:
软件发布计划(ReleasePlanning)。客户阐述需求,开发人员估算开发成本和风险。客户根据开发成本、风险和每个需求的重要性,制订一个大致的项目计划。最初的项目计划没有必要(也没有可能)非常准确,因为每个需求的开发成本、风险及其重要性都不是一成不变的。而且,这个计划会在实施过程中被不断地调整以趋精确。
周期开发计划(IterationPlanning)。开发过程中,应该有很多阶段计划(比如每三个星期一个计划)。开发人员可能在某个周期对系统进行内部的重整和优化(代码和设计),而在某个周期增加了新功能,或者会在一个周期内同时做两方面的工作。但是,经过每个开发周期,用户都应该能得到一个已经实现了一些功能的系统。而且,每经过一个周期,客户就会再提出确定下一个周期要完成的需求。在每个开发周期中,开发人员会把需求分解成一个个很小的任务,然后估计每个任务的开发成本和风险。这些估算是基于实际开发经验的,项目做得多了,估算自然更加准确和精确;在同一个项目中,每经过一个开发周期,下一次的估算都会有更过的经验、参照和依据,从而更加准确。这些简单的步骤对客户提供了丰富的、足够的信息,使之能灵活有效地调控开发进程。每过两三个星期,客户总能够实实在在地看到开发人员已经完成的需求。在XP里,没有什么“快要完成了”、“完成了90%”的模糊说法,要不是完成了,要不就是没完成。这种做法看起来好像有利有弊:好处是客户可以马上知道完成了哪些、做出来的东西是否合用、下面还要做些什么或改进什么等等;坏处是客户看到做出来的东西,可能会很不满意甚至中止合同。实际上,XP的这种做法是为了及早发现问题、解决问题,而不是等到过了几个月,用户终于看到开发完的系统了,然后才告诉你这个不行、那个变了、还要增加
哪个内容等等。
验收测试
客户对每个需求都定义了一些验收测试。通过运行验收测试,开发人员和客户可以知道开发出来的软件是否符合要求。XP开发人员把这些验收测试看得和单元测试一样重要。为了不浪费宝贵的时间,最好能将这些测试过程自动化。
频繁地小规模发布软件(SmallReleases)
每个周期(Iteration)开发的需求都是用户最需要的东西。在XP中,对于每个周期完成时发布的系统,用户都应该可以很容易地进行评估,或者已经能够投入实际使用。这样,软件开发对于客户来说,不再是看不见摸不着的东西,而是实实在在的。XP要求频繁地发布软件,如果有可能,应该每天都发布一个新版本;而且在完成任何一个改动、整合或者新需求后,就应该立即发布一个新版本。这些版本的一致性和可靠性,是靠验收测试和测试驱动的开发来保证的。
3简单设计,PairProgramming,测试驱动开发,重整和优化
XP程序员不但做为一个开发小组共同工作,还以两个人为一个小开发单元编写同一个程序。开发人员们进行简单的设计,编写单元测试后再编写符合测试要求的代码,并在满足需求的前提下不断地优化设计。
简单设计
XP中让初学者感到最困惑的就是这点。XP要求用最简单的办法实现每个小需求,前提是按照这些简单设计开发出来的软件必须通过测试。这些设计只要能满足系统和客户在当下的需求就可以了,不需要任何画蛇添足的设计,而且所有这些设计都将在后续的开发过程中就被不断地重整和优化。
在XP中,没有那种传统开发模式中一次性的、针对所有需求的总体设计。在XP中,设计过程几乎一直贯穿着整个项目开发:从制订项目的计划,到制订每个开发周期(Iteration)的计划,到针对每个需求模块的简捷设计,到设计的复核,以及一直不间断的设计重整和优化。整个设计过程是个螺旋式的、不断前进和发展的过程。从这个角度看,XP是把设计做到了极致。
PairProgramming
XP中,所有的代码都是由两个程序员在同一台机器上一起写的——这是XP中让人争议最多、也是最难实施的一点。这保证了所有的代码、设计和单元测试至少被另一个人复核过,代码、设计和测试的质量因此得到提高。看起来这样象是在浪费人力资源,但是各种研究表明事实恰恰相反。——这种工作方式极大地提高了工作强度和工作效率。
很多程序员一开始是被迫尝试这点的(XP也需要行政命令的支持)。开始时总是不习惯的,而且两个人的效率不会比一个人的效率高。这种做法的效果往往要坚持几个星期或一两个月后才能很显著。据统计,在所有刚开始PairProgramming的程序员中,90%的人在两个月以后都很认为这种工作方式更加高效。
项目开发中,每个人会不断地更换合作编程的伙伴。因此,PairProgramming不但提高了软件质量,还增强了相互之间的知识交流和更新,增强了相互之间的沟通和理解。这不但有利于个人,也有利于整个项目、开发队伍和公司。从这点看,PairProgramming不仅仅适用于XP,也适用于所有其它的软件开发方法。
测试驱动开发
反馈是XP的四个基本的价值观之一——在软件开发中,只有通过充分的测试才能获得充分的反馈。XP中提出的测试,在其它软件开发方法中都可以见到,比如功能测试、单元测试、系统测试和负荷测试等;与众不同的是,XP将测试结合到它独特的螺旋式增量型开发过程中,测试随着项目的进展而不断积累。另外,由于强调整个开发小组拥有代码,测试也是由大家共同维护的。即,任何人在往代码库中放程序(CheckIn)前,都应该运行一遍所有的测试;任何人如果发现了一个BUG,都应该立即为这个BUG增加一个测试,而不是等待写那个程序的人来完成;任何人接手其他人的任务,或者修改其他人的代码和设计,改动完以后如果能通过所有测试,就证明他的工作没有破坏愿系统。这样,测试才能真正起到帮助获得反馈的作用;而且,通过不断地优先编写和累积,测试应该可以基本覆盖全部的客户和开发需求,因此开发人员和客户可以得到尽可能充足的反馈。
重构(Refactoring)
XP强调简单的设计,但简单的设计并不是没有设计的流水账式的程序,也不是没有结构、缺乏重用性的程序设计。开发人员虽然对每个USERSTORY都进行简单设计,但同时也在不断地对设计进行改进,这个过程叫设计的重构(Refactoring)。这个名字最早出现在MartinFowler写的《Refactoring:ImprovingtheDesignofExistingCode》这本书中。
Refactoring主要是努力减少程序和设计中重复出现的部分,增强程序和设计的可重用性。Refactoring的概念并不是XP首创的,它已经被提出了近30年了,而且一直被认为是高质量的代码的特点之一。但XP强调,把Refactoring做到极致,应该随时随地、尽可能地进行Refactoring,只要有可能,程序员都不应该心疼以前写的程序,而要毫不留情地改进程序。当然,每次改动后,程序员都应该运行测试程序,保证新系统仍然符合预定的要求。
4频繁地整合,集体拥有代码(CollectiveCodeOwnership),编程规范
XP开发小组经常整合不同的模块。为了提高软件质量,除了测试驱动开发和PairProgramming以外,XP要求每个人的代码都要遵守编程规范,任何人都可以修改其他人写的代码,而且所有人都应该主动检查其他人写的代码。
频繁地整合(Integration)
在很多项目中,开发人员往往很迟才把各个模块整合在一起。在这些项目中,开发人员经常在整合过程中发现很多问题,但不能肯定到底是谁的程序出了问题;而且,只有整合完成后,开发人员才开始稍稍使用整个系统,然后就马上交付给客户验收。对于客户来说,即使这些系统能够通过终验收测试,因为使用时间短,客户门心里并没有多少把握。
为了解决这些问题,XP提出,整个项目过程中,应该频繁地,尽可能地整合已经开发完的USERSTORY(每次整合一个新的USERSTORY)。每次整合,都要运行相应的单元测试和验收测试,保证符合客户和开发的要求。整合后,就发布一个新的应用系统。这样,整个项目开发过程中,几乎每隔一两天,都会发布一个新系统,有时甚至会一天发布好几个版本。通过这个过程,客户能非常清楚地掌握已经完成的功能和开发进度,并基于这些情况和开发人员进行有效地、及时地交流,以确保项目顺利完成。
集体拥有代码(CollectiveCodeOwnership)
在很多项目开发过程中,开发人员只维护自己的代码,而且很多人不喜欢其他人随意修改自己的代码。因此,即使可能有相应的比较详细的开发文档,但一个程序员却很少、也不太愿意去读其他程序员的代码;而且,因为不清楚其他人的程序到底实现了什么功能,一个程序员一般也不敢随便改动其他人的代码。同时,因为是自己维护自己的代码,可能因为时间紧张或技术水平的局限性,某些问题一直不能被发现或得到比较好的解决。针对这点,XP提倡大家共同拥有代码,每个人都有权利和义务阅读其他代码,发现和纠正错误,重整和优化代码。这样,这些代码就不仅仅是一两个人写的,而是由整个项目开发队伍共同完成的,错误会减少很多,重用性会尽可能地得到提高,代码质量是非常好。
为了防止修改其他人的代码而引起系统崩溃,每个人在修改后都应该运行测试程序。(从这点,我们可以再次看到,XP的各个惯例和规则是怎样有机地结合在一起的。)
编程规范
XP开发小组中的所有人都遵循一个统一的编程标准,因此,所有的代码看起来好像是一个人写的。因为有了统一的编程规范,每个程序员更加容易读懂其他人写的代码,这是是实现CollectiveCodeOwnership的重要前提之一。
5Metaphor(系统比喻),不加班
XP过程通过使用一些形象的比喻让所有人对系统有个共同的、简洁的认识。XP认为加班是不正常的,因为这说明关于项目进度的估计和安排有问题。
Metaphor(系统比喻)
为了帮助每个人一致清楚地理解要完成的客户需求、要开发的系统功能,XP开发小组用很多形象的比喻来描述系统或功能模块是怎样工作的。比如,对于一个搜索引擎,它的Metaphor可能就是“一大群蜘蛛,在网上四处寻找要捕捉的东西,然后把东西带回巢穴。”
不加班
大量的加班意味着原来的计划是不准确的,或者是程序远不清楚自己到底什么时候能完成什么工作。而且,开发管理人员和客户也因此无法准确掌握开发速度;开发人员也因此非常疲劳。XP认为,如果出现大量的加班现象,开发管理人员(比如Coach)应该和客户一起确定加班的原因,并及时调整项目计划、进度和资源。
XP中一些基本概念的简介
UserStory:开发人员要求客户把所有的需求写成一个个独立的小故事,每个只需要几天时间就可以完成。开发过程中,客户可以随时提出新的UserStory,或者更改以前的UserStory。
StoryEstimates和开发速度:开发小组对每个UserStory进行估算,并根据每个开发周期(Iteration)中的实际情况反复计算开发速度。这样,开发人员和客户能知道每个星期到底能开发多少UserStory。
ReleasePlan和ReleaseScope:整个开发过程中,开发人员将不断地发布新版本。开发人员和客户一起确定每个发布所包含的UserStory。
Iteration(开发周期,或称迭代)和IterationPlan:在一个Release过程中,开发人员要求客户选择最有价值的UserStory作为未来一两个星期的开发内容。
TheSeed:第一个迭代(Iteration)完成后,提交给客户的系统。虽然这不是最终的产品,但它已经实现了几个客户认为是最重要的Story,开发人员将逐步在其基础上增加新的模块。
ContinuousIntegration(整合):把开发完的UserStory的模块一个个拼装起来,一步步接近乃至最终完成最终产品。
验收测试(功能测试):对于每个UserStory,客户将定义一些测试案例,开发人员将使运行这些测试案例的过程自动化。
UnitTest(单元测试):在开始写程序前,程序员针对大部分类的方法,先写出相应的测试程序。
Refactoring(重构):去掉代码中的冗余部分,增加代码的可重用性和伸缩性。
小结
XP的一个成功因素是重视客户的反馈——开发的目的就是为了满足客户的需要。XP方法使开发人员始终都能自信地面对客户需求的变化。XP强调团队合作,经理、客户和开发人员都是开发团队中的一员。团队通过相互之间的充分交流和合作,使用XP这种简单但有效的方式,努力开发出高质量的软件。XP的设计简单而高效;程序员们通过测试获得客户反馈,并根据变化修改代码和设计,他们总是争取尽可能早地将软件交付给客户。XP程序员能够勇于面对需求和技术上的变化。
订阅:
博文 (Atom)