How Much Faster is HTMLBars Than Handlebars?
When I shared the data with Kris Seldon, he asked whether I had normalized the data and calculated the geometric mean, since that would be a proper way to compare benchmarks. I found the document How not to lie with statistics, The correct way to summarize benchmark results by Philip J. Fleming and John J. Wallace. So, I wrote a query for my data set that would group the metrics data in an effort to normalize the measurements taken from actual users on various devices and group the measurements into the benchmarks that I could generate some reporting data from.
To itentify the benchmarks I could report on I wrote some filters for the various userAgent strings within my metrics data. I considered the combination of the operating system and the browser, e.g. Safari on Macintosh, or iPad combined with a type of metric, e.g. index_view. Then I compared the Ember versions.
With the normalized set of data, I created a query that would take the latest measurements, up to 100, from the normalized data set and calculated the geopmentric mean for the various benchmarks. I calculated the product of each duration in the normalize set; then raised that value by an exponent that is the reciprocal of the number of factors in that product. (Geometric Mean: multiply the numbers and then take the nth root of the product.) The calculation looked something like this Math.round(Math.pow(2 * 3 * 5 * 8 * 13 * 21, 1/6) * 1000) / 1000 (I rounded to the nearest thousandth). As for the normalization of the data, the metrics can be reported by the Ember Version, platform (Macintosh/Windows) and browser (Chrome, Safari, Firefox, iPad, iPhone, Android) for the specific metric type, e.g. index_view, post_view or the metric_table (for the long list of 1,000 items).
I'd like to share my measurements and calculations…
Performance Report
For the upgrade on my site to HTMLBars from Handlebars 1.3…
Across the board, for the benchmarks I am intersted in, it looks like HTMLBars brought a 10-22% gain in rendering speeds
| Platform | Browser | v1.8 Mean | v1.10 Mean | Difference | Gain/Loss % |
|---|---|---|---|---|---|
| Macintosh | Safari | 162.343 | 86.653 | 75.69 | 47% |
| Macintosh | Chrome | 183.794 | 187.945 | -4.151 | -2% |
| Windows | Chrome | 136.289 | 211.616 | -75.327 | -55% |
| iOS | iPhone | 450.503 | 352.764 | 97.739 | 22% |
| Overall | 206.89 | 186.73 | 20.16 | 10% |
| Platform | Browser | v1.8 Mean | v1.10 Mean | Difference | Gain/Loss % |
|---|---|---|---|---|---|
| iOS | iPad | 801.595 | 375.945 | 425.65 | 53% |
| iOS | iPhone | 348.711 | 302.05 | 46.661 | 13% |
| Android | Various | 850.716 | 862.627 | -11.911 | -1% |
| Macintosh | Safari | 109.321 | 117.684 | -8.363 | -8% |
| Macintosh | Chrome | 145.244 | 163.481 | -18.237 | -13% |
| Windows | Chrome | 203.063 | 232.081 | -29.018 | -14% |
| Macintosh | Firefox | 147.432 | 140.634 | 6.798 | 5% |
| Windows | Firefox | 200.542 | 163.704 | 36.838 | 18% |
| Overall | 262.68 | 237.34 | 25.34 | 10% |
| Platform | Browser | v1.8 Mean | v1.10 Mean | Difference | Gain/Loss % |
|---|---|---|---|---|---|
| iOS | iPad | 3323.655 | 2170.638 | 1153.017 | 35% |
| iOS | iPhone | 1580.537 | 1268.771 | 311.766 | 20% |
| Macintosh | Safari | 448.611 | 302.707 | 145.904 | 33% |
| Macintosh | Chrome | 903.33 | 646.06 | 257.27 | 28% |
| Windows | Chrome | 812.356 | 829.604 | -17.248 | -2% |
| Macintosh | Firefox | 865.249 | 743.429 | 121.82 | 14% |
| Overall | 1069.48 | 832.20 | 237.27 | 22% |
The Details
Below is a look at the calculations for each of the benchmarks that I included in the summary above.
The Index (Home) Page
Safari on Macintosh
HTMLbars shaved of 76 milliseconds, a 46% gain in rendering speed
{
fast: 32.94,
geometric_mean: 86.653,
measurments: 100,
name: "index_view",
slow: 819,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Safari"
}
{
fast: 105.18,
geometric_mean: 162.343,
measurments: 4,
name: "index_view",
slow: 244.669,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Safari"
}
Chrome on Macintosh
Only a 4 millisecond difference, a 2% decrease in rendering speed
{
fast: 65.41,
geometric_mean: 187.945,
measurments: 100,
name: "index_view",
slow: 9547.233,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Chrome"
}
{
fast: 90.804,
geometric_mean: 183.794,
measurments: 70,
name: "index_view",
slow: 550.173,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Chrome"
}
Chrome on Windows
Handlebars 1.3 was 74 milliseconds faster, a 35% gain in rendering speed
{
fast: 81.023,
geometric_mean: 211.616,
measurments: 100,
name: "index_view",
slow: 1397,
emberVersion: "1.10",
platform: "Windows",
browser: "Chrome"
}
{
fast: 95.374,
geometric_mean: 136.289,
measurments: 13,
name: "index_view",
slow: 172.329,
emberVersion: "1.8",
platform: "Windows",
browser: "Chrome"
}
Android
Only had measurements on Ember v1.10.0
{
fast: 520.524,
geometric_mean: 841.979,
measurments: 18,
name: "index_view",
slow: 1382.816,
emberVersion: "1.10",
platform: null,
browser: "Android"
}
iPad
Only had measurements on Ember v1.10.0
{
fast: 155,
geometric_mean: 484.614,
measurments: 34,
name: "index_view",
slow: 1120,
emberVersion: "1.10",
platform: null,
browser: "iPad"
}
iPhone
HTMLBars shaved off 98 milliseconds, a 22% gain in rendering speed
{
fast: 143,
geometric_mean: 352.764,
measurments: 62,
name: "index_view",
slow: 1490,
emberVersion: "1.10",
platform: null,
browser: "iPhone"
}
{
fast: 330,
geometric_mean: 450.503,
measurments: 7,
name: "index_view",
slow: 588,
emberVersion: "1.8",
platform: null,
browser: "iPhone"
}
So for the index page the gains from HTMLBars I noticed were on Safari on Macintosh and on the iPhone. However using Chrome on Windows Handlebars was faster.
I didn't have lots of data for the home page in Ember v1.8.1 but did get loads of traffic on some of my posts, let's see how the individual posts pages did.
Post (Article) Pages
iPad
HTMLBars shaved off about 426 milliseconds, a 53% gain in rendering speed
{
fast: 116,
geometric_mean: 375.945,
measurments: 100,
name: "post_view",
slow: 2051,
emberVersion: "1.10",
platform: null,
browser: "iPad"
}
{
fast: 193,
geometric_mean: 801.595,
measurments: 18,
name: "post_view",
slow: 1449,
emberVersion: "1.8",
platform: null,
browser: "iPad"
}
iPhone
HTMLBars shaved off about 47 milliseconds, an 11% gain in rendering speed
{
fast: 8,
geometric_mean: 302.05,
measurments: 100,
name: "post_view",
slow: 2139,
emberVersion: "1.10",
platform: null,
browser: "iPhone"
}
{
fast: 174,
geometric_mean: 348.711,
measurments: 32,
name: "post_view",
slow: 985,
emberVersion: "1.8",
platform: null,
browser: "iPhone"
}
Android
Handlebars 1.3 was 12 milliseconds faster, no rendering speed gains from upgrade to HTMLBars
{
fast: 204.868,
geometric_mean: 862.627,
measurments: 100,
name: "post_view",
slow: 4610.199,
emberVersion: "1.10",
platform: null,
browser: "Android"
}
{
fast: 275.503,
geometric_mean: 850.716,
measurments: 74,
name: "post_view",
slow: 2747.738,
emberVersion: "1.8",
platform: null,
browser: "Android"
}
Safari on Macintosh
Handlebars 1.3 was 8 milliseconds faster, no rendering speed gains from upgrade to HTMLBars
{
fast: 20.164,
geometric_mean: 117.684,
measurments: 100,
name: "post_view",
slow: 5616.18,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Safari"
}
{
fast: 50.377,
geometric_mean: 109.321,
measurments: 100,
name: "post_view",
slow: 2551.46,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Safari"
}
Chrome on Macintosh
Handlebars 1.3 was 18 milliseconds faster, no rendering speed gains from upgrade to HTMLBars
{
fast: 19.82,
geometric_mean: 163.481,
measurments: 100,
name: "post_view",
slow: 4220.102,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Chrome"
}
{
fast: 18.673,
geometric_mean: 145.244,
measurments: 100,
name: "post_view",
slow: 2884.554,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Chrome"
}
Chrome on Windows
Handlebars 1.3 was 29 milliseconds faster, no rendering speed gains from upgrade to HTMLBars
{
fast: 31.697,
geometric_mean: 232.081,
measurments: 100,
name: "post_view",
slow: 13214,
emberVersion: "1.10",
platform: "Windows",
browser: "Chrome"
}
{
fast: 56.472,
geometric_mean: 203.063,
measurments: 100,
name: "post_view",
slow: 3696,
emberVersion: "1.8",
platform: "Windows",
browser: "Chrome"
}
Firefox on Macintosh
HTMLBars was 7 milliseconds faster, only a minor gain in rendering speed
{
fast: 45.745,
geometric_mean: 140.634,
measurments: 100,
name: "post_view",
slow: 1247.685,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Firefox"
}
{
fast: 71.173,
geometric_mean: 147.432,
measurments: 62,
name: "post_view",
slow: 387.791,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Firefox"
}
Firefox on Windows
HTMLBars was 37 milliseconds faster, an 18% gain in rendering speed
{
fast: 73.865,
geometric_mean: 163.704,
measurments: 100,
name: "post_view",
slow: 1860,
emberVersion: "1.10",
platform: "Windows",
browser: "Firefox"
}
{
fast: 69.896,
geometric_mean: 200.542,
measurments: 100,
name: "post_view",
slow: 1305.268,
emberVersion: "1.8",
platform: "Windows",
browser: "Firefox"
}
Metrics Table (long list of 1,000 records)
iPad
I only had a couple measurments…
Looks like HTMLBars can be 1153 milliseconds faster, a 35% gain in rendering speed
{
fast: 2062,
geometric_mean: 2170.638,
measurments: 2,
name: "metrics_table",
slow: 2285,
emberVersion: "1.10",
platform: null,
browser: "iPad"
}
{
fast: 3103,
geometric_mean: 3323.655,
measurments: 2,
name: "metrics_table",
slow: 3560,
emberVersion: "1.8",
platform: null,
browser: "iPad"
}
iPhone
HTMLBars was 312 milliseconds faster, a 20% gain in rendering speed
{
fast: 675,
geometric_mean: 1268.771,
measurments: 8,
name: "metrics_table",
slow: 1568,
emberVersion: "1.10",
platform: null,
browser: "iPhone"
}
{
fast: 871,
geometric_mean: 1580.537,
measurments: 8,
name: "metrics_table",
slow: 5380,
emberVersion: "1.8",
platform: null,
browser: "iPhone"
}
Safari on Macintosh
HTMLBars was 146 milliseconds faster, a 48% gain in rendering speed
{
fast: 239.835,
geometric_mean: 302.707,
measurments: 13,
name: "metrics_table",
slow: 416.321,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Safari"
}
{
fast: 287,
geometric_mean: 448.611,
measurments: 6,
name: "metrics_table",
slow: 568.253,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Safari"
}
Chrome on Macintosh
HTMLBars was 257 milliseconds faster, a 28% gain in rendering speed
{
fast: 414.107,
geometric_mean: 646.06,
measurments: 27,
name: "metrics_table",
slow: 1584.423,
emberVersion: "1.10",
platform: "Macintosh",
browser: "Chrome"
}
{
fast: 457.012,
geometric_mean: 903.33,
measurments: 27,
name: "metrics_table",
slow: 1564.946,
emberVersion: "1.8",
platform: "Macintosh",
browser: "Chrome"
}
Chrome on Windows
Handlebars 1.3 was 17 milliseconds faster, a 2% decrease in rendering speed
{
fast: 615.905,
geometric_mean: 829.604,
measurments: 3,
name: "metrics_table",
slow: 1142.15,
emberVersion: "1.10",
platform: "Windows",
browser: "Chrome"
}
{
fast: 765.64,
geometric_mean: 812.356,
measurments: 2,
name: "metrics_table",
slow: 861.923,
emberVersion: "1.8",
platform: "Windows",
browser: "Chrome"
}
Firefox on Windows
I did not collect enough measurements to make a comparison
Firefox on Macintosh
The data is limited to 2 and 4 measurements, I've incluced the metrics, and unique userAgents to show the individual measuremnts within the normalized set, for example the Firefox versions include versions 33.0 and 37.0.
In this limited set, HTMLBars is 122 milliseconds faster, a 14% gain in rendering speed
{
"durations": [
696.713,
903.421,
660.65,
734.586
],
"fast": 660.65,
"geometric_mean": 743.429,
"measurments": 4,
"metrics": [
{
"date": "2015-02-17T06:04:15.251Z",
"duration": 696.713,
"emberVersion": "1.10.0",
"id": "8b6994ee-268b-43ce-8f26-96ddfcf466a7",
"pathname": "/metrics"
},
{
"date": "2015-02-17T06:04:06.243Z",
"duration": 903.421,
"emberVersion": "1.10.0",
"id": "28bad254-c3b9-462e-9966-4bc2fcc8fc63",
"pathname": "/metrics"
},
{
"date": "2015-02-17T06:02:24.487Z",
"duration": 660.65,
"emberVersion": "1.10.0",
"id": "11dfee70-d635-41fd-8e69-2df4f1c70dc1",
"pathname": "/metrics"
},
{
"date": "2015-02-17T06:02:24.021Z",
"duration": 734.586,
"emberVersion": "1.10.0",
"id": "b58722d9-c9eb-4ab2-bac7-41ba187a3646",
"pathname": "/metrics"
}
],
"name": "metrics_table",
"slow": 903.421,
"userAgents": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0"
],
"emberVersion": "1.10",
"platform": "Macintosh",
"browser": "Firefox"
}
{
"metric": {
"durations": [
746.559,
1002.809
],
"fast": 746.559,
"geometric_mean": 865.249,
"measurments": 2,
"metrics": [
{
"date": "2015-02-17T03:02:27.682Z",
"duration": 746.559,
"emberVersion": "1.8.1",
"id": "d828e5b6-c5c2-4fee-8bf3-2d08d97ed36d",
"pathname": "/metrics"
},
{
"date": "2015-02-17T03:02:11.844Z",
"duration": 1002.809,
"emberVersion": "1.8.1",
"id": "e65effb9-4756-4642-8397-1757c4f3be15",
"pathname": "/metrics"
}
],
"name": "metrics_table",
"slow": 1002.809,
"userAgents": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:33.0) Gecko/20100101 Firefox/33.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0"
],
"emberVersion": "1.8",
"platform": "Macintosh",
"browser": "Firefox"
}
}
Perhaps I'll use the queries and API endpoints for my metrics collection and reporting to see how the next version of Ember.js does, or see how a feature change impacts performance.