Blog http://blogs.msdn.com/dorischen Who am I?  Developer Evangelist at Microsoft based in Silicon Valley, CA  Blog: http://blogs.msdn.com/b/dorischen/  Twitter @doristchen  Email: doris.chen@microsoft.com  Has over 15 years of experience in the software industry focusing on web technologies  Spoke and published widely at JavaOne, O'Reilly, Silicon Valley Code Camp, SD West, SD Forum and worldwide User Groups meetings  Doris received her Ph.D. from the University of California at Los Angeles (UCLA) PAGE 2
Tips & tricks that still work http://channel9.msdn.com/Events/Build/2012/3-132
Raw JS code: http://aka.ms/FastJS
Demo HighFive
Arrays Objects and properties Numbers Animation loop Memory allocations Repeat until neighbors list empty Components and control flow
Always start with a good profiler Windows Performance Toolkit http://aka.ms/WinPerfKit F12 UI Responsiveness Tool
Writing fast sites & apps with JavaScript Understandandtargetmodernengines • Principle#1: Stay lean – use less memory • Principle#2: Use fast objects and do fast manipulations • Principle#3: Write fast arithmetic • Principle#4: Use fast arrays • Principle#5: Do less (cross-subsystem) work
Do we expect so much of GC to happen? GC
What triggers a garbage collection? • Every call to new or implicit memory allocation reserves GC memory - Allocations are cheap until current pool is exhausted • When the pool is exhausted, engines force a collection - Collections cause program pauses - Pauses could take milliseconds • Be careful with object allocation patterns in your apps - Every allocation brings you closer to a GC pause
Best practices for staying lean • Avoid unnecessary object creation • Use object pools, when possible • Be aware of allocation patterns - Setting closures to event handlers - Dynamically creating DOM (sub) trees - Implicit allocations in the engine
Results • Overall FG GC time reduced to 1/3rd • Raw JavaScript perf improved ~3x
Internal Type System: Fast Object Types var p1; p1.north = 1; p1.south = 0; var p2; p2.south = 0; p2.north = 1; north 1 south 0 north 1 south 0 north 1 south 0 Base Type “{}” Type “{north}” Type “{south}” Base Type “{}” Type “{south, north}”Type “{north, south}”
Create fast types and avoid type mismatches Don’t add properties conditionally function Player(direction) { if (direction = “NE”) { this.n = 1; this.e = 1; } else if (direction = “ES”) { this.e = 1; this.s = 1; } ... } var p1 = new Player(“NE”); // p1 type {n,e} var p2 = new Player(“ES”); // p2 type {e,s} function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(1,1,0,0);//p1 type {n,e,s,w} var p2 = new Player(0,0,1,1);//p2 type {n,e,s,w} p1.type != p2.type p1.type == p2.type
Avoid conversion from fast type to slower property bags Deleting properties forces conversion function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(); delete p1.n; function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(); p1.n = 0; // or undefined SLOW FAST
Avoid creating slower property bags Restrict using getters, setters and property descriptors in perf critical paths function Player(north, east, south, west) { Object.defineProperty(this, "n", { get : function() { return nVal; }, set : function(value) { nVal=value; }, enumerable: true, configurable: true }); Object.defineProperty(this, "e", { get : function() { return eVal; }, set : function(value) { eVal=value; }, enumerable: true, configurable: true }); ... } var p = new Player(1,1,0,0); var n = p.n; p.n = 0; ... function Player(north, east, south, west) { this.n = north; this.e = east; this.s = south; this.w = west; ... } var p = new Player(1,1,0,0); var n = p.n; p.n = 0; ... SLOW FAST
demo
Results • Time in script execution reduced ~30% • Raw JS performance improved ~30% 3.8s 2.2s
Best practices for fast objects and manipulations • Create and use fast types • Keep shapes of objects consistent • Avoid type mismatches for fast types
Numbers in JavaScript • All numbers are IEEE 64-bit floating point numbers - Great for flexibility - Performance and optimization challenge 31bits 31-bit (tagged) Integers 1bit 1 31bits Object pointer 1bit 0 32bits 32bits Floats 32-bit Integers STACK HEAP FIXED LENGTH, FASTER ACCESS VARIABLE LENGTH, SLOWER ACCESS Boxed
Avoid creating floats if they are not needed Fastest way to indicate integer math is |0 var r = 0; function doMath(){ var a = 5; var b = 2; r = ((a + b) / 2) |0 ; // r = 3 r = Math.round((a + b) / 2); // r = 4 } var r = 0; function doMath(){ var a = 5; var b = 2; r = ((a + b) / 2); // r = 3.5 } ... var intR = Math.floor(r); 0x005e4148r: 0x00000007r: 0x00000009r: Number 3.5 STACK HEAP STACK SLOW FAST SLOW
Take advantage of type-specialization for arithmetic Create separate functions for ints and floats; use consistent argument types function Distance(p1, p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return Math.sqrt(d2); } var point1 = {x:10, y:10}; var point2 = {x:20, y:20}; var point3 = {x:1.5, y:1.5}; var point4 = {x:0x0AB, y:0xBC}; Distance(point1, point3); Distance(point2, point4); function DistanceFloat(p1, p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return Math.sqrt(d2); } function DistanceInt(p1,p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return (Math.sqrt(d2) | 0); } var point1 = {x:10, y:10}; var point2 = {x:20, y:20}; var point3 = {x:1.5, y:1.5}; var point4 = {x:0x0AB, y:0xBC}; DistanceInt(point1, point2); DistanceFloat(point3, point4); SLOW FAST
Best practices for fast arithmetic • Use 31-bit integer math when possible • Avoid floats if they are not needed • Design for type specialized arithmetic
Pre-allocate arrays var a = new Array(100); for (var i = 0; i < 100; i++) { a[i] = i + 2; } var a = new Array(); for (var i = 0; i < 100; i++) { a.push(i + 2); } 0 ? ?+1 ?? …0 100 SLOW FAST
var a = new Array(100000); for (var i = 0; i < a.length; i++) { a[i] = i; } ... //operations on the array ... a[99] = “str”; For mixed arrays, provide an early hint Avoid delayed type conversion and copy var a = new Array(100000); a[0] = “hint”; for (var i = 0; i < a.length; i++) { a[i] = i; } ... //operations on the array ... a[99] = “str”; SLOW FAST
Keep values in arrays consistent Numeric arrays treated like Typed Arrays internally var a = [1,0x2,99.1,5]; //mixed array var b = [0x10,8,9]; //mixed array function add(a,i,b,j) { return a[i] + b[j]; } add(a,0,b,0); add(a,1,b,1); var a = [1,5,8,9]; //int array var b = [0x02,0x10,99.1]; //float array function add(a,i,b,j) { return a[i] + b[j]; } add(a,0,b,0); add(a,1,b,1); SLOW FAST
Keep arrays dense Deleting elements can force type change and de-optimization var a = new Array(1000); //type int ... for (var i = 0; i < boardSize; i++) { matrix[i] = [1,1,0,0]; } //operating on the array ... delete matrix[23]; ... //operating on the array var a = new Array(1000); //type int ... for (var i = 0; i < boardSize; i++) { matrix[i] = [1,1,0,0]; } //operating on the array ... matrix[23] = 0; ... //operating on the array SLOW FAST
Enumerate arrays efficiently Explicit caching of length avoids repetitive property accesses var a = new Array(100); var total = 0; for (var item in a) { total += item; }; a.forEach(function(item){ total += item; }); for (var i = 0; i < a.length; i++) { total += a[i]; } var a = new Array(100); var total = 0; cachedLength = a.length; for (var i = 0; i < cachedLength; i++) { total += a[i]; } SLOW FAST
Best practices for using arrays efficiently • Pre-allocate arrays • Keep array type consistent • Use typed arrays when possible • Keep arrays dense • Enumerate arrays efficiently
Avoid chattiness with the DOM ... //for each rotation document.body.game.getElementById(elID).classList.remove(oldClass) document.body.game.getElementById(elID).classList.add(newClass) ... var element = document.getElementById(elID).classList; //for each rotation element.remove(oldClass) element.add(newClass) ... JavaScript DOM JavaScript DOM
Avoid automatic conversions of DOM values Values from DOM are strings by default this.boardSize = document.getElementById("benchmarkBox").value; for (var i = 0; i < this.boardSize; i++) { //this.boardSize is “25” for (var j = 0; j < this.boardSize; j++) { //this.boardSize is “25” ... } } this.boardSize = parseInt(document.getElementById("benchmarkBox").value); for (var i = 0; i < this.boardSize; i++) { //this.boardSize is 25 for (var j = 0; j < this.boardSize; j++) { //this.boardSize is 25 ... } } FAST (25% marshalling cost reduction in init function) SLOW
Paint as much as your users can see Align timers to display frames setInterval(animate, 0); setTimeout(animate, 0); requestAnimationFrame(animate); setInterval(animate, 1000 / 60); setTimeout(animate, 1000 / 60); MORE WORK LESS WORK
demo
Results Save CPU cycles 75% 65% setTimeout(animate, 0); requestAnimationFrame(animate);
Optimized JS code: http://aka.ms/FasterJS
Overview Concepts High Performance Websites Steve Souders, September 2007 Event Faster Websites: Best Practices Steve Souders, June 2009 High Performance Browser Networking Ilya Grigorik, September 2013 JavaScript Patterns High Performance JavaScript Nicholas Zakas, March 2010 JavaScript the Good Parts Douglas Crockford, May 2008 JavaScript Patterns Stoyan Stefanov, September 2010 JavaScript Cookbook Shelley Powers, July 2010 Microsoft Guidance Windows Store App: JavaScript Best Practices MSDN, December 2012 Performance Tricks to Make Apps & Sites Faster Jatinder Mann, Build 2012 50 Performance Tricks for Windows Store Apps Jason Weber, Build 2011 Engineering Excellence Performance Guidance Jason Weber, EE Forum 2011 Internet Explorer Architectural Overview Jason Weber, PDC 2011 W3C Web Performance Web Performance Working Group Homepage Navigation Timing Specification Blog Posts 1) Measuring Performance with ETW/XPerf 2) Measuring Performance in Lab Environments 3) Browser Subsystems Overview 4) What Common Benchmarks Measure Tools Windows Performance Toolkit Fiddler Web Debugger Contact Doris Chen Twitter: @doristchen Email: doris.chen@Microsoft.com
http://bit.ly/win8OnePage http://bit.ly/HTML5Wins8Camp http://msdn.microsoft.com/en-us/library/windows/apps/hh465194.aspx http://Aka.ms/brockschmidtbook  http:/dev.windows.com PAGE
PAGE • Responsive Web Design and CSS3 • http://bit.ly/CSS3Intro • HTML5, CSS3 Free 1 Day Training • http://bit.ly/HTML5DevCampDownload • Using Blend to Design HTML5 Windows 8 Application (Part II): Style, Layout and Grid • http://bit.ly/HTML5onBlend2 • Using Blend to Design HTML5 Windows 8 Application (Part III): Style Game Board, Cards, Support Different Device, View States • http://bit.ly/HTML5onBlend3 • Feature-specific demos • http://ie.microsoft.com/testdrive/ • Real-world demos • http://www.beautyoftheweb.com/
Microsoft BizSpark Software • Three year access to current, full-featured software development tools • $150 of monthly Windows Azure benefits and discounted rates to quickly build, deploy and manage web applications • Professional technical and product support • Unique and valuable offers from the BizSpark Network Partners to help run your business • Four free MSDN Support Incidents. • Profile, Offers and Events • A connection to the BizSpark ecosystem, giving startups access to investors, advisors and mentors • Opportunities to achieve marketing visibility Support Visibility Microsoft BizSpark is a global program that provides free software, support and visibility to help startups succeed. There are 50K startups in BizSpark in 100+ countries. The three year program is free of charge and gives startups:

OSCON Presentation: Developing High Performance Websites and Modern Apps with JavaScript and HTML5

  • 2.
    Blog http://blogs.msdn.com/dorischen Who amI?  Developer Evangelist at Microsoft based in Silicon Valley, CA  Blog: http://blogs.msdn.com/b/dorischen/  Twitter @doristchen  Email: doris.chen@microsoft.com  Has over 15 years of experience in the software industry focusing on web technologies  Spoke and published widely at JavaOne, O'Reilly, Silicon Valley Code Camp, SD West, SD Forum and worldwide User Groups meetings  Doris received her Ph.D. from the University of California at Los Angeles (UCLA) PAGE 2
  • 5.
    Tips & tricksthat still work http://channel9.msdn.com/Events/Build/2012/3-132
  • 7.
    Raw JS code:http://aka.ms/FastJS
  • 8.
  • 9.
    Arrays Objects and properties Numbers Animationloop Memory allocations Repeat until neighbors list empty Components and control flow
  • 10.
    Always start witha good profiler Windows Performance Toolkit http://aka.ms/WinPerfKit F12 UI Responsiveness Tool
  • 12.
    Writing fast sites& apps with JavaScript Understandandtargetmodernengines • Principle#1: Stay lean – use less memory • Principle#2: Use fast objects and do fast manipulations • Principle#3: Write fast arithmetic • Principle#4: Use fast arrays • Principle#5: Do less (cross-subsystem) work
  • 14.
    Do we expectso much of GC to happen? GC
  • 15.
    What triggers agarbage collection? • Every call to new or implicit memory allocation reserves GC memory - Allocations are cheap until current pool is exhausted • When the pool is exhausted, engines force a collection - Collections cause program pauses - Pauses could take milliseconds • Be careful with object allocation patterns in your apps - Every allocation brings you closer to a GC pause
  • 16.
    Best practices forstaying lean • Avoid unnecessary object creation • Use object pools, when possible • Be aware of allocation patterns - Setting closures to event handlers - Dynamically creating DOM (sub) trees - Implicit allocations in the engine
  • 17.
    Results • Overall FGGC time reduced to 1/3rd • Raw JavaScript perf improved ~3x
  • 19.
    Internal Type System:Fast Object Types var p1; p1.north = 1; p1.south = 0; var p2; p2.south = 0; p2.north = 1; north 1 south 0 north 1 south 0 north 1 south 0 Base Type “{}” Type “{north}” Type “{south}” Base Type “{}” Type “{south, north}”Type “{north, south}”
  • 20.
    Create fast typesand avoid type mismatches Don’t add properties conditionally function Player(direction) { if (direction = “NE”) { this.n = 1; this.e = 1; } else if (direction = “ES”) { this.e = 1; this.s = 1; } ... } var p1 = new Player(“NE”); // p1 type {n,e} var p2 = new Player(“ES”); // p2 type {e,s} function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(1,1,0,0);//p1 type {n,e,s,w} var p2 = new Player(0,0,1,1);//p2 type {n,e,s,w} p1.type != p2.type p1.type == p2.type
  • 21.
    Avoid conversion fromfast type to slower property bags Deleting properties forces conversion function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(); delete p1.n; function Player(north,east,south,west) { this.n = north; this.e = east; this.s = south; this.w = west; } var p1 = new Player(); p1.n = 0; // or undefined SLOW FAST
  • 22.
    Avoid creating slowerproperty bags Restrict using getters, setters and property descriptors in perf critical paths function Player(north, east, south, west) { Object.defineProperty(this, "n", { get : function() { return nVal; }, set : function(value) { nVal=value; }, enumerable: true, configurable: true }); Object.defineProperty(this, "e", { get : function() { return eVal; }, set : function(value) { eVal=value; }, enumerable: true, configurable: true }); ... } var p = new Player(1,1,0,0); var n = p.n; p.n = 0; ... function Player(north, east, south, west) { this.n = north; this.e = east; this.s = south; this.w = west; ... } var p = new Player(1,1,0,0); var n = p.n; p.n = 0; ... SLOW FAST
  • 23.
  • 24.
    Results • Time inscript execution reduced ~30% • Raw JS performance improved ~30% 3.8s 2.2s
  • 25.
    Best practices forfast objects and manipulations • Create and use fast types • Keep shapes of objects consistent • Avoid type mismatches for fast types
  • 27.
    Numbers in JavaScript •All numbers are IEEE 64-bit floating point numbers - Great for flexibility - Performance and optimization challenge 31bits 31-bit (tagged) Integers 1bit 1 31bits Object pointer 1bit 0 32bits 32bits Floats 32-bit Integers STACK HEAP FIXED LENGTH, FASTER ACCESS VARIABLE LENGTH, SLOWER ACCESS Boxed
  • 28.
    Avoid creating floatsif they are not needed Fastest way to indicate integer math is |0 var r = 0; function doMath(){ var a = 5; var b = 2; r = ((a + b) / 2) |0 ; // r = 3 r = Math.round((a + b) / 2); // r = 4 } var r = 0; function doMath(){ var a = 5; var b = 2; r = ((a + b) / 2); // r = 3.5 } ... var intR = Math.floor(r); 0x005e4148r: 0x00000007r: 0x00000009r: Number 3.5 STACK HEAP STACK SLOW FAST SLOW
  • 29.
    Take advantage oftype-specialization for arithmetic Create separate functions for ints and floats; use consistent argument types function Distance(p1, p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return Math.sqrt(d2); } var point1 = {x:10, y:10}; var point2 = {x:20, y:20}; var point3 = {x:1.5, y:1.5}; var point4 = {x:0x0AB, y:0xBC}; Distance(point1, point3); Distance(point2, point4); function DistanceFloat(p1, p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return Math.sqrt(d2); } function DistanceInt(p1,p2) { var dx = p1.x - p2.x; var dy = p1.y - p2.y; var d2 = dx * dx + dy * dy; return (Math.sqrt(d2) | 0); } var point1 = {x:10, y:10}; var point2 = {x:20, y:20}; var point3 = {x:1.5, y:1.5}; var point4 = {x:0x0AB, y:0xBC}; DistanceInt(point1, point2); DistanceFloat(point3, point4); SLOW FAST
  • 30.
    Best practices forfast arithmetic • Use 31-bit integer math when possible • Avoid floats if they are not needed • Design for type specialized arithmetic
  • 32.
    Pre-allocate arrays var a= new Array(100); for (var i = 0; i < 100; i++) { a[i] = i + 2; } var a = new Array(); for (var i = 0; i < 100; i++) { a.push(i + 2); } 0 ? ?+1 ?? …0 100 SLOW FAST
  • 33.
    var a =new Array(100000); for (var i = 0; i < a.length; i++) { a[i] = i; } ... //operations on the array ... a[99] = “str”; For mixed arrays, provide an early hint Avoid delayed type conversion and copy var a = new Array(100000); a[0] = “hint”; for (var i = 0; i < a.length; i++) { a[i] = i; } ... //operations on the array ... a[99] = “str”; SLOW FAST
  • 34.
    Keep values inarrays consistent Numeric arrays treated like Typed Arrays internally var a = [1,0x2,99.1,5]; //mixed array var b = [0x10,8,9]; //mixed array function add(a,i,b,j) { return a[i] + b[j]; } add(a,0,b,0); add(a,1,b,1); var a = [1,5,8,9]; //int array var b = [0x02,0x10,99.1]; //float array function add(a,i,b,j) { return a[i] + b[j]; } add(a,0,b,0); add(a,1,b,1); SLOW FAST
  • 35.
    Keep arrays dense Deletingelements can force type change and de-optimization var a = new Array(1000); //type int ... for (var i = 0; i < boardSize; i++) { matrix[i] = [1,1,0,0]; } //operating on the array ... delete matrix[23]; ... //operating on the array var a = new Array(1000); //type int ... for (var i = 0; i < boardSize; i++) { matrix[i] = [1,1,0,0]; } //operating on the array ... matrix[23] = 0; ... //operating on the array SLOW FAST
  • 36.
    Enumerate arrays efficiently Explicitcaching of length avoids repetitive property accesses var a = new Array(100); var total = 0; for (var item in a) { total += item; }; a.forEach(function(item){ total += item; }); for (var i = 0; i < a.length; i++) { total += a[i]; } var a = new Array(100); var total = 0; cachedLength = a.length; for (var i = 0; i < cachedLength; i++) { total += a[i]; } SLOW FAST
  • 37.
    Best practices forusing arrays efficiently • Pre-allocate arrays • Keep array type consistent • Use typed arrays when possible • Keep arrays dense • Enumerate arrays efficiently
  • 39.
    Avoid chattiness withthe DOM ... //for each rotation document.body.game.getElementById(elID).classList.remove(oldClass) document.body.game.getElementById(elID).classList.add(newClass) ... var element = document.getElementById(elID).classList; //for each rotation element.remove(oldClass) element.add(newClass) ... JavaScript DOM JavaScript DOM
  • 40.
    Avoid automatic conversionsof DOM values Values from DOM are strings by default this.boardSize = document.getElementById("benchmarkBox").value; for (var i = 0; i < this.boardSize; i++) { //this.boardSize is “25” for (var j = 0; j < this.boardSize; j++) { //this.boardSize is “25” ... } } this.boardSize = parseInt(document.getElementById("benchmarkBox").value); for (var i = 0; i < this.boardSize; i++) { //this.boardSize is 25 for (var j = 0; j < this.boardSize; j++) { //this.boardSize is 25 ... } } FAST (25% marshalling cost reduction in init function) SLOW
  • 41.
    Paint as muchas your users can see Align timers to display frames setInterval(animate, 0); setTimeout(animate, 0); requestAnimationFrame(animate); setInterval(animate, 1000 / 60); setTimeout(animate, 1000 / 60); MORE WORK LESS WORK
  • 42.
  • 43.
    Results Save CPU cycles 75%65% setTimeout(animate, 0); requestAnimationFrame(animate);
  • 44.
    Optimized JS code:http://aka.ms/FasterJS
  • 47.
    Overview Concepts High PerformanceWebsites Steve Souders, September 2007 Event Faster Websites: Best Practices Steve Souders, June 2009 High Performance Browser Networking Ilya Grigorik, September 2013 JavaScript Patterns High Performance JavaScript Nicholas Zakas, March 2010 JavaScript the Good Parts Douglas Crockford, May 2008 JavaScript Patterns Stoyan Stefanov, September 2010 JavaScript Cookbook Shelley Powers, July 2010 Microsoft Guidance Windows Store App: JavaScript Best Practices MSDN, December 2012 Performance Tricks to Make Apps & Sites Faster Jatinder Mann, Build 2012 50 Performance Tricks for Windows Store Apps Jason Weber, Build 2011 Engineering Excellence Performance Guidance Jason Weber, EE Forum 2011 Internet Explorer Architectural Overview Jason Weber, PDC 2011 W3C Web Performance Web Performance Working Group Homepage Navigation Timing Specification Blog Posts 1) Measuring Performance with ETW/XPerf 2) Measuring Performance in Lab Environments 3) Browser Subsystems Overview 4) What Common Benchmarks Measure Tools Windows Performance Toolkit Fiddler Web Debugger Contact Doris Chen Twitter: @doristchen Email: doris.chen@Microsoft.com
  • 48.
  • 49.
    PAGE • Responsive WebDesign and CSS3 • http://bit.ly/CSS3Intro • HTML5, CSS3 Free 1 Day Training • http://bit.ly/HTML5DevCampDownload • Using Blend to Design HTML5 Windows 8 Application (Part II): Style, Layout and Grid • http://bit.ly/HTML5onBlend2 • Using Blend to Design HTML5 Windows 8 Application (Part III): Style Game Board, Cards, Support Different Device, View States • http://bit.ly/HTML5onBlend3 • Feature-specific demos • http://ie.microsoft.com/testdrive/ • Real-world demos • http://www.beautyoftheweb.com/
  • 50.
    Microsoft BizSpark Software • Threeyear access to current, full-featured software development tools • $150 of monthly Windows Azure benefits and discounted rates to quickly build, deploy and manage web applications • Professional technical and product support • Unique and valuable offers from the BizSpark Network Partners to help run your business • Four free MSDN Support Incidents. • Profile, Offers and Events • A connection to the BizSpark ecosystem, giving startups access to investors, advisors and mentors • Opportunities to achieve marketing visibility Support Visibility Microsoft BizSpark is a global program that provides free software, support and visibility to help startups succeed. There are 50K startups in BizSpark in 100+ countries. The three year program is free of charge and gives startups: