С удачей это поможет, Вы решить выпуск 0, кажется, работаете хорошо на меня в тесте
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8' />
<title>multiple files preview</title>
</head>
<body>
<form method='post' enctype='multipart/form-data'>
<input type='file' name='images[]' multiple />
<input type='submit' />
<output></output>
</form>
<script>
let out=document.querySelector('output');
let oFile=document.querySelector('form > input[type="file"]');
oFile.addEventListener('change', function(e){
let oFiles=this.files;
let oReader;
for( i=0; i < oFiles.length; i++ ){
oReader = new FileReader();
oReader.addEventListener( 'load', e=>{
let img=new Image();
img.src=e.target.result;
out.appendChild( img )
});
oReader.readAsDataURL( oFiles[i] )
}
});
</script>
</body>
</html>
GCD намного лучше оценивает во время выполнения соответствующий уровень ресурсов для решения проблемы - OpenMP решает, сколько потоков вызывать для набора параллельных задач, на основе такой информации, как переменные среды. GCD смотрит на текущую загрузку системы и количество доступных ядер и позволяет запускать соответствующее количество потоков - увеличивая и уменьшая масштаб использования ресурсов в реальном времени. Это означает, что программа GCD должна давать лучшие результаты в общем случае. Конечно, если вы купили кластер выделенных модулей для запуска вашего кода, то это спорный вопрос, потому что вашему коду будет не с чем конфликтовать.
Теперь, когда GCD имеет открытый исходный код, нужно поставить оба инструмента рядом и посмотреть, кто останется в живых.