| OLD | NEW |
| (Empty) | |
| 1 <script> |
| 2 var blobs = []; |
| 3 var bytes = 0; |
| 4 var timeStart; |
| 5 var timeEnd; |
| 6 var doneReading = false; |
| 7 var errors = []; |
| 8 var disableUI = false; |
| 9 |
| 10 function recordError(error) { |
| 11 console.log(error); |
| 12 errors.push(error); |
| 13 } |
| 14 |
| 15 function updateStats() { |
| 16 if (disableUI) return; |
| 17 var num_blobs = document.getElementById('num_blobs'); |
| 18 var total_bytes = document.getElementById('total_bytes'); |
| 19 var time = document.getElementById('time'); |
| 20 num_blobs.innerHTML = '' + blobs.length; |
| 21 total_bytes.innerHTML = '' + bytes; |
| 22 time.innerHTML = '' + (timeEnd - timeStart); |
| 23 } |
| 24 |
| 25 function createBlob(size) { |
| 26 timeStart = performance.now(); |
| 27 var blob = new Blob([new Uint8Array(size)], {type: 'application/octet-string'}
); |
| 28 timeEnd = performance.now(); |
| 29 blobs.push(blob); |
| 30 bytes += size; |
| 31 updateStats(); |
| 32 } |
| 33 |
| 34 function garbageCollect() { |
| 35 blobs = []; |
| 36 bytes = 0; |
| 37 updateStats(); |
| 38 } |
| 39 |
| 40 function addCustom() { |
| 41 var custom_input = document.getElementById('custom_input'); |
| 42 var custom_bytes = custom_input.value; |
| 43 createBlob(custom_bytes * 1); |
| 44 } |
| 45 |
| 46 function readBlobsSerially() { |
| 47 doneReading = false; |
| 48 errors = []; |
| 49 if (blobs.length == 0) { |
| 50 return; |
| 51 } |
| 52 timeStart = performance.now(); |
| 53 var reader = new FileReader(); |
| 54 var currentBlob = 0; |
| 55 var totalSize = 0; |
| 56 var error = document.getElementById('error'); |
| 57 var numRead = 0; |
| 58 reader.onloadend = function(e) { |
| 59 if (reader.error) { |
| 60 if (!disableUI) |
| 61 error.innerHTML += '<br/>Reader error:<br/>' + reader.error.message; |
| 62 recordError('Error when reading blob ' + currentBlob + ': ' + reader.error
); |
| 63 doneReading = true; |
| 64 return; |
| 65 } |
| 66 totalSize += reader.result.byteLength; |
| 67 currentBlob++; |
| 68 if (currentBlob < blobs.length) { |
| 69 reader.readAsArrayBuffer(blobs[currentBlob]); |
| 70 } else { |
| 71 timeEnd = performance.now(); |
| 72 // we're done reading |
| 73 if (totalSize != bytes) { |
| 74 recordError("Sizes don't match"); |
| 75 if (!disableUI) |
| 76 error.innerHTML += '<br/>Sizes don\'t match: ' + totalSize + ' vs ' +
bytes; |
| 77 } |
| 78 doneReading = true; |
| 79 updateStats(); |
| 80 } |
| 81 } |
| 82 reader.readAsArrayBuffer(blobs[currentBlob]); |
| 83 } |
| 84 function readBlobsInParallel() { |
| 85 doneReading = false; |
| 86 errors = []; |
| 87 if (blobs.length == 0) { |
| 88 return; |
| 89 } |
| 90 timeStart = performance.now(); |
| 91 var currentBlob = 0; |
| 92 var totalSize = 0; |
| 93 var error = document.getElementById('error'); |
| 94 var numRead = 0; |
| 95 for (; currentBlob < blobs.length; currentBlob++) { |
| 96 var genReader = function(index) { |
| 97 var reader = new FileReader(); |
| 98 reader.onloadend = function(e) { |
| 99 if (reader.error) { |
| 100 if (!disableUI) |
| 101 error.innerHTML += '<br/>Reader error:<br/>' + reader.error.message; |
| 102 recordError('Error when reading blob ' + index + ': ' + reader.error); |
| 103 doneReading = true; |
| 104 return; |
| 105 } |
| 106 totalSize += reader.result.byteLength; |
| 107 numRead++; |
| 108 if (numRead >= blobs.length) { |
| 109 timeEnd = performance.now(); |
| 110 // we're done reading |
| 111 if (totalSize != bytes) { |
| 112 recordError("Sizes don't match"); |
| 113 if (!disableUI) |
| 114 error.innerHTML += '<br/>Sizes don\'t match: ' + totalSize + ' vs
' + bytes; |
| 115 } |
| 116 doneReading = true; |
| 117 updateStats(); |
| 118 } |
| 119 } |
| 120 return reader; |
| 121 } |
| 122 genReader(currentBlob).readAsArrayBuffer(blobs[currentBlob]); |
| 123 } |
| 124 } |
| 125 </script> |
| 126 <div>Number of blobs: <span id="num_blobs">0</span>, total memory size: <span id
="total_bytes">0</span> bytes.</div> |
| 127 <input type="button" id="custom_input_submit" value="Add Blob with Size" onclick
="addCustom();"/> |
| 128 <input type="text" inputmode="numeric" id="custom_input" value=""/><br/> |
| 129 |
| 130 Shorcut buttons for person: |
| 131 <input type="button" value="2 bytes" onclick="createBlob(2);" /> |
| 132 <input type="button" value="1 kb" onclick="createBlob(1024);" /> |
| 133 <input type="button" value="16 kb" onclick="createBlob(16*1024);" /> |
| 134 <input type="button" value="1 mb" onclick="createBlob(1024 * 1024);" /> |
| 135 <input type="button" value="40 mb" onclick="createBlob(40 * 1024 * 1024);" /> |
| 136 <input type="button" value="400 mb" onclick="createBlob(400 * 1024 * 1024);" /> |
| 137 |
| 138 <input type="button" id="read_blobs_serial" value="Read Blobs Serially" onclick=
"readBlobsSerially();" /> |
| 139 <input type="button" id="read_blobs_parallel" value="Read Blobs Parallel" onclic
k="readBlobsInParallel();" /><br/> |
| 140 <input type="button" id="garbage_collect" value="Garbage Collect Blobs" onclick=
"garbageCollect();" /><br/> |
| 141 Operation Time: |
| 142 <div id="time"></div> |
| 143 Errors: |
| 144 <div id="error"></div> |
| OLD | NEW |