0
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 循环会降低性能。

4

2 回答 2

0

在 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);}
  }
}

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

于 2012-09-27T09:21:08.197 回答
0

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

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

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

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

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

于 2012-09-27T09:51:46.010 回答