Checklist: Architecture and Design Review for Performance and Scalability


Retired Content

This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This page may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.

patterns & practices Developer Center

Improving .NET Application Performance and Scalability

J.D. Meier, Srinath Vasireddy, Ashish Babbar, and Alex Mackman
Microsoft Corporation

May 2004

Related Links

Home Page for Improving .NET Application Performance and Scalability

Send feedback to

patterns & practices Library

How to Use This Checklist

This checklist is a companion to Chapter 4, "Architecture and Design Review of a .NET Application for Performance and Scalability"

Deployment and Infrastructure

Ff647699.checkbox(en-us,PandP.10).gifUse distributed architectures appropriately. Do not introduce distribution unnecessarily.
Ff647699.checkbox(en-us,PandP.10).gifCarefully select appropriate distributed communication mechanisms.
Ff647699.checkbox(en-us,PandP.10).gifLocate components that interact frequently within the same boundary or as close to each other as possible.
Ff647699.checkbox(en-us,PandP.10).gifTake infrastructure restrictions into account in your design.
Ff647699.checkbox(en-us,PandP.10).gifConsider network bandwidth restrictions.
Ff647699.checkbox(en-us,PandP.10).gifIdentify resource restrictions.
Ff647699.checkbox(en-us,PandP.10).gifEnsure your design does not prevent you from scaling up.
Ff647699.checkbox(en-us,PandP.10).gifEnsure your design does not prevent you from scaling out and it uses logical layers, does not unwittingly introduce affinity, and supports load balancing.

Coupling and Cohesion

Ff647699.checkbox(en-us,PandP.10).gifEnsure your design is loosely coupled.
Ff647699.checkbox(en-us,PandP.10).gifExhibit appropriate degrees of cohesion in your design and group together logically related entities, such as classes and methods.
Ff647699.checkbox(en-us,PandP.10).gifRestrict use of late binding and only use late binding where it is necessary and appropriate.


Ff647699.checkbox(en-us,PandP.10).gifInterfaces do not enforce chatty communication.
Ff647699.checkbox(en-us,PandP.10).gifEnsure your application only makes remote calls where necessary. Impact is minimized by client-side validation, client-side caching, and batching of work.
Ff647699.checkbox(en-us,PandP.10).gifOptimize remote data exchange.
Ff647699.checkbox(en-us,PandP.10).gifChoose appropriate secure communication mechanisms.
Ff647699.checkbox(en-us,PandP.10).gifUse message queues to decouple component parts of your system.
Ff647699.checkbox(en-us,PandP.10).gifMitigate the impact of long-running calls by using message queues, "fire-and forget" approaches, and asynchronous method calls.
Ff647699.checkbox(en-us,PandP.10).gifDo not use processes where application domains are more appropriate.


Ff647699.checkbox(en-us,PandP.10).gifIn your application do not create threads on a per-request basis, and use the common language runtime (CLR) thread pool instead.
Ff647699.checkbox(en-us,PandP.10).gifOnly types that need to be thread-safe are made thread-safe.
Ff647699.checkbox(en-us,PandP.10).gifCarefully consider lock granularity..
Ff647699.checkbox(en-us,PandP.10).gifEnsure your application acquires shared resources and locks late and releases them early to reduce contention.
Ff647699.checkbox(en-us,PandP.10).gifChoose appropriate synchronization primitives.
Ff647699.checkbox(en-us,PandP.10).gifChoose an appropriate transaction isolation level.
Ff647699.checkbox(en-us,PandP.10).gifEnsure your application uses asynchronous execution for I/O bound tasks and not for CPU bound tasks.

Resource Management

Ff647699.checkbox(en-us,PandP.10).gifEnsure your design supports and makes effective use of pooling.
Ff647699.checkbox(en-us,PandP.10).gifEnsure your application acquires resources late and releases them early.


Ff647699.checkbox(en-us,PandP.10).gifUse caching for data that is expensive to retrieve, compute, and render.
Ff647699.checkbox(en-us,PandP.10).gifCache appropriate data such as relatively static Web pages, specific items of output data, stored procedure parameters, and query results.
Ff647699.checkbox(en-us,PandP.10).gifDo not use caching for data that is too volatile.
Ff647699.checkbox(en-us,PandP.10).gifSelect an appropriate cache location.
Ff647699.checkbox(en-us,PandP.10).gifSelect an appropriate cache expiration policy.

State Management

Ff647699.checkbox(en-us,PandP.10).gifYour design favors stateless components. Or, you considered the negative impact on scalability if you decided to use stateful components.
Ff647699.checkbox(en-us,PandP.10).gifIf you use Microsoft® .NET Framework remoting and need to support load balancing, you use single call server-activated objects (SAO).
Ff647699.checkbox(en-us,PandP.10).gifIf you use Web services, you also use a message-based stateless programming model.
Ff647699.checkbox(en-us,PandP.10).gifIf you use Enterprise Services, also use stateless components to facilitate object pooling.
Ff647699.checkbox(en-us,PandP.10).gifObjects that you want to store in state stores support serialization.
Ff647699.checkbox(en-us,PandP.10).gifConsider the performance impact of view state.
Ff647699.checkbox(en-us,PandP.10).gifUse statistics relating to the number of concurrent sessions and average session data per user to help choose an appropriate session state store.

Data Structures and Algorithms

Ff647699.checkbox(en-us,PandP.10).gifEnsure your design uses appropriate data structures.
Ff647699.checkbox(en-us,PandP.10).gifUse custom collections only where absolutely necessary.
Ff647699.checkbox(en-us,PandP.10).gifExtend the IEnumerable interface for your custom collections.

Data Access

Ff647699.checkbox(en-us,PandP.10).gifPass data across the layers by using the most appropriate data format. Carefully consider the performance implications.
Ff647699.checkbox(en-us,PandP.10).gifUse stored procedures with the Parameters collection for data access.
Ff647699.checkbox(en-us,PandP.10).gifOnly process the data that is required.
Ff647699.checkbox(en-us,PandP.10).gifWhere appropriate, provide data paging solutions for large result sets.
Ff647699.checkbox(en-us,PandP.10).gifUse Enterprise Services declarative transactions for transactions that span multiple resource managers or where you need to flow transaction context across components.
Ff647699.checkbox(en-us,PandP.10).gifIf you manipulate binary large objects (BLOBs), use appropriate chunking techniques, and do not repeatedly move the same BLOB.
Ff647699.checkbox(en-us,PandP.10).gifConsolidate repeated data access code into helper classes.

Exception Handling

Ff647699.checkbox(en-us,PandP.10).gifDo not use exceptions to control regular application flow.
Ff647699.checkbox(en-us,PandP.10).gifUse well-defined exception handling boundaries.
Ff647699.checkbox(en-us,PandP.10).gifStructured exception handling is the preferred error handling mechanism. Do not rely on error codes.
Ff647699.checkbox(en-us,PandP.10).gifOnly catch exceptions for a specific reason and when it is required.

Class Design Considerations

Ff647699.checkbox(en-us,PandP.10).gifClasses own the data that they act upon.
Ff647699.checkbox(en-us,PandP.10).gifDo not use explicit interfaces unnecessarily. Use explicit interfaces for versioning and for polymorphism where you have common functionality across multiple classes.
Ff647699.checkbox(en-us,PandP.10).gifClasses do not contain virtual methods when they are not needed.
Ff647699.checkbox(en-us,PandP.10).gifPrefer overloaded methods to methods that take variable parameters.

patterns & practices Developer Center

Retired Content

This content is outdated and is no longer being maintained. It is provided as a courtesy for individuals who are still using these technologies. This page may contain URLs that were valid when originally published, but now link to sites or pages that no longer exist.