【问题标题】:Reducing Javascript CPU Usage减少 Javascript CPU 使用率
【发布时间】:2011-07-27 23:53:40
【问题描述】:

我正计划编写一些代码来在本地使用 javascript 加密文件。对于大文件和大密钥大小,CPU 使用率(自然)非常高。在单个脚本设计中,这通常会导致浏览器挂起,直到任务完成。

为了提高响应能力并允许用户同时做其他事情,我想尝试使脚本对用户的 PC 更“友好”。加密过程将读取文件作为二进制字符串,然后以块的形式加密字符串(类似于 1KB/块 - 需要测试)。我想尝试使用基于 HTML5 的工作人员,以使整个事情尽可能地增加。比如:

  1. 产卵工人
  2. 向工作人员发送二进制数据块
  3. Worker 完成加密,传回新块
  4. 工人死亡。

这也可能有助于多核处理器,让多个工作人员同时处于活动状态。

无论如何,有没有人考虑过故意放慢脚本以减少 CPU 使用率?类似于将工作人员的加密任务拆分为单个操作,并在它们之间引入延迟。

每 100 毫秒的间隔计时器回调(示例)。

工人忙吗?
是 - 等待另一个间隔
否 - 开始加密下一个字母

建议/想法?

有人有使用工人的经验吗?如果您通过将主 UI 与密集工作分开,将其设为工作人员,是否会提高响应能力?

【问题讨论】:

    标签: javascript cpu-usage


    【解决方案1】:

    这并没有使用任何 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();
    

    编辑

    最后一行从改变了

    var timeout = setTimeout(doSomething,1000);
    

    就这个

    doSomething()
    

    编辑 2

    在 setTimeout 调用中将 1000 更改为 sleepMS,duh :)

    【讨论】:

    • 这就是我的想法。并且引入这种延迟会产生减少整体 CPU 使用率的净效果,并且不会挂起浏览器(尽管会减慢总加密时间)?
    • 对,这是一种减少 CPU 使用率的迂回方式,因为(没有任何 ActiveX 或其他插件)JS 不会让您直接访问 CPU 上的处理器时间。这是另一个可以提供帮助的技巧,stackoverflow.com/questions/5177451/…,它也可能对您的任务有用
    • 也许你的意思是 setTimeout(doSomething,sleepMS);在函数的末尾?
    • 警告:变量超时已声明但从未使用过。警告:变量 sleepMS 已声明但从未使用过。
    • 加密一个 1024 字节的字符串似乎需要大约 250 毫秒,所以我认为只要确保一次只有一个工作人员处于活动状态,并在杀死前一个和生成下一个之间引入一点延迟将确保其他进程有足够的 CPU 时间。这是一个耻辱/缺失的功能,浏览器在控制 javascript CPU 使用方面没有采取更积极的行动。应用程序变得越来越密集,并且更有可能在 javascript 中本地运行。
    猜你喜欢
    • 2013-06-01
    • 2015-08-02
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多