【问题标题】:How can I work with typed arrays without using for?如何在不使用 for 的情况下使用类型化数组?
【发布时间】:2012-09-27 09:13:37
【问题描述】:
var sendBuffer = new ArrayBuffer(4096);
var dv = new DataView(sendBuffer);
dv.setInt32(0, 1234);
var service = svcName;
for (var i = 0; i < service.length; i++) 
{
    dv.setUint8(i + 4, service.charCodeAt(i));
}
ws.send(sendBuffer);

如何在不使用 for 循环的情况下进行锻炼。在处理大量数据时,for 循环会降低性能。

【问题讨论】:

  • for 循环本身并不是慢的,而是你在 for 循环中所做的。遍历数据的不同类型的循环不会更快。
  • 缓存length,这将大大加快速度。 for(var i=0, l=services.length; i&lt;l; i++)

标签: javascript html buffer bytearray


【解决方案1】:

根据 cmets,您真正的问题是循环会使您的 UI 阻塞。

上面的拆分答案并没有为您提供防止阻塞的正确方法。在 Javascript 主线程中完成的所有操作都会阻塞 UI。

您需要使用 Web Workers(单独的线程)来处理您的数据,因此处理不会阻塞 UI 线程:

http://updates.html5rocks.com/2011/09/Workers-ArrayBuffer

您使用 postMessage() 将数据发布到单独的 worker 进行处理,然后使用另一个 postMessage() 将结果数据发布回主线程。

【讨论】:

    【解决方案2】:

    在 javascript 中,for() 循环相对于其他操作来说非常紧凑和高效。在每个排列上按顺序执行此操作(即摆脱 for() 循环)将是不优雅的,也不会为您节省很多周期。

    如果某个操作可能导致客户端停止运行,则需要将问题拆分为更小的组件,并警告用户执行该操作需要一些时间。

    我建议将此操作拆分为更小的块,而不是尝试找到另一个不使用 for() 的算法。

    也许是这样,使用回调防止代码阻塞:

    var split = service.length/4;
    function alpha(split, position, callback) {
      for (var i = split*(position-1); i < split*(position); i++) {
        dv.setUint8(i + 4, service.charCodeAt(i));}
      if(callback && (typeof(callback) == 'function') {
        callback();}
    }
    
    var split = service.length/4;
    alpha(split, 1, function() {
      // poll here for other information or to confirm user wishes to proceed
      alpha(split, 2, function() {
        // poll here for other information or to confirm user wishes to proceed
        alpha(split, 3, function() {
          // poll here for other information or to confirm user wishes to proceed
          alpha(split, 4);}
      }
    }
    

    这是一个极大地简化的方法,而不是实现此解决方案的最佳方法。但它会让您有机会优化正在进行的处理并优先考虑与其他操作相关的操作。

    【讨论】:

    • 服务数据很大,所以使用这种方法时会阻塞ui,浏览器会拖拉。
    • 完美,然后像我向您展示的那样将其拆分。这将防止浏览器因可怕的“此页面已停止响应”消息而停止。 :)
    • 像这个答案那样拆分处理不会阻止页面停止响应。
    • 在那里,我在代码中添加了回调来防止这种情况发生。
    猜你喜欢
    • 2023-02-05
    • 1970-01-01
    • 2016-12-04
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2011-02-22
    相关资源
    最近更新 更多