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