Created
May 29, 2014 06:23
-
-
Save frontenddeveloping/062864e198949f373ad6 to your computer and use it in GitHub Desktop.
FileReader.prototype.readAsArrayBuffer vs FileReader.prototype.readAsDataUrl
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<title>FileReader test</title> | |
</head> | |
<body> | |
<form action=""> | |
<input type=file multiple accept="image/*"><br/> | |
<input type=submit value="Run test"> | |
</form> | |
<div id="data-url-result"></div> | |
<div id="blob-result"></div> | |
<script src=test.js></script> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
if (!window.Promise || !window.URL || !window.FileReader || !window.Blob) { | |
return alert("There is not enought javascript support for run the tests"); | |
} | |
document.addEventListener('DOMContentLoaded', function () { | |
var fileControl = document.querySelector('input[type=file]'), | |
testFormNode = document.querySelector('form'), | |
dataUrlResultNode = document.querySelector('#data-url-result'), | |
blobResultNode = document.querySelector('#blob-result'); | |
function runBlobTests (filesArray) { | |
var promisesArray = []; | |
filesArray.forEach(function (file) { | |
var promise = new Promise(function (file, resolve, reject) { | |
var reader = new FileReader(), | |
startTime = Date.now(); | |
reader.onload = function (resolve, startTime, e) { | |
var image = new Image(), | |
blob; | |
image.onload = function (resolve, startTime) { | |
URL.revokeObjectURL(this.src); | |
resolve(Date.now() - startTime); | |
}.bind(image, resolve, startTime); | |
blob = new Blob([e.target.result]); | |
image.src = URL.createObjectURL(blob); | |
}.bind(null, resolve, startTime); | |
reader.readAsArrayBuffer(file); | |
}.bind(null, file)); | |
promisesArray.push(promise); | |
}); | |
return Promise.all(promisesArray).then(function(values) { | |
var globalTestTime = 0; | |
values.forEach(function (value) { | |
globalTestTime += value; | |
}); | |
blobResultNode.innerHTML = 'You browser spend ' + globalTestTime + ' ms for complete loading ' + values.length + ' images as a ArrayBuffer'; | |
}); | |
} | |
function runDataUrlTests (filesArray) { | |
var promisesArray = []; | |
filesArray.forEach(function (file) { | |
var promise = new Promise(function (file, resolve, reject) { | |
var reader = new FileReader(), | |
startTime = Date.now(); | |
reader.onload = function (resolve, startTime, e) { | |
var image = new Image(); | |
image.onload = function (resolve, startTime) { | |
URL.revokeObjectURL(this.src); | |
resolve(Date.now() - startTime); | |
}.bind(image, resolve, startTime); | |
image.src = e.target.result; | |
}.bind(null, resolve, startTime); | |
reader.readAsDataURL(file); | |
}.bind(null, file)); | |
promisesArray.push(promise); | |
}); | |
return Promise.all(promisesArray).then(function(values) { | |
var globalTestTime = 0; | |
values.forEach(function (value) { | |
globalTestTime += value; | |
}); | |
dataUrlResultNode.innerHTML = 'You browser spend ' + globalTestTime + ' ms for complete loading ' + values.length + ' images as a DataUrl'; | |
}); | |
} | |
function runTests (files) { | |
var filesArray = [].slice.call(files); | |
if (!filesArray[0]) { | |
return alert("Please, select any files for tests...") | |
} | |
runDataUrlTests(filesArray).then(runBlobTests.bind(null, filesArray)); | |
} | |
testFormNode.addEventListener('submit', function (e) { | |
e.preventDefault(); | |
runTests(fileControl.files); | |
}, false); | |
}, false); | |
}()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This gist compare
FileReader.prototype.readAsArrayBuffer
vsFileReader.prototype.readAsDataUrl
- which is faster to read,create and load images frominput[type="file"]
. Because FileReader API is async, I use javascript native Promises (Chrome, Firefox support) to control and render test time.