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