Release 3.3 Copyright ©1995 by NeXT Computer, Inc.  All Rights Reserved.

Application Performance Checklist

The following is a brief summary of performance issues that you should check for your application.  Some of them are trivial to check and correct (e.g., making your panels be one-shot in IB), other take more work (e.g., scatter loading, optimizing custom drawing routines).  For more information about any of these items, look up bold words in Librarian, which can be accessed via the Services menu.



Drawing Performance:


__ Best drawing techniques used (xyshow, userpaths, NXRectFillListWithGrays(),...).
__ All windows are sent useOptimizedDrawing: unless this causes incorrect display.
__ Efficient PostScript generated by App's custom Views (check using showps around drawSelf:: in gdb).
__ setwindowtype operator used where appropriate to give better interactive drawing feedback.
__ No redundant drawing. (Run app with -NXAllWindowsRetained.  Solve using -disableDisplay, -displayIfNeeded).



App Memory Usage:


__ All data structures optimized for size, fragmentation and locality.  Look for waste by examining your heap nodes with MallocDebug.  Consider using zone allocation for documents and panels.
__ Optimized text and data working set for common operations.  App is scatter loaded with link optimization techniques.
__ No leaks show up when using "Leaks" feature of MallocDebug.
__ setStringValueNoCopy: used in place of setStringValue: where appropriate.
__ No leaks of kernel objects (ports, open files, vm regions).
__ Copy-on-write memory used where possible (memory mapped files, out-of-line data in messages, vm_copy() for large regions).



Window Server Memory Usage:


__ All windows are deferred (set in Window attribute inspector in Interface Builder).
__ OneShot windows for almost all windows (set in Window attribute inspector in Interface Builder).
__ No windows with alpha channel on screen (check with Winfo app).
__ No unnecessary window depth promotion.  setpattern operator used to draw 1/6, 1/2 and 5/6 grays.
__ No redundant or unused off-screen bitmaps (run app with -NXShowAllWindows).
__ No unarchived, but unused windows.  (run app with -NXShowAllWindows. Create them lazily by moving to separate Interface Builder file.)



Interface Builder:


__ One window per IB module.  Info panel removed from main interface module.
__ No nib sections/files loaded with names, including the one loaded from main() (must use loadNibSection:owner:withNames:NO).
__ All images added to project instead of in individual IB files.  (images load faster, allows sharing of images between .nibs).
__ No extra sounds, images or scratch objects in nib files.
__ Pre-2.0-style set* methods for setting outlets removed.



Images:


__ NXImage compression used where applicable.
__ Don't composite with NX_COPY, use NX_SOVER (doesn't allocate alpha channel).