Lecture 10 slides (february 4, 2010)
-
Upload
bruce-lee -
Category
Technology
-
view
223 -
download
1
Transcript of Lecture 10 slides (february 4, 2010)
![Page 1: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/1.jpg)
CS193P - Lecture 10iPhone Application Development
Performance
1Monday, February 8, 2010
![Page 2: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/2.jpg)
Announcements• Paparazzi 2 is due next Wednesday at 11:59pm• Friday section tomorrow at 4 PM, Building 260 Room 113
■ Yelp
2Monday, February 8, 2010
![Page 3: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/3.jpg)
A little more Core Data• NSFetchedResultsController
■ Interacts with the Core Data database on your behalf■ [fetchedResultsController objectAtIndexPath:] gets at row data■ [fetchedResultsController sections] gets at section data
• NSFetchedResultsSectionInfo■ Protocol defining methods that you can call from your
UITableViewDataSource methods■ numberOfSectionsInTableView:■ tableView:numberOfRowsInSection:■ tableView:cellForRowAtIndexPath:
3Monday, February 8, 2010
![Page 4: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/4.jpg)
Today’s Topics• Memory Usage
■ Leaks■ Autorelease■ System warnings
• Concurrency■ Threads■ Operations and queues
• Additional Tips & Tricks
4Monday, February 8, 2010
![Page 5: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/5.jpg)
iPhone Performance Overview• iPhone applications must work with...
■ Limited memory■ Slow or unavailable network resources■ Less powerful hardware
• Write your code with these constraints in mind• Use performance tools to figure out where to invest
5Monday, February 8, 2010
![Page 6: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/6.jpg)
Memory Usage
6Monday, February 8, 2010
![Page 7: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/7.jpg)
Memory on the iPhone• Starting points for performance
■ Load lazily■ Don’t leak■ Watch your autorelease footprint■ Reuse memory
• System memory warnings are a last resort■ Respond to warnings or be terminated
7Monday, February 8, 2010
![Page 8: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/8.jpg)
Loading Lazily• Pervasive in Cocoa frameworks• Do only as much work as is required
■ Application launch time!
• Think about where your code really belongs
• Use multiple NIBs for your user interface
8Monday, February 8, 2010
![Page 9: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/9.jpg)
Loading a Resource Too Early• What if it’s not needed until much later? Or not at all?- (id)init{
self = [super init];if (self) {
// Too early...myImage = [self readSomeHugeImageFromDisk];
}return self;
}
9Monday, February 8, 2010
![Page 10: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/10.jpg)
Loading a Resource Lazily• Wait until someone actually requests it, then create it
• This pattern benefits both memory and launch time
• Not always the right move, consider your specific situation• Notice that above implementation is not thread-safe!
- (UIImage *)myImage{
if (myImage == nil) {myImage = [self readSomeHugeImageFromDisk];
}}
10Monday, February 8, 2010
![Page 11: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/11.jpg)
Plugging Leaks• Memory leaks are very bad
■ Especially in code that runs often
• Luckily, leaks are easy to find with the right tools
11Monday, February 8, 2010
![Page 12: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/12.jpg)
Method Naming and Object Ownership• If a method’s name contains alloc, copy or new,
then it returns a retained object• Balance calls to alloc, copy, new or retain with calls to release or
autorelease■ Early returns can make this very difficult to do!
12Monday, February 8, 2010
![Page 13: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/13.jpg)
Finding Leaks• Use Instruments with the Leaks recorder
13Monday, February 8, 2010
![Page 14: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/14.jpg)
Identifying Leaks in Instruments• Each leak comes with a backtrace• Leaks in system code do exist, but they’re rare
■ If you find one, tell us at http://bugreport.apple.com
• Consider your own application code first
14Monday, February 8, 2010
![Page 15: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/15.jpg)
Caught in the Act
15Monday, February 8, 2010
![Page 16: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/16.jpg)
Demo:Finding Leaks with Instruments
16Monday, February 8, 2010
![Page 17: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/17.jpg)
Autorelease and You• Autorelease simplifies your code
■ Worry less about the scope and lifetime of objects
• When an autorelease pool is drained, it calls -release on each object
• An autorelease pool is created automatically for each iteration of your application’s run loop
17Monday, February 8, 2010
![Page 18: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/18.jpg)
So What’s the Catch?• What if many objects are autoreleased before the pool pops?• Consider the maximum memory footprint of your application
18Monday, February 8, 2010
![Page 19: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/19.jpg)
A Crowded Pool...
19Monday, February 8, 2010
![Page 20: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/20.jpg)
Reducing Your High-Water Mark• When many objects will be autoreleased, create and release
your own pool■ Usually not necessary, don’t do this without thinking!■ Tools can help identify cases where it’s needed■ Loops are the classic case
20Monday, February 8, 2010
![Page 21: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/21.jpg)
Autorelease in a Loop• Remember that many methods return autoreleased objectsfor (int i = 0; i < someLargeNumber; i++) {
NSString *string = ...;string = [string lowercaseString];string = [string stringByAppendingString:...];NSLog(@“%@”, string);
}
21Monday, February 8, 2010
![Page 22: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/22.jpg)
Creating an Autorelease Pool• One option is to create and release for each iterationfor (int i = 0; i < someLargeNumber; i++) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string = ...;string = [string lowercaseString];string = [string stringByAppendingString:...];NSLog(@“%@”, string);
[pool release];}
22Monday, February 8, 2010
![Page 23: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/23.jpg)
Outliving the Autorelease Pool• What if some object is needed outside the scope of the pool?NSString *stringToReturn = nil;
for (int i = 0; i < someLargeNumber; i++) {NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string = ...;string = [string stringByAppendingString:...];
if ([string someCondition]) {stringToReturn = [string retain];
}
[pool release];if (stringToReturn) break;
}
return [stringToReturn autorelease];
23Monday, February 8, 2010
![Page 24: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/24.jpg)
Reducing Use of Autorelease• Another option is to cut down on use of autoreleased objects
■ Not always possible if you’re callling into someone else’s code
• When it makes sense, switch to alloc/init/release• In previous example, perhaps use a single NSMutableString?
24Monday, February 8, 2010
![Page 25: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/25.jpg)
Demo:Measuring Your High-Water Mark
25Monday, February 8, 2010
![Page 26: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/26.jpg)
Object Creation Overhead• Most of the time, creating and deallocating objects is not a
insignificant hit to application performance• In a tight loop, though, it can become a problem...
for (int i = 0; i < someLargeNumber; i++) {MyObject *object = [[MyObject alloc] initWithValue:...];[object doSomething];[object release];
}
26Monday, February 8, 2010
![Page 27: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/27.jpg)
Reusing Objects• Update existing objects rather than creating new ones• Combine intuition and evidence to decide if it’s necessary
• Remember -[UITableView dequeueReusableCellWithIdentifier]
MyObject *myObject = [[MyObject alloc] init];
for (int i = 0; i < someLargeNumber; i++) {myObject.value = ...;[myObject doSomething];
}
[myObject release];
27Monday, February 8, 2010
![Page 28: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/28.jpg)
Memory Warnings• Coexist with system applications• Memory warnings issued when memory runs out
• Respond to memory warnings or face dire consequences!
28Monday, February 8, 2010
![Page 29: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/29.jpg)
Responding to Memory Warnings• Every view controller gets -didReceiveMemoryWarning
■ By default, releases the view if it’s not visible■ Release other expensive resources in your subclass
- (void)didReceiveMemoryWarning{
// Always call super[super didReceiveMemoryWarning];
// Release expensive resources[expensiveResource release];expensiveResource = nil;
}
• App Delegate gets -applicationDidReceiveMemoryWarning:
29Monday, February 8, 2010
![Page 30: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/30.jpg)
What Other Resources Do I Release?• Images• Sounds• Cached data
30Monday, February 8, 2010
![Page 31: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/31.jpg)
Use SQLite/Core Data for Large Data Sets• Many data formats keep everything in memory• SQLite can work with your data in chunks
31Monday, February 8, 2010
![Page 32: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/32.jpg)
More on Memory Performance• “Memory Usage Performance Guidelines”
https://developer.apple.com/iphone/library/documentation/Performance/Conceptual/ManagingMemory/
32Monday, February 8, 2010
![Page 33: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/33.jpg)
Concurrency
33Monday, February 8, 2010
![Page 34: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/34.jpg)
Why Concurrency?• With a single thread, long-running operations may interfere
with user interaction• Multiple threads allow you to load resources or perform
computations without locking up your entire application
34Monday, February 8, 2010
![Page 35: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/35.jpg)
Threads on the iPhone• Based on the POSIX threading API
■ /usr/include/pthread.h
• Higher-level wrappers in the Foundation framework
35Monday, February 8, 2010
![Page 36: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/36.jpg)
NSThread Basics• Run loop automatically instantiated for each thread • Each NSThread needs to create its own autorelease pool• Convenience methods for messaging between threads
36Monday, February 8, 2010
![Page 37: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/37.jpg)
Typical NSThread Use Case- (void)someAction:(id)sender{
// Fire up a new thread[NSThread detachNewThreadSelector:@selector(doWork:) withTarget:self object:someData];
}
- (void)doWork:(id)someData{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[someData doLotsOfWork];
// Message back to the main thread[self performSelectorOnMainThread:@selector(allDone:) withObject:[someData result] waitUntilDone:NO];
[pool release];}
37Monday, February 8, 2010
![Page 38: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/38.jpg)
UIKit and Threads• Unless otherwise noted, UIKit classes are not threadsafe
■ Objects must be created and messaged from the main thread
• You can create a UIImage on a background thread■ But you can’t set it on a UIImageView
38Monday, February 8, 2010
![Page 39: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/39.jpg)
Demo:Threads and Xcode
39Monday, February 8, 2010
![Page 40: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/40.jpg)
Locks• Protect critical sections of code, mediate access to shared data• NSLock and subclasses
- (void)init{
myLock = [[NSLock alloc] init];}
- (void)someMethod{
[myLock lock];// We only want one thread executing this code at once[myLock unlock]
}
40Monday, February 8, 2010
![Page 41: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/41.jpg)
Conditions• NSCondition is useful for producer/consumer model
• Wait is equivalent to: unlock, sleep until signalled, lock
// On the producer thread- (void)produceData{
[condition lock];
// Produce new datanewDataExists = YES;
[condition signal];[condition unlock];
}
// On the consumer thread- (void)consumeData{
[condition lock];while(!newDataExists) {
[condition wait];}
// Consume the new datanewDataExists = NO;
[condition unlock];}
41Monday, February 8, 2010
![Page 42: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/42.jpg)
The Danger of Locks• Very difficult to get locking right!• All it takes is one poorly behaved client
■ Accessing shared data outside of a lock■ Deadlocks■ Priority inversion
42Monday, February 8, 2010
![Page 43: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/43.jpg)
Threading Pitfalls• Subtle, nondeterministic bugs may be introduced• Code may become more difficult to maintain
• In the worst case, more threads can mean slower code
43Monday, February 8, 2010
![Page 44: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/44.jpg)
Alternatives to Threading• Asynchronous (nonblocking) functions
■ Specify target/action or delegate for callback■ NSURLConnection has synchronous and asynchronous variants
• Timers■ One-shot or recurring■ Specify a callback method■ Managed by the run loop
• Higher level constructs like operations
44Monday, February 8, 2010
![Page 45: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/45.jpg)
NSOperation• Abstract superclass• Manages thread creation and lifecycle
• Encapsulate a unit of work in an object• Specify priorities and dependencies
45Monday, February 8, 2010
![Page 46: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/46.jpg)
Creating an NSOperation Subclass• Define a custom init method
• Override -main method to do work
- (id)initWithSomeObject:(id)someObject{
self = [super init];if (self) {
self.someObject = someObject;}return self;
}
- (void)main{
[someObject doLotsOfTimeConsumingWork];}
46Monday, February 8, 2010
![Page 47: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/47.jpg)
NSOperationQueue• Operations are typically scheduled by adding to a queue• Choose a maximum number of concurrent operations• Queue runs operations based on priority and dependencies
47Monday, February 8, 2010
![Page 48: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/48.jpg)
Using an NSInvocationOperation• Concrete subclass of NSOperation• For lightweight tasks where creating a subclass is overkill
- (void)someAction:(id)sender{
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doWork:) object:someObject];
[queue addObject:operation];
[operation release];}
48Monday, February 8, 2010
![Page 49: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/49.jpg)
Demo:Threaded Flickr Loading
49Monday, February 8, 2010
![Page 50: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/50.jpg)
More on Concurrent Programming• “Threading Programming Guide”
https://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Multithreading
50Monday, February 8, 2010
![Page 51: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/51.jpg)
Additional Tips & Tricks
51Monday, February 8, 2010
![Page 52: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/52.jpg)
Drawing Performance• Avoid transparency when possible
■ Opaque views are much faster to draw than transparent views■ Especially important when scrolling
• Don’t call -drawRect: yourself• Use -setNeedsDisplayInRect: instead of -setNeedsDisplay• Use CoreAnimation Instrument
52Monday, February 8, 2010
![Page 53: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/53.jpg)
Reuse Table View Cells• UITableView provides mechanism for reusing table view cells
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return cell;}
// Ask the table view if it has a cell we can reuseUITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (!cell) { // If not, create one with our identifiercell = [[UITableViewCell alloc] initWithFrame:CGRectZero identifier:MyIdentifier];[cell autorelease];
}
53Monday, February 8, 2010
![Page 54: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/54.jpg)
Get notified • Don’t continuously poll!
■ Unless you must, which is rare
• Hurts both responsiveness and battery life• Look in the documentation for a notification, delegate callback
or other asynchronous API
54Monday, February 8, 2010
![Page 55: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/55.jpg)
Take Samples• Instrument that lets you monitor CPU usage• Backtrace taken every fraction of a second• Higher samples = better candidates for optimization
55Monday, February 8, 2010
![Page 56: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/56.jpg)
Recap• Performance is an art and a science
■ Combine tools & concrete data with intuition & best practices
• Don’t waste memory• Concurrency is tricky, abstract it if possible• Drawing is expensive, avoid unnecessary work
56Monday, February 8, 2010
![Page 57: Lecture 10 slides (february 4, 2010)](https://reader035.fdocuments.in/reader035/viewer/2022081403/554dd684b4c905c70e8b4c17/html5/thumbnails/57.jpg)
Questions?
57Monday, February 8, 2010