Сокращение использования ЦП Javascript - PullRequest
4 голосов
/ 27 июля 2011

Я планирую написать код для локального шифрования файлов в javascript.Для больших файлов и ключей большого размера загрузка ЦП (естественно) довольно высока.В едином проекте сценария это часто приводит к зависанию браузера до тех пор, пока задача не будет завершена.

Чтобы улучшить отзывчивость и позволить пользователям делать другие вещи, в то же время я хочу попробовать сделать сценарий более дружественным кПК пользователя.Процесс шифрования будет считывать файл в виде двоичной строки, а затем шифровать строку кусками (что-то вроде 1 КБ / чанк - требует тестирования).Я хочу попробовать и использовать пользователей на основе HTML5, чтобы сделать все это как можно более инкрементным.Что-то вроде:

  1. Spawn worker
  2. Отправка работнику бинарного фрагмента данных
  3. Работник завершает шифрование, передает новый чанк
  4. Работник умирает.

Это может также помочь с многоядерными процессорами, так как одновременно работают несколько рабочих.

В любом случае, кто-нибудь задумывался о намеренном замедлении работы сценария с целью уменьшения загрузки процессора?Что-то вроде разделения задачи шифрования работника на отдельные операции и введения задержки между ними.

Интервал обратного вызова таймера каждые 100 мс (пример).

Работник занят?
Да - дождаться другого интервала
Нет - Начать шифрование следующей буквы

Советы / мысли?

У кого-нибудь есть опыт использования работников?Если вы отделяете основной пользовательский интерфейс от интенсивной работы, превращая его в рабочего, увеличивается ли скорость реагирования?

1 Ответ

2 голосов
/ 27 июля 2011

Это не использует ничего HTML5, но вот пример для вызова функции каждые N миллисекунд, при условии, что вы можете определить подходящее время ожидания. По сути, я пытаюсь помочь вам, показывая вам способ принудительно останавливать некоторое время, прежде чем выполнять дополнительную обработку.

function doSomething(){
   clearTimeout(timeout);
   // do your "expensive" processing
   // ...
   // decide the job is done and return here or else
   // call doSomething again in sleepMS milliseconds
   timeout = setTimeout(doSomething,sleepMS);
}
var timeout;
var sleepMS = 1000;


doSomething();

EDIT

изменена последняя строка с

var timeout = setTimeout(doSomething,1000);

только к этому

doSomething()

РЕДАКТИРОВАТЬ 2

Изменил 1000 на sleepMS в вызове setTimeout, duh:)

...