b64toBlob Timing - Version B
HTML
<table id='output'>
<thead>
<tr><th>
data length →<br/>
partitionSize ↓
</th></tr>
</thead>
<tbody>
</tbody>
</table>
CSS
td, th {
text-align: right;
}
td {
font-family: monospace;
}
JavaScript
function gen64Data(approximateLength) {
return (new Array(0 | (approximateLength / 3))).join('ICAg');
}
function charCodeFromCharacter(c) {
return c.charCodeAt(0);
}
function byteArrayFromByteCharacter(c) {
return new Uint8Array([c.charCodeAt(0)]);
}
function b64toBlob(b64Data, contentType, partitionSize) {
contentType = contentType || '';
partitionSize = partitionSize || 1024;
var byteCharacters = atob(b64Data);
var byteArrays = [];
for (var offset = 0; offset < byteCharacters.length; offset += partitionSize) {
var slice = byteCharacters.slice(offset, offset + partitionSize);
var byteNumbers = new Array(slice.length);
for (var i = 0, l = slice.length; i < l; ++i) {
byteNumbers.push(charCodeFromCharacter(slice[i]));
}
var byteArray = new Uint8Array(byteNumbers, contentType);
byteArrays.push(byteNumbers);
}
var blob = new Blob(byteArrays, {type: contentType});
return blob;
}
// --
var contentType = 'text/plain; charset=utf-8';
var dataLengths = [ 10000000,/*, 5000000, 2500000, 1000000*/ 100000 ];
var partitionSizes = [ Infinity, 100000, 10000, 1000, 500, 200, 125, 100, 75, 50 ];
var headerRow = document.querySelector('#output thead tr');
for (var i = 0; i < dataLengths[i]; i++) {
var header = document.createElement('th');
header.textContent = dataLengths[i];
headerRow.appendChild(header);
}
var tableBody = document.querySelector('#output tbody');
for (var i = 0; i < partitionSizes.length; i++) {
var row = document.createElement('tr');
tableBody.appendChild(row);
var header = document.createElement('th');
header.textContent = partitionSizes[i];
row.appendChild(header);
for (var j = 0; j < dataLengths.length; j++) {
var resultCell = document.createElement('td');
resultCell.style.borderRight = '2px solid black';
row.appendChild(resultCell);
var b64Data =...