Upload
wesley-thornton
View
218
Download
2
Tags:
Embed Size (px)
Citation preview
High-Performance Best Practices for Web SitesJason Weber, Internet Explorer Team, Microsoft
Session Objectives
1) Best Practices to Improve Performance• Inside look at browser performance• Specific things that you can do today• Principles behind the optimizations
2) Preview Internet Explorer 9 Performance• Hardware Accelerated HTML5• GPU Powered Graphics• Compiled JavaScript
I have a lot of content…
Section #1: Best Practices for Improving Performance
Example Scenario – Wall Street Journal
Starting with Bing
Example Scenario – Wall Street Journal
Blank Background
Example Scenario – Wall Street Journal
Initial HTML
Example Scenario – Wall Street Journal
Heading Appears
Example Scenario – Wall Street Journal
Initial Content
Example Scenario – Wall Street Journal
Right Column Lays Out
Example Scenario – Wall Street Journal
Media Appears
Example Scenario – Wall Street Journal
Customized Content
Example Scenario – Wall Street Journal
Advertisements
Example Scenario – Wall Street Journal
Interacting with Website
15
Picking Five Popular News Sites
Wall Street Journal
Chicago Tribune
USA Today
New York Times
Washington Post
CNN News
Seattle Times
MSN News
Financial Times
Boston Globe
News Site #1
News Site #2
News Site #3
News Site #4
News Site #5
16
Five Popular News Sites
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
17
Five Popular News SitesVariation in Total Size
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
18
Five Popular News SitesNumber Elements to Number of CSS Rules
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
19
Five Popular News SitesNumber of Images
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
20
Five Popular News SitesAmount of JavaScript
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
21
Five Popular News SitesAmount of JavaScript
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
22
Which sites loads the fastest?
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
23
Which sites loads the slowest?
TotalSize
NumberElement
s
CSS Rules
ImageFiles
Script Files
ScriptLines
ScriptLibs
News Site #1 3280kb 8662 1293 137 21 14,216
News Site #2 961kb 820 2964 44 16 3,812
News Site #3 300kb 1187 1366 26 4 9,481
News Site #4 1462kb 4257 893 76 21 11,988
News Site #5 2981kb 3578 1917 88 19 20,722
JQuery Prototype MooTools Scriptaculous Other (JS Lib)YUI
24
Internet Explorer 8 Subsystem Distribution
News Site #1
News Site #2
News Site #3
News Site #4
News Site #5
0
500,000
1,000,000
1,500,000
2,000,000
2,500,000
3,000,000
3,500,000
4,000,000
HTML parsing CSS parser Collections JavaScript Marshalling Native OM
Formatting BlockBuild Layout Rendering
Millisecon
ds
25
Average Distribution Across 5 News Sites
HTML parsingCSS parserCollectionsJavaScriptMarshallingNative OMFormattingBlockBuildLayoutRendering
26
Average Distribution Across Top AJAX Sites
HTML parsingCSS parserCollectionsJavaScriptMarshallingNative OMFormattingBlockBuildLayoutRendering
27
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
28
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
Networking OptimizationsCompress Network Traffic
RequestGET / HTTP/1.1
Accept: */*
Accept-Language: en-us
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible…)
Host: www.live.com
Response
ResponseHTTP/1.1 200 OK
Content-Length: 3479
Expires: -1
Date: Sun, 14 Mar 2010 21:30:46 GMT
Content-Type: text/html; charset=utf-8
Pragma: no-cache
Content-Encoding: gzip
Accept-Encoding: gzip, deflate
Content-Encoding: gzip
Networking Optimizations Provide Cacheable Content
First RequestGET /images/banner.jpg HTTP/1.1
Host: www.microsoft.com
First ResponseHTTP/1.1 200 OK
Content-Type: image/jpeg
Expires: Fri, 19 Mar 2010 00:00:00 GMTExpires: Fri, 19 Mar 2010 00:00:00 GMT
Second RequestGET /images/banner.jpg HTTP/1.1
Host: www.microsoft.com
No Response Required
Networking Optimizations Conditional Requests
RequestGET /images/banner.jpg HTTP/1.1
Host: www.microsoft.com
If-Modified-Since:
Sun, 14 Mar 2010 21:30:46 GMT
Response
ResponseHTTP/1.1 304 Not Modified
Content-Type: image/jpeg
Last-Modified:
Sun, 14 Mar 2010 21:30:46 GMT
If-Modified-Since: Sun, 14 Mar 2010 21:30:46 GMT
Last-Modified: Sun, 14 Mar 2010 21:30:46 GMT
Networking Optimizations Minify Your JavaScript
function CreateBoard() { images = []; board.innerHTML = ''; var c = 1; var i = count / 2 - .5; for (var x = -i; x <= i; x++) { for (var z = -i; z <= i; z++) { var img = document.createElement('img'); img.setAttribute("name", "rotatingimage"); img.style.left = '5000px'; img.x3d = x; img.z3d = z; if (useBrowserLogos == true) { switch (c) { case 1: img.src = IEIMAGE; c ++; break; case 2: img.src = LOGO2; c ++; break; case 3: img.src = LOGO1; c ++; break; case 4: img.src = LOGO4; c ++; break; case 5: img.src = LOGO3; c = 1; break; } } else { img.src = IMAGE; } board.appendChild(img); images.push(img); } } countimages.innerHTML = images.length; }
e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('y v(){a=[];b.e=\'\';9 c=1;9 i=D/2-.5;d(9 x=-i;x<=i;x++){d(9 z=-i;z<=i;z++){9 0=l.H(\'0\');0.o("n","p");0.q.s=\'r\';0.m=x;0.f=z;g(h==k){j(c){8 1:0.6=t;c++;7;8 2:0.6=F;c++;7;8 3:0.6=G;c++;7;8 4:0.6=J;c++;7;8 5:0.6=w;c=1;7}}C{0.6=I}b.B(0);a.A(0)}}E.e=a.u}')
Original JavaScript Minified JavaScript
Networking Optimizations Don’t Scale Images
<html><head>
<title>Test</title></head><body>
…<!-- logo.gif dimensions: 500 x 400 --><img src=“logo.gif" width="50" height="40" />…
</body>
</html>
width="50" height="40"500 x 400
Networking Optimizations Don’t Scale Images
<html><head>
<title>Test</title></head><body>
…<!-- logo.gif dimensions: 50 x 40 --><img src=“logo.gif" width="50" height="40" />…
</body>
</html>
width="50" height="40"
50 x 40
Networking Optimizations Use Image Sprites
<html><head>
<title>Test</title></head><body>
…<img src="a.gif" /> Item 1<img src="b.gif" /> Item 2<img src=“c.gif" /> Item 3<img src=“d.gif" /> Item 4<img src=“e.gif" /> Item 5<img src=“f.gif" /> Item 6…
</body>
</html>
<img src="a.gif" /> Item 1<img src="b.gif" /> Item 2<img src=“c.gif" /> Item 3<img src=“d.gif" /> Item 4<img src=“e.gif" /> Item 5<img src=“f.gif" /> Item 6
Networking Optimizations Use Image Sprites
Networking Optimizations Use Image Sprites
<head><title>Test</title><style type="text/css">
.a, .b { width: 10; height: 10 }
.a, .b { background-image: "abc.gif" }
.a { background-position: 0 0 }
.b { background-position: 0 -10 }</style>
</head>
<body>…<div class="a"></div> Item 1<div class="b"></div> Item 2…
</body>
<div class="a"></div><div class="b"></div>
.a, .b { width: 10; height: 10 }
.a, .b { background-image: "abc.gif" }
.a { background-position: 0 0 }
.b { background-position: 0 -10 }
Internet Explorer 9 Network ToolsUnderstand and Improve Your Networking Performance
39
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
HTML OptimizationsAvoid Inline JavaScript
<html><head>
<title>Test</title><script type="text/javascript"> <!-- function helloWorld() { alert('Hello World!') ; } // -->
</script></head><body>
…</body>
</html>
<script type="text/javascript"> <!-- function helloWorld() { alert('Hello World!') ; } // --></script>
HTML Parsing OptimizationsAvoid Linking JavaScript in Head
<html><head>
<title>Test</title><script src=“myscript.js” … ></script>
</head><body>
…</body>
</html>
<script src=“myscript.js” … ></script>
<html><head>
<title>Test</title></head><body>
………
</body>
</html>
<script src=“myscript.js” … ></script>
HTML Parsing OptimizationsLink JavaScript at End of File
HTML Parsing OptimizationsBut if you must, use the defer tag.
<html><head>
<title>Test</title><script src=“myscript.js” … ></script>
</head><body>
…</body>
</html>
defer="defer">
44
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
CSS Parsing Optimizations Avoid Embedded Styles
<html><head>
<title>Test</title></head><body>
<style> <!--
.green { color:#009900;}
.red { color:#660000;} --></style>
… … …
</body>
</html>
<style> <!-- .green { color:#009900;} .red { color:#660000;} --></style>
CSS Parsing Optimizations Avoid Linking Stylesheets at Bottom of Page
<html><head>
<title>Test</title></head><body>
……
…</body>
</html>
<link rel="stylesheet" type="text/css" href=“mystyles.css" />
CSS Parsing Optimizations Link Stylesheets at Top of Page
<html><head>
<title>Test</title>
</head><body>
………
</body>
</html>
<link rel="stylesheet" type="text/css"href="class.css" />
CSS Parsing Optimizations Avoid Using @Import for Hierarchical Styles
@import url(/stylesheets/one.css);
@import url(/stylesheets/two.css);
.MyHeading
{
color: red;
font-family: 'New Century Schoolbook', serif;
background: white;
}
@import url(/stylesheets/one.css); @import url(/stylesheets/two.css);
CSS Parsing Optimizations Use Multiple Stylesheets for Hierarchical Styles
<html><head>
<title>Test</title>
</head><body>
………
</body>
</html>
<link rel="stylesheet" type="text/css" href=“one.css" /><link rel="stylesheet" type="text/css" href=“two.css" /><link rel="stylesheet" type="text/css" href=“three.css" />
50
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
51
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
JavaScript OptimizationsMinimize Symbol Resolution
Global
Local
Intermediate
Scopes
DOM
Instance
PrototypeChainCost
var foo obj.foo
JavaScript Optimizations Minimize Symbol Resolution
function WorkOnLocalVariable(){
localVariable = 5;return ( localVariable + 1 );
}
localVariablelocalVariable
JavaScript Optimizations Minimize Symbol Resolution
function WorkOnLocalVariable2(){
var localVariable = 5;return ( localVariable + 1 );
}
var localVariablelocalVariabl
e
JavaScript Optimizations Minimize Symbol Resolution: Functions
function IterateWorkOverCollection(){
var length = myCollection.length;
for(var i = 0; i < length; i++){
Work(myCollection[i]);}
}
Work
JavaScript Optimizations Minimize Symbol Resolution: Functions
function IterateWorkOverCollection2(){
var funcWork = Work;var length = myCollection.length;
for(var i = 0; i < length; i++){
funcWork(myCollection[i]);}
}
var funcWork = Work;
funcWork
JavaScript Optimizations Use Native JSON Methods
var jsObjStringParsed = JSON.parse(jsObjString);
var jsObjStringBack = JSON.stringify(jsObjStringParsed);
JSON.parse
JSON.stringify
<html><head>
<title>Test</title></head><body>
………<script src=“myscript.js” … ></script> <script src=“navigation.js” … ></script><script src=“jquery.js” … ></script><script src=“jquery.js” … ></script>
</body>
</html>
JavaScript OptimizationsRemove Duplicate Script Files
<script src=“jquery.js” … ></script><script src=“jquery.js” … ></script>
<html><head>
<title>Test</title></head><body>
……<script src=“jquery.js” … ></script><script src=“prototype.js” … ></script><script src=“dojo.js” … ></script><script src=“animater.js” … ></script><script src=“extjs.js” … ></script><script src=“yahooui.js” … ></script><script src=“mochikit.js” … ></script><script src=“lightbox.js” … ></script><script src=“jslibs.js” … ></script><script src=“qooxdoo.js” … ></script>
JavaScript OptimizationsRemove Duplicate Script Files
<script src=“jquery.js” … ></script><script src=“prototype.js” … ></script><script src=“dojo.js” … ></script><script src=“animater.js” … ></script><script src=“extjs.js” … ></script><script src=“yahooui.js” … ></script><script src=“mochikit.js” … ></script><script src=“lightbox.js” … ></script><script src=“jslibs.js” … ></script><script src=“qooxdoo.js” … ></script>
60
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
Trident (MSHTML)
JScript Engine
Marshalling OptimizationsMinimize DOM Interaction
DOM
Marshalling OptimizationsMinimize DOM Interaction
function CalculateSum(){
// Retrieve Valuesvar lSide = document.body.all.lSide.value;
var rSide = document.body.all.rSide.value;
// Generate Resultdocument.body.all.result.value = lSide + rSide;
}
document.body.alldocument.body.all
document.body.all 9 DOM Lookups
Optimizing Symbol ResolutionMinimize DOM Interaction
function CalculateSum2(){
// Cache Element Collectionvar elms = document.body.all;
// Retrieve Valuesvar lSide = elms.lSide.value;var rSide = elms.rSide.value;
// Generate Resultelms.result.value = lSide + rSide;
}
var elms = document.body.all;
elmselms
elms
3 DOM Lookups
64
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
DOM Optimizations Built In Methods Always More Efficient
function LoopChildren(elm)
{ var nodes = elm.childNodes;var length = nodes.length;
for(var i = 0; i < length; i++){
var node = nodes[i];…
} }
nodes[i];
JavaScript Coding Inefficiencies Built In Methods Always More Efficient
function LoopChildren2(elm)
{ var node = elm.firstChild;
while(node != null){
…node = node.nextSibling;
}}
node.nextSibling;
JavaScript Coding InefficienciesUse Selector API for Efficent Access of Collections
function doValidation2()
{ // Retrieve the required elements by using Selectors // Selects all form fields with 'required' classes var reqs = document.querySelectorAll(".required"); // Set the flag to false by default var missingRequiredField = false;
// Validate that the form data is not empty for (var i = 0; i < reqs.length; i++) {
if (reqs[i].value == "")missingRequiredField = true;
}
}
document.querySelectorAll
68
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
Formatting OptimizationsOnly Send Required Styles
/* These styles are for the home page. */
.Homepage
{
color: red;
background: white;
}
…
/* These styles are for the content page. */
.Contentpage
{
color: red;
background: white;
}
/* These styles are for the home page. */
/* These styles are for the content page. */
CSS PerformanceSimplify selectors
• Complex element selectors are slow• When possible• Use class – or ID-based selectors• Make element selectors as simple as possible• Use child instead of descendent selectors
CSS PerformanceSimplify Selector Patterns: Avoid Descendent Selectors
table tr td ul li {color: green;}
li#myID {color: green;}
ul li {color: purple;}
ul > li {color: purple;}
Use Class or ID Selectors
Use Child Selectors
72
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Browser Subsystems
Layout OptimizationsBatch Visual Changes
function BuildUI(){
var elm = document.getElementById('ui');
// Clear existing contentselm.innerHTML = '';
// Generate UIelm.innerHTML += BuildTitle();elm.innerHTML += BuildBody();elm.innerHTML += BuildFooter();
}
+=+=+=
=
7 innerHTMLReferences
3 Visual Changes
Layout Optimizations Batch Visual Changes
function BuildUI2(){
var elm = document.getElementById('ui');
// Generate UIvar contents = BuildTitle() + BuildBody() + BuildFooter();
// Replace existing contents with UIelm.innerHTML = contents;
}=
1 innerHTMLReference
1 VisualUpdate
75
20 Best Practices to Improve Performance
1) Compress File Downloads
2) User Conditional Requests
3) Provide Cacheable Content
4) Minify Your JavaScript
5) Don’t Scale Images
6) Use Image Sprites
7) Link JavaScript at Bottom
8) Add defer tag to JavaScript
9) Link Stylesheets at Top
10)Avoid Using @import
11)Minimize Walking Lookup Chain
12)Cache Function Pointers
13)Use Native JSON Object
14)Remove Duplicate Script
15)Minimize DOM Interactions
16)Use Efficient DOM Methods
17)Use querySelectorAll for Groups
18)Only Send Required Styles
19)Simplify Selectors
20)Minimize Page Layouts
76
Internet Explorer 8 Subsystem Distribution
News Site #1
News Site #2
News Site #3
News Site #4
News Site #5
0
500,000
1,000,000
1,500,000
2,000,000
2,500,000
3,000,000
3,500,000
4,000,000
HTML parsing CSS parser Collections JavaScript Marshalling Native OM
Formatting BlockBuild Layout Rendering
Millisecon
ds
Section #2:
Preview of Internet Explorer 9 Performance
78
Netw
ork
ing
HTM
L
CSS
Collecti
on
s
JavaS
cri
pt
Mars
halli
ng
DO
M
Form
att
ing
Blo
ck
Bu
ild
ing
Layou
t
Ren
deri
ng
Hardware Accelerated HTML5
Compiled JavaScript
GPU PoweredHTML5 Graphics
Demo Flying Logos
GPU Powered HTML5
81
The Gamers GPU
82
Everyone Has a GPU
83
Windows Experience Index Results - GPU
1 2 3 4 5 6 7 8
Windows Experience IndexGraphics Scores of Vista and Win7 Users
4% 15% 32% 27% 12% 10%
84
GPU Processing Performance
Multi-Core CPU GPU
Compiled JavaScript
Interpreters, Compilers, Intermediary Languages, Machine Code, Stack Alignment, JIT, Type System, Registers, Memory Management, Assembly, Bytecode, Tracing, Syntax Trees, Dynamic Languages, Flow Analysis, Static Languages, Regular Expressions, Inlining, oh my…
87
Foreground
New JavaScript Engine Interpreter(Chakra)
Source Code
Parser AST InterpreterByteCode
88
Multi-Core Processing
Multi-Core CPU
89
Internet Explorer 8 Processor Distribution
Foreground
Background
90
Windows Experience Index Results
Month CPU Count2/1/2010 2.3
Windows Experience IndexNumber of CPU Cores for Vista and Win7 Users
91
Foreground
New JavaScript Engine Background Compiler(Chakra)
Source Code
Parser AST InterpreterByteCode
Background Native Code
Background Compiler
92
Internet Explorer 9 Background Compilation
Foreground
Background
93
Putting It All Together• GPU Powered Graphics• Compiled JavaScript Applications
94
Flying Images – One Animation
IE8
IE9
© 2010 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.
The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after
the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.