iOS应用性能调优的25个建议和技巧

iOS应用性能调优的25个建议和技巧
iOS应用性能调优的25个建议和技巧

性能对iOS 应用的开发尤其重要,如果你的应用失去反应或者很慢,失望的用户会把他们的失望写满App Store的评论。然而由于iOS设备的限制,有时搞好性能是一件难事。开发过程中你会有很多需要注意的事项,你也很容易在做出选择时忘记考虑性能影响。

这正是我写下这篇文章的原因。这篇文章以一个方便查看的核对表的形式整合了你可以用来提升你app性能的25条建议和技巧。

请耐心读完这篇文章,为你未来的app提个速!

注意:每在优化代码之前,你都要注意一个问题,不要养成”预优化”代码的错误习惯。时常使用Instruments去profile你的代码来发现需要提升的方面。Matt Galloway写过一篇很棒的如何利用Instruments来优化代码的文章。

还要注意的是,这里列出的其中一些建议是有代价的,所建议的方式会提升app的速度或者使它更加高效,但也可能需要花很多功夫去应用或者使代码变得更加复杂,所以要仔细选择。

目录

我要给出的建议将分为三个不同的等级:入门级、中级和进阶级:

入门级(这是些你一定会经常用在你app开发中的建议)

? 1. 用ARC管理内存

? 2. 在正确的地方使用reuseIdentifier

? 3. 尽可能使Views透明

? 4. 避免庞大的XIB

? 5. 不要block主线程

? 6. 在Image Views中调整图片大小

?7. 选择正确的Collection

?8. 打开gzip压缩

中级(这些是你可能在一些相对复杂情况下可能用到的)

?9. 重用和延迟加载Views

?10. Cache, Cache, 还是Cache!

?11. 权衡渲染方法

?12. 处理内存警告

?13. 重用大开销的对象

?14. 使用Sprite Sheets

?15. 避免反复处理数据

?16. 选择正确的数据格式

?17. 正确地设定Background Images

?18. 减少使用Web特性

?19. 设定Shadow Path

?20. 优化你的Table View

?21. 选择正确的数据存储选项

进阶级(这些建议只应该在你确信他们可以解决问题和得心应手的情况下采用)

?22. 加速启动时间

?23. 使用Autorelease Pool

?24. 选择是否缓存图片

?25. 尽量避免日期格式转换

无需赘述,让我们进入正题吧~

初学者性能提升

这个部分致力于一些能提高性能的基本改变。但所有层次的开发者都有可能会从这个记录了一些被忽视的项目的小小的性能备忘录里获得一些提升。

1. 用ARC管理内存

ARC(Automatic Reference Counting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动干预了。

下面是你会经常用来去创建一个View的代码段:

1 2 3 4 UIView *view = [[UIView alloc] init]; // ...

[self.view addSubview:view];

[view release];

忘掉代码段结尾的release简直像记得吃饭一样简单。而ARC会自动在底层为你做这些工作。

除了帮你避免内存泄露,ARC还可以帮你提高性能,它能保证释放掉不再需要的对象的内存。这都啥年代了,你应该在你的所有项目里使用ARC!

这里有一些更多关于ARC的学习资源:

?Apple’s official documentation

?Matthijs Hollemans’s Beginning ARC in iOS Tutorial

?Tony Dahbura’s How To Enable ARC in a Cocos2D 2.X Project

?If you still aren’t convinced of the benefits of ARC, check out this article on eight myths about ARC to really convince you why you should be using it!

ARC当然不能为你排除所有内存泄露的可能性。由于阻塞, retain 周期, 管理不完善的CoreFoundation object(还有C结构)或者就是代码太烂依然能导致内存泄露。

这里有一篇很棒的介绍ARC不能做到以及我们该怎么做的文章https://www.360docs.net/doc/3a14466709.html,/blog/2013/1/19/blocks-operations-and-retain-cycles.html。

2. 在正确的地方使用reuseIdentifier

一个开发中常见的错误就是没有给UITableViewCells,UICollectionViewCells,甚至是UITableViewHeaderFooterViews设置正确的reuseIdentifier。

为了性能最优化,table view用`tableView:cellForRowAtIndexPath:` 为rows分配cells的时候,它的数据应该重用自UITableViewCell。一个table view维持一个队列的数据可重用的UITableViewCell 对象。

不使用reuseIdentifier的话,每显示一行table view就不得不设置全新的cell。这对性能的影响可是相当大的,尤其会使app的滚动体验大打折扣。

自iOS6起,除了UICollectionView的cells和补充views,你也应该在header和footer views中使用

reuseIdentifiers。

想要使用reuseIdentifiers的话,在一个table view中添加一个新的cell时在data source object中添加这个方法:

1 2 static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell =

[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

这个方法把那些已经存在的cell从队列中排除,或者在必要时使用先前注册的nib或者class创造新

的cell。如果没有可重用的cell,你也没有注册一个class或者nib的话,这个方法返回nil。

3.尽量把views设置为透明

如果你有透明的Views你应该设置它们的opaque属性为YES。

原因是这会使系统用一个最优的方式渲染这些views。这个简单的属性在IB或者代码里都可以设定。Apple的文档对于为图片设置透明属性的描述是:

(opaque)这个属性给渲染系统提供了一个如何处理这个view的提示。如果设为YES,渲染系统就

认为这个view是完全不透明的,这使得渲染系统优化一些渲染过程和提高性能。如果设置为NO,

渲染系统正常地和其它内容组成这个View。默认值是YES。

在相对比较静止的画面中,设置这个属性不会有太大影响。然而当这个view嵌在scroll view里边,

或者是一个复杂动画的一部分,不设置这个属性的话会在很大程度上影响app的性能。

你可以在模拟器中用Debug\Color Blended Layers选项来发现哪些view没有被设置为opaque。目

标就是,能设为opaque的就全设为opaque!

4. 避免过于庞大的XIB

iOS5中加入的Storyboards(分镜)正在快速取代XIB。然而XIB在一些场景中仍然很有用。比如你的app需要适应iOS5之前的设备,或者你有一个自定义的可重用的view,你就不可避免地要用到他们。

如果你不得不XIB的话,使他们尽量简单。尝试为每个Controller配置一个单独的XIB,尽可能把一个View Controller的view层次结构分散到单独的XIB中去。

需要注意的是,当你加载一个XIB的时候所有内容都被放在了内存里,包括任何图片。如果有一个不会即刻用到的view,你这就是在浪费宝贵的内存资源了。Storyboards就是另一码事儿了,storyboard 仅在需要时实例化一个view controller.

当家在XIB是,所有图片都被chache,如果你在做OS X开发的话,声音文件也是。Apple在相关文档中的记述是:

当你加载一个引用了图片或者声音资源的nib时,nib加载代码会把图片和声音文件写进内存。在OS X中,图片和声音资源被缓存在named cache中以便将来用到时获取。在iOS中,仅图片资源会被存进named caches。取决于你所在的平台,使用NSImage 或UIImage 的`imageNamed:`方法来获取图片资源。

很明显,同样的事情也发生在storyboards中,但我并没有找到任何支持这个结论的文档。如果你了解这个操作,写信给我!

想要了解更多关于storyboards的内容的话你可以看看Matthijs Hollemans的Beginning Storyboards in iOS 5 Part 1和Part 2

5. 不要阻塞主线程

永远不要使主线程承担过多。因为UIKit在主线程上做所有工作,渲染,管理触摸反应,回应输入等都需要在它上面完成。

一直使用主线程的风险就是如果你的代码真的block了主线程,你的app会失去反应。这。。。正是在App Store中拿到一颗星的捷径:]

大部分阻碍主进程的情形是你的app在做一些牵涉到读写外部资源的I/O操作,比如存储或者网络。

你可以使用`NSURLConnection`异步地做网络操作:

+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler

或者使用像AFNetworking这样的框架来异步地做这些操作。

如果你需要做其它类型的需要耗费巨大资源的操作(比如时间敏感的计算或者存储读写)那就用Grand Central Dispatch,或者NSOperation 和NSOperationQueues.

下面代码是使用GCD的模板

1 2 3 4 5 6 7 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // switch to a background thread and perform your expensive operation

dispatch_async(dispatch_get_main_queue(), ^{

// switch back to the main thread to update your UI

});

8 });

发现代码中有一个嵌套的`dispatch_async`吗?这是因为任何UIKit相关的代码需要在主线程上进行。

如果你对NSOperation 或者GCD 的细节感兴趣的话,看看Ray Wenderlich的Multithreading and Grand Central Dispatch on iOS for Beginners,还有Soheil Azarpour 的How To Use NSOperations and NSOperationQueues教程。

6. 在Image Views中调整图片大小

如果要在`UIImageView`中显示一个来自bundle的图片,你应保证图片的大小和UIImageView的大小相同。在运行中缩放图片是很耗费资源的,特别是`UIImageView`嵌套在`UIScrollView`中的情况下。

如果图片是从远端服务加载的你不能控制图片大小,比如在下载前调整到合适大小的话,你可以在下载完成后,最好是用background thread,缩放一次,然后在UIImageView中使用缩放后的图片。

7. 选择正确的Collection

学会选择对业务场景最合适的类或者对象是写出能效高的代码的基础。当处理collections时这句话尤其正确。

Apple有一个Collections Programming Topics的文档详尽介绍了可用的classes间的差别和你该在哪些场景中使用它们。这对于任何使用collections的人来说是一个必读的文档。

呵呵,我就知道你因为太长没看…这是一些常见collection的总结:

?Arrays: 有序的一组值。使用index来lookup很快,使用value lookup很慢,插入/删除很慢。

?Dictionaries: 存储键值对。用键来查找比较快。

?Sets: 无序的一组值。用值来查找很快,插入/删除很快。

8. 打开gzip压缩

大量app依赖于远端资源和第三方API,你可能会开发一个需要从远端下载XML, JSON, HTML或者其它格式的app。

问题是我们的目标是移动设备,因此你就不能指望网络状况有多好。一个用户现在还在edge网络,下一分钟可能就切换到了3G。不论什么场景,你肯定不想让你的用户等太长时间。

减小文档的一个方式就是在服务端和你的app中打开gzip。这对于文字这种能有更高压缩率的数据来说会有更显著的效用。

好消息是,iOS已经在NSURLConnection中默认支持了gzip压缩,当然AFNetworking这些基于它的框架亦然。像Google App Engine这些云服务提供者也已经支持了压缩输出。

如果你不知道如何利用Apache或者IIS(服务器)来打开gzip,可以读下这篇文章。

中级性能提升

你确信你已经掌握了前述那些基础级的优化方案了吗?但实际情况是,有时一些解决方案并不像那些一样明显,它们往往严重依赖于你如何架构和书写你的app。下面的这些建议就是针对这些场景的。

9. 重用和延迟加载(lazy load) Views

更多的view意味着更多的渲染,也就是更多的CPU和内存消耗,对于那种嵌套了很多view在UIScrollView里边的app更是如此。

这里我们用到的技巧就是模仿`UITableView`和`UICollectionView`的操作: 不要一次创建所有的subview,而是当需要时才创建,当它们完成了使命,把他们放进一个可重用的队列中。

这样的话你就只需要在滚动发生时创建你的views,避免了不划算的内存分配。

创建views的能效问题也适用于你app的其它方面。想象一下一个用户点击一个按钮的时候需要呈现一个view的场景。有两种实现方法:

? 1. 创建并隐藏这个view当这个screen加载的时候,当需要时显示它;

? 2. 当需要时才创建并展示。

每个方案都有其优缺点。

用第一种方案的话因为你需要一开始就创建一个view并保持它直到不再使用,这就会更加消耗内存。然而这也会使你的app操作更敏感因为当用户点击按钮的时候它只需要改变一下这个view的可见性。

第二种方案则相反-消耗更少内存,但是会在点击按钮的时候比第一种稍显卡顿。

10. Cache, Cache, 还是Cache!

一个极好的原则就是,缓存所需要的,也就是那些不大可能改变但是需要经常读取的东西。

我们能缓存些什么呢?一些选项是,远端服务器的响应,图片,甚至计算结果,比如UITableView的行高。

NSURLConnection默认会缓存资源在内存或者存储中根据它所加载的HTTP Headers。你甚至可以手动创建一个NSURLRequest然后使它只加载缓存的值。

下面是一个可用的代码段,你可以可以用它去为一个基本不会改变的图片创建一个NSURLRequest 并缓存它:

1 2 3 4 5 6 7 8 9 1 0 + (NSMutableURLRequest *)imageRequestWithURL:(NSURL *)url {

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;// this will make sure the request always returns the cached image

request.HTTPShouldHandleCookies = NO;

request.HTTPShouldUsePipelining = YES;

[request addValue:@"image/*"forHTTPHeaderField:@"Accept"];

return request;

}

注意你可以通过NSURLConnection 获取一个URL request,AFNetworking也一样的。这样你就不必为采用这条tip而改变所有的networking代码了。

如果想了解更多关于HTTP caching, NSURLCache, NSURLConnection的相关知识,可以读下这篇文章()

如果你需要缓存其它不是HTTP Request的东西,你可以用NSCache。

NSCache和NSDictionary类似,不同的是系统回收内存的时候它会自动删掉它的内容。Mattt Thompson有一篇很棒的关于它的文章::https://www.360docs.net/doc/3a14466709.html,/nscache/

如果你对HTTP感兴趣可以读下Google的这篇best-practices document on HTTP caching。

11. 权衡渲染方法

在iOS中可以有很多方法做出漂亮的按钮。你可以用整幅的图片,可调大小的图片,uozhe可以用CALayer,CoreGraphics甚至OpenGL来画它们。

当然每个不同的解决方法都有不同的复杂程度和相应的性能。有一篇Apple UIKit team中的一员Andy Matuschak推荐过的很棒的关于graphic性能的帖子很值得一读。

简单来说,就是用事先渲染好的图片更快一些,因为如此一来iOS就免去了创建一个图片再画东西上去然后显示在屏幕上的程序。问题是你需要把所有你需要用到的图片放到app的bundle里面,这样就增加了体积–这就是使用可变大小的图片更好的地方了: 你可以省去一些不必要的空间,也不需

要再为不同的元素(比如按钮)来做不同的图。

然而,使用图片也意味着你失去了使用代码调整图片的机动性,你需要一遍又一遍不断地重做他们,这样就很浪费时间了,而且你如果要做一个动画效果,虽然每幅图只是一些细节的变化你就需要很多的图片造成bundle大小的不断增大。

总得来说,你需要权衡一下利弊,到底是要性能能还是要bundle保持合适的大小。

12. 处理内存警告

一旦系统内存过低,iOS会通知所有运行中app。在官方文档中是这样记述:

如果你的app收到了内存警告,它就需要尽可能释放更多的内存。最佳方式是移除对缓存,图片object 和其他一些可以重创建的objects的strong references.

幸运的是,UIKit提供了几种收集低内存警告的方法:

?在app delegate中使用`applicationDidReceiveMemoryWarning:` 的方法

?在你的自定义UIViewController的子类(subclass)中覆盖`didReceiveMemoryWarning`

?注册并接收UIApplicationDidReceiveMemoryWarningNotification 的通知

一旦收到这类通知,你就需要释放任何不必要的内存使用。

例如,UIViewController的默认行为是移除一些不可见的view,它的一些子类则可以补充这个方法,删掉一些额外的数据结构。一个有图片缓存的app可以移除不在屏幕上显示的图片。

这样对内存警报的处理是很必要的,若不重视,你的app就可能被系统杀掉。

然而,当你一定要确认你所选择的object是可以被重现创建的来释放内存。一定要在开发中用模拟器中的内存提醒模拟去测试一下。

13. 重用大开销对象

一些objects的初始化很慢,比如NSDateFormatter和NSCalendar。然而,你又不可避免地需要使用它们,比如从JSON或者XML中解析数据。

想要避免使用这个对象的瓶颈你就需要重用他们,可以通过添加属性到你的class里或者创建静态变量来实现。

注意如果你要选择第二种方法,对象会在你的app运行时一直存在于内存中,和单例(singleton)很相似。

下面的代码说明了使用一个属性来延迟加载一个date formatter. 第一次调用时它会创建一个新的实例,以后的调用则将返回已经创建的实例:

1

2 3 4 5 6 7 8 9 1 0 1 1 1 2 // in your .h or inside a class extension

@property (nonatomic, strong) NSDateFormatter *formatter;

// inside the implementation (.m)

// When you need, just use self.formatter

- (NSDateFormatter *)formatter {

if(! _formatter) {

_formatter = [[NSDateFormatter alloc] init];

_formatter.dateFormat = @"EEE MMM dd HH:mm:ss Z yyyy";// twitter date format }

return_formatter;

}

还需要注意的是,其实设置一个NSDateFormatter的速度差不多是和创建新的一样慢的!所以如果你的app需要经常进行日期格式处理的话,你会从这个方法中得到不小的性能提升。

14. 使用Sprite Sheets

你是一个游戏开发者吗,那么Sprite sheets一定是一个你的最好的朋友了。Sprite sheet可以让渲染速度加快,甚至比标准的屏幕渲染方法节省内存。

我们有两个很好的关于Sprite的教程:

1How To Use Animations and Sprite Sheets in Cocos2D

2How to Create and Optimize Sprite Sheets in Cocos2D with Texture Packer and Pixel Formats

第二个教程涵盖了可能在很大程度上影响你游戏性能的pixel格式的细节。

如果你对于spirte sheet还不是很熟悉,可以看下这两个(youtube)视频SpriteSheets –The Movie, Part 1和Part 2。视频的作者是创建Sprite sheet很流行的工具之一Texture Packer的作者Andreas L?w。

除了使用Sprite sheets,其它写在这里的建议当然也可以用于游戏开发中。比如你需要很多的Sprite sheets,像敌人,导弹之类的动作类必备元素,你可以重用这些sprites而不用每次都要重新创建。

15. 避免反复处理数据

许多应用需要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要。在内存中操作数据使它们满足你的数据结构是开销很大的。

比如你需要数据来展示一个table view,最好直接从服务器取array结构的数据以避免额外的中间数据结构改变。

类似的,如果需要从特定key中取数据,那么就使用键值对的dictionary。

16. 选择正确的数据格式

从app和网络服务间传输数据有很多方案,最常见的就是JSON和XML。你需要选择对你的app来

说最合适的一个。

解析JSON会比XML更快一些,JSON也通常更小更便于传输。从iOS5起有了官方内建的JSON deserialization就更加方便使用了。

但是XML也有XML的好处,比如使用SAX来解析XML就像解析本地文件一样,你不需像解析json 一样等到整个文档下载完成才开始解析。当你处理很大的数据的时候就会极大地减低内存消耗和增加性能。

17. 正确设定背景图片

在View里放背景图片就像很多其它iOS编程一样有很多方法:

3使用UIColor的colorWithPatternImage来设置背景色;

4在view中添加一个UIImageView作为一个子View。

如果你使用全画幅的背景图,你就必须使用UIImageView因为UIColor的colorWithPatternImage是用来创建小的重复的图片作为背景的。这种情形下使用UIImageView可以节约不少的内存:

1 2 3 // You could also achieve the same result in Interface Builder

UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background"]];

[self.view addSubview:backgroundView];

如果你用小图平铺来创建背景,你就需要用UIColor的colorWithPatternImage来做了,它会更快地渲染也不会花费很多内存:

1 self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background"]];

18. 减少使用Web特性

UIWebView很有用,用它来展示网页内容或者创建UIKit很难做到的动画效果是很简单的一件事。

但是你可能有注意到UIWebView并不像驱动Safari的那么快。这是由于以JIT compilation为特色的Webkit的Nitro Engine的限制。

所以想要更高的性能你就要调整下你的HTML了。第一件要做的事就是尽可能移除不必要的

javascript,避免使用过大的框架。能只用原生js就更好了。

另外,尽可能异步加载例如用户行为统计script这种不影响页面表达的javascript。

最后,永远要注意你使用的图片,保证图片的符合你使用的大小。使用Sprite sheet提高加载速度和节约内存。

更多相关信息可以看下WWDC 2012 session #601 – Optimizing Web Content in UIWebViews and Websites on iOS

19. 设定Shadow Path

如何在一个View或者一个layer上加一个shadow呢,QuartzCore框架是很多开发者的选择:

1 2 3 4 5 6 7 8 9 #import

// Somewhere later ...

UIView *view = [[UIView alloc] init];

// Setup the shadow ...

https://www.360docs.net/doc/3a14466709.html,yer.shadowOffset = CGSizeMake(-1.0f, 1.0f); https://www.360docs.net/doc/3a14466709.html,yer.shadowRadius = 5.0f;

https://www.360docs.net/doc/3a14466709.html,yer.shadowOpacity = 0.6;

看起来很简单,对吧。

可是,坏消息是使用这个方法也有它的问题…Core Animation不得不先在后台得出你的图形并加好阴影然后才渲染,这开销是很大的。

使用shadowPath的话就避免了这个问题:

https://www.360docs.net/doc/3a14466709.html,yer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];

使用shadow path的话iOS就不必每次都计算如何渲染,它使用一个预先计算好的路径。但问题是自己计算path的话可能在某些View中比较困难,且每当view的frame变化的时候你都需要去update shadow path.

想了解更多可以看看Mark Pospesel的这篇。

20. 优化Table View

Table view需要有很好的滚动性能,不然用户会在滚动过程中发现动画的瑕疵。

为了保证table view平滑滚动,确保你采取了以下的措施:

?正确使用`reuseIdentifier`来重用cells

?尽量使所有的view opaque,包括cell自身

?避免渐变,图片缩放,后台选人

?缓存行高

?如果cell内现实的内容来自web,使用异步加载,缓存请求结果

?使用`shadowPath`来画阴影

?减少subviews的数量

?尽量不适用`cellForRowAtIndexPath:`,如果你需要用到它,只用一次然后缓存结果

?使用正确的数据结构来存储数据

?使用`rowHeight`, `sectionFooterHeight` 和`sectionHeaderHeight`来设定固定的高,不要请求delegate

21. 选择正确的数据存储选项

当存储大块数据时你会怎么做?

你有很多选择,比如:

?使用`NSUerDefaults`

?使用XML, JSON, 或者plist

?使用NSCoding存档

?使用类似SQLite的本地SQL数据库

?使用Core Data

NSUserDefaults的问题是什么?虽然它很nice也很便捷,但是它只适用于小数据,比如一些简单的布尔型的设置选项,再大点你就要考虑其它方式了

XML这种结构化档案呢?总体来说,你需要读取整个文件到内存里去解析,这样是很不经济的。使用SAX又是一个很麻烦的事情。

NSCoding?不幸的是,它也需要读写文件,所以也有以上问题。

在这种应用场景下,使用SQLite 或者Core Data比较好。使用这些技术你用特定的查询语句就能只加载你需要的对象。

在性能层面来讲,SQLite和Core Data是很相似的。他们的不同在于具体使用方法。Core Data代表

一个对象的graph model,但SQLite就是一个DBMS。Apple在一般情况下建议使用Core Data,但是如果你有理由不使用它,那么就去使用更加底层的SQLite吧。

如果你使用SQLite,你可以用FMDB(https://https://www.360docs.net/doc/3a14466709.html,/ccgus/fmdb)这个库来简化SQLite的操作,这样你就不用花很多经历了解SQLite的C API了。

进阶性能提示

想要一些是你成为程序猿忍者的精英级的建议吗?下面这些提示可以帮你把你的app优化到极致!22. 加速启动时间

快速打开app是很重要的,特别是用户第一次打开它时,对app来讲,第一印象太太太重要了。

你能做的就是使它尽可能做更多的异步任务,比如加载远端或者数据库数据,解析数据。

还是那句话,避免过于庞大的XIB,因为他们是在主线程上加载的。所以尽量使用没有这个问题的Storyboards吧!

注意,用Xcode debug时watchdog并不运行,一定要把设备从Xcode断开来测试启动速度

23. 使用Autorelease Pool

`NSAutoreleasePool`负责释放block中的autoreleased objects。一般情况下它会自动被UIKit调用。但是有些状况下你也需要手动去创建它。

假如你创建很多临时对象,你会发现内存一直在减少直到这些对象被release的时候。这是因为只有当UIKit用光了autorelease pool的时候memory才会被释放。

好消息是你可以在你自己的@autoreleasepool里创建临时的对象来避免这个行为:

1 2 3 4 5 NSArray *urls = <# An array of file URLs #>;

for(NSURL *url in urls) {

@autoreleasepool {

NSError *error;

NSString *fileContents = [NSString stringWithContentsOfURL:url

6 7 8 9 encoding:NSUTF8StringEncoding error:&error];

/* Process the string, creating and autoreleasing more objects. */ }

}

这段代码在每次遍历后释放所有autorelease对象

更多关于NSAutoreleasePool请参考官方文档。

24. 选择是否缓存图片

常见的从bundle中加载图片的方式有两种,一个是用`imageNamed`,二是用`imageWithContentsOfFile`,第一种比较常见一点。

既然有两种类似的方法来实现相同的目的,那么他们之间的差别是什么呢?

`imageNamed`的优点是当加载时会缓存图片。`imageNamed`的文档中这么说:

这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。

相反的,`imageWithContentsOfFile`仅加载图片。

下面的代码说明了这两种方法的用法:

1 2 3 UIImage *img = [UIImage imageNamed:@"myImage"];// caching

// or

UIImage *img = [UIImage imageWithContentsOfFile:@"myImage"];// no caching

那么我们应该如何选择呢?

如果你要加载一个大图片而且是一次性使用,那么就没必要缓存这个图片,用`imageWithContentsOfFile`足矣,这样不会浪费内存来缓存它。

然而,在图片反复重用的情况下`imageNamed`是一个好得多的选择。

25. 避免日期格式转换

如果你要用`NSDateFormatter`来处理很多日期格式,应该小心以待。就像先前提到的,任何时候重用`NSDateFormatters`都是一个好的实践。

然而,如果你需要更多速度,那么直接用C是一个好的方案。Sam Soffes有一个不错的帖子(http://soff.es/how-to-drastically-improve-your-app-with-an-afternoon-and-instruments)里面有一些可以用来解析ISO-8601日期字符串的代码,简单重写一下就可以拿来用了。

嗯,直接用C来搞,看起来不错了,但是你相信吗,我们还有更好的方案!

如果你可以控制你所处理的日期格式,尽量选择Unix时间戳。你可以方便地从时间戳转换到NSDate:

1 2 3 - (NSDate*)dateFromUnixTimestamp:(NSTimeInterval)timestamp { return[NSDate dateWithTimeIntervalSince1970:timestamp]; }

这样会比用C来解析日期字符串还快!

需要注意的是,许多web API会以微秒的形式返回时间戳,因为这种格式在javascript中更方便使用。记住用`dateFromUnixTimestamp`之前除以1000就好了。

更多阅读

下列这些WWDC视频强烈推荐给想要提高app性能的开发者。你首先需要保证你有使你的Apple ID 注册为一个开发者身份才能看在这里看WWDC 2012的视频。

?#406: Adopting Automatic Reference Counting

?#238: iOS App Performance: Graphics and Animations

?#242: iOS App Performance: Memory

?#235: iOS App Performance: Responsiveness

?#409: Learning Instruments

?#706: Networking Best Practices

?#514: OpenGL ES Tools and Techniques

?#506: Optimizing 2D Graphics and Animation Performance

?#601: Optimizing Web Content in UIWebViews and Websites on iOS

?#225: Up and Running: Making a Great Impression with Every Launch

一些01年的WWDC视频也很有价值:

?#308: Blocks and Grand Central Dispatch in Practice

?#323: Introducing Automatic Reference Counting

?#312: iOS Performance and Power Optimization with Instruments

?#105: Polishing Your App: Tips and tricks to improve the responsiveness and performance ?#121: Understanding UIKit Rendering

其它一些值得看的视频,大部分来自iOS 5 Tech Talks:

?Your iOS App Performance Hitlist

?Optimizing App Performance with Instruments

?Understanding iOS View Compositing

基于《Your iOS App Performance Hitlist》这个Michael Jurewitz的视频,Ole Begemann写了一篇文字总结的文章。

Apple提供了一个非常有用的叫做“Performance Tuning | 性能调优”的资源。

系统性能优化方案

系统性能优化方案 (第一章) 系统在用户使用一段时间后(1年以上),均存在系统性能(操作、查询、分析)逐渐下降趋势,有些用户的系统性能下降的速度非常快。同时随着目前我们对数据库分库技术的不断探讨,在实际用户的生产环境,现有系统在性能上的不断下降已经非常严重的影响了实际的用户使用,对我公司在行业用户内也带来了不利的影响。 通过对现有系统的跟踪分析与调整,我们对现有系统的性能主要总结了以下几个瓶颈: 1、数据库连接方式问题 古典C/S连接方式对数据库连接资源的争夺对DBServer带来了极大的压力。现代B/S连接方式虽然不同程度上缓解了连接资源的压力,但是由于没有进行数据库连接池的管理,在某种程度上,随着应用服务器的不断扩大和用户数量增加,连接的数量也会不断上升而无截止。 此问题在所有系统中存在。 2、系统应用方式(架构)问题(应用程序设计的优化) 在业务系统中,随着业务流程的不断增加,业务控制不断深入,分析统计、决策支持的需求不断提高,我们现有的业务流程处理没有针对现有的应用特点进行合理的应用结构设计,例如在‘订单、提油单’、‘单据、日报、帐务的处理’关系上,单纯的数据关系已经难以承载多元的业务应用需求。 3、数据库设计问题(指定类型SQL语句的优化)

目前在系统开发过程中,数据库设计由开发人员承担,由于缺乏专业的数据库设计角色、单个功能在整个系统中的定位模糊等原因,未对系统的数据库进行整体的分析与性能设计,仅仅实现了简单的数据存储与展示,随着用户数据量的不断增加,系统性能逐渐下降。 4、数据库管理与研究问题(数据存储、物理存储和逻辑存储的优化) 随着系统的不断增大,数据库管理员(DBA)的角色未建立,整个系统的数据库开发存在非常大的随意性,而且在数据库自身技术的研究、硬件配置的研究等方面未开展,导致系统硬件、系统软件两方面在数据库管理维护、研究上无充分认可、成熟的技术支持。 5、网络通信因素的问题 随着VPN应用技术的不断推广,在远程数据库应用技术上,我们在实际设计、开发上未充分的考虑网络因素,在数据传输量上的不断加大,传统的开发技术和设计方法已经无法承载新的业务应用需求。 针对以上问题,我们进行了以下几个方面的尝试: 1、修改应用技术模式 2、建立历史数据库 3、利用数据库索引技术 4、利用数据库分区技术 通过尝试效果明显,仅供参考!

U8系统性能调优及注意事项

用友U8性能调优及开发注意事项 U8系统为多层部署,以数据为中心的企业业务处理系统。影响和决定系统运行效率主要有以下几个方面,服务器硬件配置;系统部署状态、网络等系统配置。软件环境,程序算法,代码编写、尤其是数据库代码的编写。下面将对这几个方面展开。 一、服务器硬件配置优化 U8系统首先是运行在服务器硬件基础上,所以硬件配置和调整对系统影响很大。同时决定服务器性能的主要是磁盘、内存、处理器三方面。 1.磁盘IO方面 使用U8系统建议配置磁盘阵列,推荐至少4张10K转/分的硬盘以上制作Raid,保证Raid 的磁盘读取速度在200MB/S以上。 日常情况下系统磁盘排队明显,磁盘排队经常在10以上,请考虑增加Raid中硬盘数量,或考虑增加磁盘阵列柜,以缓解磁盘IO的吞吐压力。 2.内存方面 使用U8系统中等规模以上时,数据库服务器保证4GB内存以上。如果应用服务器和数据库服务器安装在同一台服务器上,服务器内存不能低于4GB。 日常情况下系统内存页交换明显,如果服务器内存页交换经常在30 Pages/Sec以上,请考虑增加服务器内存。

3.处理器方面 用户数据量大,系统磁盘操作较多,数据库服务器压力,主要是处理器压力。处理器使用率一般情况下不超过60%。如果CPU占用率长时间超过75%以上,推荐增加服务器处理器个数,或使用多台数据库或应用服务器以减轻系统应用服务器压力。 4.网络要求 局域网内使用U8系统,应保证网络畅通,客户机与服务器的通讯正常。 使用Ping命令从客户机向服务器发送请求, 正常反馈为:Reply from 10.1.43.36: bytes=32 time<1ms TTL=126。 如果响应时间超过1ms(Time>1ms)应调整网络设置,确保通讯。 5.数据库服务器内存分配调优 ●在32位 Microsoft Windows 2003 操作系统中选项的具体配置方式如下: /3GB 修改系统的Boot.ini文件。Boot.ini文件在系统根目录下,缺省是隐藏的,需要打开响应的浏览选项才能看见。安如下方式修改系统启动配置: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows Server 2003, Enterprise" /3GB 注:如果操作系统 Windows 2003 已经安装SP2,系统应该自动开启了PAE,观察应用程序和SQL Server内存是否可以使用超过2GB,如果可以就不用打开/3GB。 /PAE PAE模式也是通过Boot.ini文件来配置,例如: multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows Server 2003, Enterprise" /PAE ●在32位 Microsoft Windows 2008 以上操作系统中选项的具体配置方式如下: /3GB

系统优化最佳方案

WindowsXP终极优化设置(精心整理篇) 声明:以下资料均是从互联网上搜集整理而来,在进行优化设置前,一定要事先做好备份!!! ◆一、系统优化设置 ◆1、系统常规优化 1)关闭系统属性中的特效,这可是简单有效的提速良方。点击开始→控制面板→系统→高级→性能→设置→在视觉效果中,设置为调整为最佳性能→确定即可。 2)“我的电脑”-“属性”-“高级”-“错误报告”-选择“禁用错误汇报”。 3)再点“启动和故障恢复”-“设置”,将“将事件写入系统日志”、“发送管理警报”、“自动重新启动”这三项的勾去掉。再将下面的“写入调试信息”设置为“无”。 4)“我的电脑”-“属性”-“高级”-“性能”-“设置”-“高级”,将虚拟内存值设为物理内存的2.5倍,将初始大小和最大值值设为一样(比如你的内存是256M,你可以设置为640M),并将虚拟内存设置在系统盘外(注意:当移动好后要将原来的文件删除)。 5)将“我的文档”文件夹转到其他分区:右击“我的文档”-“属性“-“移动”,设置 到系统盘以外的分区即可。 6)将IE临时文件夹转到其他分区:打开IE浏览器,选择“工具“-“internet选项”-“常规”-“设置”-“移动文件夹”,设置设置到系统盘以外的分区即可。 ◆2、加速XP的开、关机 1)首先,打开“系统属性”点“高级”选项卡,在“启动和故障恢复”区里打开“设置”,去掉“系统启动”区里的两个√,如果是多系统的用户保留“显示操作系统列表的时间”的√。再点“编辑”确定启动项的附加属性为/fastdetect而不要改为/nodetect,先不要加/noguiboot属性,因为后面还要用到guiboot。 2)接下来这一步很关键,在“系统属性”里打开“硬件”选项卡,打开“设备管理器”,展开“IDE ATA/ATAPI控制器”,双击打开“次要IDE通道”属性,点“高级设置”选 项卡,把设备1和2的传送模式改为“DMA(若可用)”,设备类型如果可以选择“无”就选为“无”,点确定完成设置。同样的方法设置“主要IDE通道”。

常用的网络工具命令解析

如果你玩过路由器的话,就知道路由器里面那些很好玩的命令缩写。 例如,"sh int" 的意思是"show interface"。 现在Windows 2000 也有了类似界面的工具,叫做netsh。 我们在Windows 2000 的cmd shell 下,输入netsh 就出来:netsh> 提示符, 输入int ip 就显示: interface ip> 然后输入dump ,我们就可以看到当前系统的网络配置: # ---------------------------------- # Interface IP Configuration # ---------------------------------- pushd interface ip # Interface IP Configuration for "Local Area Connection" set address name = "Local Area Connection" source = static addr = 192.168.1.168 mask = 255.255.255.0 add address name = "Local Area Connection" addr = 192.1.1.111 mask = 255.255.255.0 set address name = "Local Area Connection" gateway = 192.168.1.100 gwmetric = 1 set dns name = "Local Area Connection" source = static addr = 202.96.209.5 set wins name = "Local Area Connection" source = static addr = none

安卓性能优化方案

随着技术的发展,智能手机硬件配置越来越高,可是它和现在的PC相比,其运算能力,续航能力,存储空间等都还是受到很大的限制,同时用户对手机的体验要求远远高于PC的桌面应用程序。以上理由,足以需要开发人员更加专心去实现和优化你的代码了。选择合适的算法和数据结构永远是开发人员最先应该考虑的事情。同时,我们应该时刻牢记,写出高效代码的两条基本的原则:(1)不要做不必要的事;(2)不要分配不必要的内存。 我从去年开始接触Android开发,以下结合自己的一点项目经验,同时参考了Google的优化文档和网上的诸多技术大牛给出的意见,整理出这份文档。 1. 内存优化 Android系统对每个软件所能使用的RAM空间进行了限制(如:Nexus o ne 对每个软件的内存限制是24M),同时Java语言本身比较消耗内存,d alvik虚拟机也要占用一定的内存空间,所以合理使用内存,彰显出一个程序员的素质和技能。 1) 了解JIT 即时编译(Just-in-time Compilation,JIT),又称动态转译(Dynamic Translation),是一种通过在运行时将字节码翻译为机器码,从而改善字节码编译语言性能的技术。即时编译前期的两个运行时理论是字节码编译和动态编译。Android原来Dalvik虚拟机是作为一种解释器实现,新版

(Android2.2+)将换成JIT编译器实现。性能测试显示,在多项测试中新版本比旧版本提升了大约6倍。 详细请参考https://www.360docs.net/doc/3a14466709.html,/cool_parkour/blog/item/2802b01586e22cd8a6ef3f6b. html 2) 避免创建不必要的对象 就像世界上没有免费的午餐,世界上也没有免费的对象。虽然gc为每个线程都建立了临时对象池,可以使创建对象的代价变得小一些,但是分配内存永远都比不分配内存的代价大。如果你在用户界面循环中分配对象内存,就会引发周期性的垃圾回收,用户就会觉得界面像打嗝一样一顿一顿的。所以,除非必要,应尽量避免尽力对象的实例。下面的例子将帮助你理解这条原则: 当你从用户输入的数据中截取一段字符串时,尽量使用substring函数取得原始数据的一个子串,而不是为子串另外建立一份拷贝。这样你就有一个新的String对象,它与原始数据共享一个char数组。如果你有一个函数返回一个String对象,而你确切的知道这个字符串会被附加到一个Stri ngBuffer,那么,请改变这个函数的参数和实现方式,直接把结果附加到StringBuffer中,而不要再建立一个短命的临时对象。 一个更极端的例子是,把多维数组分成多个一维数组: int数组比Integer数组好,这也概括了一个基本事实,两个平行的int数组比(int,int)对象数组性能要好很多。同理,这试用于所有基本类型的组合。如果你想用一种容器存储(Foo,Bar)元组,尝试使用两个单独的Foo[]

Linux操作系统性能调优的方法

按照传统,Linux不同的发行版本和不同的内核对各项参数及设置均做了改动,从而使得系统能够获得更好的性能。下边将分四部分介绍在Red Hat Enterprise Linux AS和SUSE LINUX Enterprise Server系统下,如何用以下几种技巧进行性能的优化: QUOTE: 1、Disabling daemons (关闭 daemons) 2、Shutting down the GUI (关闭GUI) 3、Changing kernel parameters (改变内核参数) 4、Kernel parameters (内核参数) 5、Tuning the processor subsystem(处理器子系统调优) 6、Tuning the memory subsystem (内存子系统调优) 7、Tuning the file system(文件系统子系统调优) 8、Tuning the network subsystem(网络子系统调优) 1 关闭daemons 有些运行在服务器中的daemons (后台服务),并不是完全必要的。关闭这些daemons可释放更多的内存、减少启动时间并减少CPU处理的进程数。减少daemons数量的同时也增强了服务器的安全性。缺省情况下,多数服务器都可以安全地停掉几个daemons。 Table 10-1列出了Red Hat Enterprise Linux AS下的可调整进程. Table 10-2列出了SUSE LINUX Enterprise Server下的可调整进程.

注意:关闭xfs daemon将导致不能启动X,因此只有在不需要启动GUI图形的时候才可以关闭xfs daemon。使用startx命令前,开启xfs daemon,恢复正常启动X。 可以根据需要停止某个进程,如要停止sendmail 进程,输入如下命令: Red Hat: /sbin/service sendmail stop SUSE LINUX: /etc/init.d/sendmail stop

【实验一】常用网络管理命令的使用

实验1 常用网络管理命令的使用 一.实验目的 1.掌握各种主要命令的作用。 2.掌握各种网络命令的主要测试方法。 3.理解各种网络命令主要参数的含义。 二.实验环境 1.安装有Windows 2003 Server操作系统的计算机二台。 2.至少有两台机器通过交叉双绞线相连或通过集线器相连。 三.实验理论基础 在网络调试的过程中,常常要检测服务器和客户机之间是否连接成功、希望检查本地计算机和某个远程计算机之间的路径、检查TCP/IP的统计情况以及系统使用DHCP分配IP地址时掌握当前所有的TCP/IP网络配置情况,以便及时了解整个网络的运行情况,以确保网络的连通性,保证整个网络的正常运行。在Windows 2003中提供了以下命令行程序。 (1) ping:用于测试计算机之间的连接,这也是网络配置中最常用的命令; (2) ipconfig:用于查看当前计算机的TCP/IP配置; (3) netstat:显示连接统计; (4) tracert:进行源主机与目的主机之间的路由连接分析; (5) arp:实现IP地址到物理地址的单向映射。 四.实验参考步骤 1.Ping命令 Ping用于确定网络的连通性。命令格式为:Ping 主机名/域名/IP地址 一般情况下,用户可以通过使用一系列Ping命令来查找问题出在什么地方,或检验网络运行的情况时。典型的检测次序及对应的可能故障如下: (1)ping 127.0.0.1:如果测试成功,表明网卡、TCP/IP协议的安装、IP地址、子网掩码的设置正常。如果测试不成功,就表示TCP/IP的安装或运行存在某些最基本的问题。 (2)ping 本机IP:如果测试不成功,则表示本地配置或安装存在问题,应当对网络设备和通讯介质进行测试、检查并排除。 (3)ping 局域网内其它IP:如果测试成功,表明本地网络中的网卡和载体运行正确。但如果收到0个回送应答,那么表示子网掩码不正确或网卡配置错误或电缆系统有问题。 (4)ping 网关IP:这个命令如果应答正确,表示局域网中的网关或路由器正在运行并能够做出应答。 (5)ping 远程IP:如果收到正确应答,表示成功的使用了缺省网关。对于拨号上网用户则表示能够成功的访问Internet。 (6) ping localhost:localhost是系统的网络保留名,它是127.0.0.1的别名,每台计算机都应该能够将该名字转换成该地址。如果没有做到这点,则表示主机文件(/Windows/host)存在问题。 (7)Ping https://www.360docs.net/doc/3a14466709.html,(一个著名网站域名):对此域名执行Ping命令,计算机必须先将域名转换成IP地址,通常是通过DNS服务器。如果这里出现故障,则表示本机DNS服务器的IP地址配置不正确,或DNS服务器有故障。 如果上面所列出的所有Ping命令都能正常运行,那么计算机进行本地和远程通信基本上就

SDE性能调优方案

ArcSDE 9.1性能调优方案 编写:李国勇 日期: 2006-11-27 版本: 1.0 密级:内部公开 北京恒华伟业科技有限公司

第一章概述 影响ArcSDE运行性能的因素比较多,对其性能的优化需要根据具体情况而定。总体上说,对ArcSDE性能影响较大的因素是:服务器硬件配置、Oracle参数配置、ArcSDE 参数配置和图层管理模式。 服务器硬件配置包括:CPU主频、物理内存大小、系统总线速度、硬盘数量、磁盘寻道时间等,硬件配置参数不是本文的重点讨论内容。 Oracle参数配置包括表空间的组织和缓冲参数配置;ArcSDE参数配置包括存储参数配置和缓冲参数配置。 本调整方案主要针对输配电GIS系统,不一定适合其它行业。 本优方案所有参数基于ArcSDE 9.1、Oracle 9.2。 1.1 总论 一.性能调优的重点在Oracle,而不在ArcSDE,一般情况下,调整ArcSDE各种参数对性能提升作用不大,ArcSDE使用安装时的默认参数即可; 二.小数据量(图层数据总量小于1G存储空间)下,优化SDE的存储的优化对性能的提升不大,ArcSDE的四个频繁访问的系统表没有必要分开存储; 三.小数据量(图层数据总量小于1G存储空间)下,用户数据存储于SDE用户下对性能的影响也不大,但是出于数据库管理的考虑,建议尽可能将这两类数据分开 存储; 四.对于输配电GIS系统,数据库db_block_size设置为8KB完全满足使用要求,没有必要调整到16KB; 五.如果图层中单个图形元素覆盖范围差异不大,没有必要建立多级Grid Index,而且一般情况下默认Grid Index设置即可满足多数情况下的性能需求; 六.如果注册了版本,建议定期对数据库进行Compress和Analyse,同时要确保undo 表空间有足够可用空间(如1G); 七.定期对磁盘做碎片整理,以提升磁盘I/0性能。 1.2 参考文献 1.ArcSDE 9.1 Configuration and Tuning Guide for Oracle? -- ESRI 2005; 2.Managing ArcSDE 9.1 Application Servers -- ESRI 2005; 3.Cost Control: Inside the Oracle Optimizer -- Oracle Donald K. Burleson。 https://www.360docs.net/doc/3a14466709.html,/oramag/webcolumns/2003/techarticles/burleson_cbo_pt1.html

PhotoShopCC运行缓慢甚至卡死的系统性能优化方法

PhotoShopCC运行缓慢甚至卡死的系统性能优化方法 PhotoshopCC是迄今为止功能最强大的图像处理软件之一,而不少网友对于PhotoshopCC也可谓是又爱又恨。爱很好理解,因为PhotoshopCC能帮助我们高效率地进行各种图像处理;而恨呢,则是因为随着PhotoshopCC功能的日益强大,对电脑配置要求也相应提高,运行过程中很可能会出现相应缓慢甚至是停止相应的情况。笔者作为一个UI设计师,每天都要跟那些尺寸不大但却有着许多图层的图像打交道,因此对于PS性能优化还是有一些心得的。这里,我们就针对PSCC运行缓慢或停止相应这一问题提出一些性能优化建议。当然,你可以根据你的工作流程来参考使用这些优化建议,至于优化效果,一定会让你记忆深刻。PS性能优化技巧分享PS性能优化通用技巧这里,我们先介绍一些PS性能优化的通用技巧,不管你用PS来干什么,这些PS性能优化技巧都能帮你提高工作效率。一、文件大小和尺寸作为一名UI设计师,笔者通常使用的文件格式就是PSD,为了确保图像的兼容性,Adobe对PSD文件的大小限定为最大2GB。当PS运行变慢的时候,你第一件要做的事情就应该是检查文件大小。如果你的应用的每一屏都在同一个PSD里面,文件大小可以非常快就确定下来,尤其是你还要添加图层组合的时候。在Photoshop CC 14.2以后

的版本,PS中新增了“链接到智能对象”功能,该功能的出现可让你的应用用到多个文件中,在长期的更新过程中减去许多麻烦。笔者目前开始做的就是利用该功能来打破一些设计,它不仅能保持PS运行流畅,还能让笔者更加灵活地设计应用的每一屏。除PSD之外,Adobe对其他文件类型的大小也设置有一些限制。如没有文件可以大于 300000x300000像素,PDF文件大小也不能超过10GB。不过使用PS的大型文档格式则不需要担心,这些文件大小的限制为4EB(4000000百万兆字节)。二、效率指示想要知道你的PSD占用了多少系统资源,这是一个十分简便的方法。在PSCC工作区的左下方有一个指示,可现实当前的文件信息。默认状态下,它显示的是“文件大小”,类似“文档:12.5M/384.5M”这样的指示。这时,点击好似播放按钮的符号“?”,就可以按照你的喜好进行自定义设置显示内容,其中就包括“效率”这一项。图01调出“效率”这一显示内容后,一般显示的会是“效率:100%”。而当该数值低于100%的时候,则意味着你并未分配足够的内存给PS,这时候PS会调用磁盘空间来支持运转,PS的图像处理运行自然会慢下来。如果你看到该数值已经低过90%了,那么你就该分配更多的内存给PS。当然,这里我们稍后再做详细解说。不过如果你是在全屏模式下工作,则该指示会隐藏起来,但我们可以通过信息面板查看到相关信息。图02

22提供性能优化方案---Google-Code

Linux系统性能测试与分析 1、前言 通过对系统中和性能相关的各个环节的介绍,使大家知道出现性能问题时可以从那些方面入手去查,而分析典型应用对系统资源使用的特点,让大家对应用和系统资源的依赖有了更直观的认识。大多数的硬件性能问题主要和CPU、磁盘、内存相关,还没有遇到因为开发语言的运行效率对整个应用的性能造成影响,而应用程序设计的缺陷和数据库查询的滥用反倒是最最常见的性能问题。需要注意的是,大多数情况下,虽然性能瓶颈的起因是程序性能差或者是内存不足或者是磁盘瓶颈等各种原因,但最终表现出的结果就是CPU耗尽,系统负载极高,响应迟缓,甚至暂时失去响应,因此我们观察服务器状况时,最先看的就是系统负载和CPU空闲度。当你阅读完了这遍文档以后就会有一个对系统分析的思路。 2、性能分析的目的 2.1找出系统性能瓶颈 1.硬件瓶颈 2.软件瓶颈 2.2提供性能优化方案 1.升级硬件 2.改进系统结构 达到合理的硬件和软件配置,使系统资源使用达到平衡。但遗憾的是解决一个性能瓶颈,往往又会出现另外的瓶颈或者其他问题,所以性能优化更加切实的目标是做到在一定范围内使系统的各项资源使用趋向合理和保持一定的平衡。系统运行良好的时候恰恰也是各项资源达到了一个平衡体,任何一项资源的过渡使用都会造成平衡体系破坏,从而造成系统负载极高或者响应迟缓。比如CPU过渡使用会造成大量进程等待 CPU资源,系统响应变慢,等待会造成进程数增加,进程增加又会造成内存使用增加,内存耗尽又会造成虚拟内存使用,使用虚拟内存又会造成磁盘IO增加和CPU开销增加(用于进程切换、缺页处理的CPU开销) 3、性能相关的各个环节 3.1 硬件资源 3.1.1、CPU ⒈ 是否使用SMP。 ⒉ 单颗CPU的性能对依赖CPU的某些应用的影响很严重,比如数据库的查询处理。 3.1.2、内存

MySQL数据库性能(SQL)优化方案-期末论文

高级数据库技术——期末论文 基于SQL查询的MySQL数据库性能优化研究 :XX 学号:2014XXXXX 学院:计算机学院

摘要: 查询是数据库系统中最基本也是最常用的一种操作,是否具有较快的执行速度,已成为数据库用户和设计者极其关心的问题。在研究开源数据库管理系统MySQL 查询优化技术的基础上,主要结合传统SQL操作优化、深度分析 MySQL 源代码、现代数据库发展几方面进行诸如参数调优,MySQL关联查询,重写相关规则等容展开优化分析研究。 关键词:查询优化,查询重用,查询重写,计划优化

一、传统SQL查询优化操作 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。 对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。 2.使用连接(JOIN)来代替子查询(Sub-Queries) MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示: DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) 使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,

MySQL5.1性能优化方案

MySQL5.1性能优化方案 1.平台数据库 1.1.操作系统 Red Hat Enterprise Linux Server release 5.4 (Tikanga) ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped 32位Linux服务器,单独作为MySQL服务器使用。 1.2.M ySQL 系统使用的是MySQL5.1,最新的MySQL5.5较之老版本有了大幅改进。主要体现在以下几个方面: 1)默认存储引擎更改为InnoDB InnoDB作为成熟、高效的事务引擎,目前已经广泛使用,但MySQL5.1之前的版本默认引擎均为MyISAM,此次MySQL5.5终于将默认数据库存储引擎改为InnoDB,并且引进了Innodb plugin 1.0.7。此次更新对数据库的好处是显而易见的:InnoDB的数据恢复时间从过去的一个甚至几个小时,缩短到几分钟(InnoDB plugin 1.0.7,InnoDB plugin 1.1,恢复时采用红-黑树)。InnoDB Plugin 支持数据压缩存储,节约存储,提高内存命中率,并且支持adaptive flush checkpoint, 可以在某些场合避免数据库出现突发性能瓶颈。 Multi Rollback Segments:原来InnoDB只有一个Segment,同时只支持1023的并发。现已扩充到128个Segments,从而解决了高并发的限制。 2)多核性能提升

Java程序性能优化方案

Java程序性能优化方案 StringTokenizer比String.split()方法效率高 更优化的方式 Java代码 while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } while(true){ String splitStr=null; int j=temp.indexOf(';'); if(j<0)break; SplitStr=tmp.substring(0,j); tmp=tmp.substring(j+1); } 比String.startsWith和endsWith性能更优的方式:Java代码 int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c');

int len=orgStr.length(); if(orgStr.charAt(0)=='a' &&orgStr.charAt(1)=='b' &&orgStr.charAt(2)=='b'); if(orgStr.charAt(len-1)=='a' &&orgStr.charAt(len-2)=='b' &&orgStr.charAt(len-3)=='c'); StringBuffer(int capacity)指定初始容量可以减少扩容的操作

系统调优性能测试报告

XXXXX项目 压力测试报告 2015-10-16 XXXXXX技术有限公司文档信息

批复信息 版本记录

1简介 1.1 文档目的 本测试报告为性能对比测试报告,目的在于总结测试的工作进展情况并分析测试结果,描述本阶段测试是否达到调优预期目标,符合需要要求。 1.2 面向人员 本文档主要面向XX系统用户、测试人员、开发人员、项目管理人员和需要阅读本报告的相关领导。 1.3 参考文档 1.4 术语 1. 每秒事务数(TPS):是指每秒钟完成的事务数,事务是事先在脚本中定义的统计单元; 2. 事务平均响应时间(ART):响应时间一般反映了在并发情况下,客户端从提交请求到接受到应答所经历的时间; 3. 资源利用率:是指在不影响系统正常运行的情况下各服务器的CPU、内存等硬件资源的占用情况; 4. 最大并发用户数:系统所能承受的最大并发用户数;

5. 思考时间(Thinktime):用于模拟实际用户在不同操作之间等待的时间。例如,当用户收到来自服务器的数据时,可能要等待几秒钟查看数据,然后做出响应,这种延时就称为“思考时间”。 2第一轮测试目标 根据项目情况,本次测试的目的主要是解决XX系统个人系统登录和理财交易的处理能力达到客户正常使用要求,根据测试结果评估系统性能,为生产运行提供参考。 1)分析目前系统登录与理财的处理能力; 2)提高登录和理财交易处理能力,达到客户流畅使用的目的; 3第二轮测试安排 1、对整体系统运行环境、系统自身交易功能进行全面分析。通过 压力测试手段优化系统,提高运行效率,并给出未来三到五年 资源配置计划,制定后续保障机制。 2、计划从十月十九日开始方案讨论。

SQL2019系统性能优化解决方案共12页文档

SQL Server 系统性能调优解决方案 前言 近几年,医药流通市场经历了激烈的震荡,导致行业逐步成熟和企业的快速变革,差异化经营成为众多医药流通的竞争选择。时空产品在中国医药流通企业的发展过程中得到了广泛且深入应用,大量的客户化开发和定制支撑了企业管理中横向和纵向的变化,很好的适应了企业在发展过程中不断变化的需求。 对于数据库管理系统的使用,很多用户都面临着一个很棘手的问题:系统效率下降。产生效率下降的因素是多方面: 1.硬件问题 2.软件问题 3.实施问题 正因为产生效率下降的因素很多,所以如何去查找原因成为我们首要关注的问题,时空公司也处在积极探索过程中。时空公司在解决一些客户问题的过程中积累了一些方法和思路,归纳总结后呈现给体系内的技术人员,本方案就系统效率调整所必需的基础知识、方法、技巧等几个方面进行阐述,从而让技术人员能够快速定位问题,解决问题,为合作伙伴提供优质,快捷的服务。 索引简介 索引是根据数据库表中一个或多个列的值进行排序的结构。索引提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似,通过搜索索引找到特定的值,然后跟随指针到达包含该值的行。 索引键:用于创建索引的列。 索引类型 ?聚集索引: 聚集索引基于数据行的键值在表内排序和存储这些数据行。由于数据行按基于聚集索引键的排序次序存储,因此聚集索引对查找行很有效。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。数据行本身构成聚集索引的最低级别(叶子节点)。只有当表包含聚集索引时,表内的数据行才按排序次序存储。如果表没有聚集索引,则其数据行按堆集方式存储。 聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行在物理相邻。例如:如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此类查询的性能。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则可以将该表在该列上聚集(物理排序),避免每次查询该列时都进行排序,从而节省成本。 ?非聚集索引 非聚集索引具有完全独立于数据行的结构。非聚集索引的最低行包含非聚集索引的键值,并且每个键值项都有指针指向包含该键值的数据行。数据行不按基于非聚集键的次序存储。如

实验六常用网络命令使用

实验六常用网络命令使用 一、实验目的: ?了解系统网络命令及其所代表的含义,以及所能对网络进行的操作。 ?通过网络命令了解网络状态,并利用网络命令对网络进行简单的操作。 二、实验设备 实验机房,计算机安装的是 Windows 2000 或 XP 操作系统 三、背景知识 windows 操作系统本身带有多种网络命令,利用这些网络命令可以对网络进行简单的操作。需要注意是这些命令均是在 DOS 命令行下执行。本次实验学习两个最常用的网络命令。 1 、 ARP: 显示和修改 IP 地址与物理地址之间的转换表 ARP -s inet_addr eth_addr [if_addr] ARP -d inet_addr [if_addr] ARP -a [inet_addr] [-N if_addr] -a 显示当前的 ARP 信息,可以指定网络地址,不指定显示所有的表项 -g 跟 -a 一样 . -d 删除由 inet_addr 指定的主机 . 可以使用 * 来删除所有主机 . -s 添加主机,并将网络地址跟物理地址相对应,这一项是永久生效的。 eth_addr 物理地址 . if_addr 网卡的 IP 地址 InetAddr 代表指定的 IP 地址 2 、 Ping 验证与远程计算机的连接。该命令只有在安装了 TCP/IP 协议后才可以使用。

ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] destination-list 参数 -t Ping 指定的计算机直到中断。 -a 将地址解析为计算机名。 -n count 发送 count 指定的 ECHO 数据包数。默认值为 4 。 -l length 发送包含由 length 指定的数据量的 ECHO 数据包。默认为 32 字节;最大值是 65,527 。 -f 在数据包中发送“不要分段”标志。数据包就不会被路由上的网关分段。 -i ttl 将“生存时间”字段设置为 ttl 指定的值。 -v tos 将“服务类型”字段设置为 tos 指定的值。 -r count 在“记录路由”字段中记录传出和返回数据包的路由。 count 可以指定最少 1 台,最多 9 台计算机。 -s count 指定 count 指定的跃点数的时间戳。 -j computer-list 利用 computer-list 指定的计算机列表路由数据包。连续计算机可以被中间网关分隔(路由稀疏源) IP 允许的最大数量为 9 。 -k computer-list 利用 computer-list 指定的计算机列表路由数据包。连续计算机不能被中间网关分隔(路由严格源) IP 允许的最大数量为 9 。 -w timeout 指定超时间隔,单位为毫秒。 destination-list 指定要 ping 的远程计算机。 较一般的用法是 ping –t https://www.360docs.net/doc/3a14466709.html, 四、实验内容和要求 ?利用 Ping 命令检测网络连通性 ?利用 Arp 命令检验 MAC 地址解析 五、实验步骤:

系统性能调优

系统性能调优 概述 性能优化的思路 首先是较为精准的定位问题,借助于相应的工具包,分析系统性能瓶颈在哪,在根据其性能指标,以及所处于层级决定选择优化的方式方法。在选择优化的方式方法时,大家可以参照以下章节调优方法,架构优化递进,进行正确的,有针对性,有步骤的优化。可能会发现部分指导思想或许有相悖嫌疑,大可不必较真,系统优化的过程本身就是一个不断分离+共享的组合拳,至于具体选择哪种优化方式,根据具体需求来定,但大型应用发展的总体思路是不断分离,在通过索引(非数据库)进行关联起来, 切记:优化一定要对系统进行细致的望闻问切,找到性能问题根源切入点,而不被表象迷糊,对症下药,发现病症所在的医生并不比操作手术刀的医生水平差。本文有工具包一章节,对于需要做优化的人员,需要熟悉,他就是我们诊断所用的CT,例如我们发现内存高了,首先想到不是内存不够用,而是为什么如此消耗内存,用工具看看内存消耗在什么地方,试想之,如在医院,病人告诉医生,他心脏不好,医生就换心脏,那样的话,每个人只要熟练掌握菜刀,都可以做医生 迭代优化

性能优化未必一次性就能满足的,可能此处瓶颈消失了,系统一旦运转快速后,在其他地方又发现新的性能瓶颈,所以性能优化是一个迭代的工作。直至满足系统需要的性能指标。 优化的成本 系统性能设计或优化是否可以一步升天,按照最好的分布式架构进行设计和优化呢,单个节点一直也运转及其健康,理论上是可以达到共产国际的,但实际实施层面不可取,必须结合实际的非功能需求进行设计和优化,一则一步到极致的话,系统的成本太过虑庞大,光是性能设计和优化的成本就高于系统本身给客户所提供的价值,也造成研发成本开销过大。二则好像能够架构这样完美系统的人还没诞生。所以一句话也同样适合架构师:有理想而不理想化,废话少扯:具体见法则 调优方法 数据库优化 很多应用,优化DB往往是最直接,最方便,见效最显著的,但并非所有的系统性能都处在瓶颈,或者DB瓶颈解决之后,可能应用层瓶颈,WEB层瓶颈,甚至架构瓶颈都会冒出来了,所以数据库优化十分重要,但往往很多人理解系统优化就是数据库优化,是不全面的。优化角色一般推荐具备较深数据知识的程序员,或者专业的DBA,而不只是会CRUD开

医院信息系统软硬件性能优化方案

目录 [背景] (2) [目标] (2) [性能分析] (2) [优化内容和步骤] (2) [结果检验和日常核查] (4) [注明] (4)

[背景] 随着医院业务量的增长和所使用信息系统模块的增加,数据库容量增长很快,三级医院保留半年的数据情况下,可以达到25G-30G,且使用模块和接口的数量也在增加,现象是速度明显放慢,操作人员使用不顺畅,影响了窗口正常工作,带来软件性能低下的评价。 硬件方案设计时要考虑承载能力和生命周期;对性能问题的考虑应贯穿于开发阶段的全过程,不应只在出现问题时才考虑性能问题。 [目标] 性能调节的目的是通过将网络流通、磁盘I/O 和CPU 时间减到最小,使每个查询的响应时间最短并最大限度地提高整个数据库服务器的吞吐量。 最终通过对性能分析,制定相应的编程规范,引导开发工作,提高产品质量。 [性能分析] 分析对象: 一、服务器 1、处理器:峰值在85%以下 2、缓存、内存:达到一个稳定值 3、磁盘:检测磁盘错误信息和磁盘空间大小(!!) 4、网络:跟踪网络流量 二、数据库 三、应用程序 分析手段方式: 1、性能跟踪器:发现服务器性能瓶颈 2、检查数据库(使用dbcc工具):是否是数据库对象错误引起 3、SQL SERVER Profiler:跟踪软件后台脚本性能,通过统计分析语句问题 4、主业务程序单元运行调试 5、其他跟踪分析工具 [优化内容和步骤] 一、硬件配置 1、硬件性能降低原因 (1)资源不足,并且需要附加或升级的组件;局部硬件存在瓶颈 (2)资源共享工作负载不平均,需要平衡。 (3)资源出现故障,需要替换。 (4)资源不正确,需要更改配置设置。 2、解决办法(升级的量级待定?) (1)服务器升级硬件配置或增加服务器,更改软件配置 (2)升级网络设备,或更改逻辑结构

常用网络命令使用技巧详解

常用网络命令使用技巧详解 我想大家不会忘记Windows是从简单的DOS字符界面发展过来的。虽然我们平时在使用Windows操作系统的时候,主要是对图形界面进行操作,但是DOS命令我们仍然非常有用,下面就让我看来看看这些命令到底有那些作用,同时学习如何使用这些命令的技巧。 一、Ping命令的使用技巧 Ping是个使用频率极高的实用程序,用于确定本地主机是否能与另一台主机交换(发送与接收)数据报。根据返回的信息,我们就可以推断TCP/IP参数是否设置得正确以及运行是否正常。需要注意的是:成功地与另一台主机进行一次或两次数据报交换并不表示TCP/IP配置就是正确的,我们必须执行大量的本地主机与远程主机的数据报交换,才能确信TCP/IP的正确性。 简单的说,Ping就是一个测试程序,如果Ping运行正确,我们大体上就可以排除网络访问层、网卡、MODEM的输入输出线路、电缆和路由器等存在的故障,从而减小了问题的范围。但由于可以自定义所发数据报的大小及无休止的高速发送,Ping也被某些别有用心的人作为DDOS(拒绝服务攻击)的工具,例如许多大型的网站就是被黑客利用数百台可以高速接入互联网的电脑连续发送大量Ping数据报而瘫痪的。 按照缺省设置,Windows上运行的Ping命令发送4个ICMP(网间控制报文协议)回送请求,每个32字节数据,如果一切正常,我们应能得到4个回送应答。 Ping能够以毫秒为单位显示发送回送请求到返回回送应答之间的时间量。如果应答时间短,表示数据报不必通过太多的路由器或网络连接速度比较快。Ping还能显示TTL(Time To Live存在时间)值,我们可以通过TTL值推算一下数据包已经通过了多少个路由器:源地点TTL起始值(就是比返回TTL略大的一个2的乘方数)-返回时TTL值。例如,返回TTL值为119,那么可以推算数据报离开源地址的TTL起始值为128,而源地点到目标地点要通过9个路由器网段(128-119);如果返回TTL值为246,TTL起始值就是256,源地点到目标地点要通过9个路由器网段。 1、通过Ping检测网络故障的典型次序 正常情况下,当我们使用Ping命令来查找问题所在或检验网络运行情况时,我们需要使用许多Ping命令,如果所有都运行正确,我们就可以相信基本的连通性和配置参数没有问题;如果某些Ping命令出现运行故障,它也可以指明到何处去查找问题。下面就给出一个典型的检测次序及对应的可能故障: ·ping 127.0.0.1

相关文档
最新文档