开发者

Reducing Javascript CPU Usage

开发者 https://www.devze.com 2023-03-23 02:04 出处:网络
I\'m planning on writing some code for encrypting files in javascript locally. For large files and large key sizes, the CPU usage (naturally) is pretty high. In a single script design, this often hang

I'm planning on writing some code for encrypting files in javascript locally. For large files and large key sizes, the CPU usage (naturally) is pretty high. In a single script design, this often hangs the browser until the task is complete.

In order to improve responsiveness and allow users to do other things in the mean time I want to try make the script 'friendlier' to the user's PC. T开发者_JAVA技巧he encryption process will be reading a file as a binary string and then encrypting the string in chunks (something like 1KB/chunk - needs testing). I want to try and user HTML5-based workers to make the whole thing as incremental as possible. Something like:

  1. Spawn worker
  2. Send worker a binary data chunk
  3. Worker completes encryption, passes back new chunk
  4. Worker dies.

This might also help with multicore processors, by having multiple workers alive at once.

Anyway, has anybody looked at deliberately slowing down a script in order to reduce CPU usage? Something like splitting the worker's encryption task into single operations, and introducing a delay between them.

Interval timer callback every 100ms (example).

Is worker busy?

Yes - Wait for another interval

No - Start encrypting the next letter

Advice/thoughts?

Does anyone have experience using workers? If you seperate the main UI from intensieve work by making it a worker, does the responsiveness increase?


This doesn't utilize anything HTML5, but here's an example for calling a function every N milliseconds, assuming you can determine an appropriate wait time. Basically, I'm trying to help you by showing you a way to enforce stalling some amount of time before doing more processing.

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

changed last line from

var timeout = setTimeout(doSomething,1000);

to just this

doSomething()

EDIT 2

Changed 1000 to sleepMS in setTimeout call, duh :)

0

精彩评论

暂无评论...
验证码 换一张
取 消