【问题标题】:Very slow loop in angularjsangularjs中的循环非常慢
【发布时间】:2016-11-08 09:59:21
【问题描述】:

我使用这个循环来创建地图标记(1000 个点):

var markers = {};
for (var i = 0; i < items.data.data.length; i++) {
    latVal = items.data.data[i].lat;
    lngVal = items.data.data[i].lng;
    ikona = icons.infost;
    message = "<b>" + items.data.data[i].name + "</b>";
    markers[i] = {'group': 'cmp', 'lat' : eval(latVal), 'lng' : eval(lngVal), 'icon' : ikona, 'message' : message};
}
$scope.Markers = markers;

如何提高 angularjs 中的 for 循环速度(目前大约需要 10 秒)?

【问题讨论】:

  • 不要使用eval()
  • @devqon 是对的,eval 非常缓慢且不安全。假设 lat 和 lng 是数字,您可以使用 Number(latVal) 和 Number(lngVal)。
  • 在循环外存储数组长度也不会受到伤害,`var len = items.data.data.length; for(var i = 0; i
  • @BojanaŠekeljić,在现代浏览器中并不重要。

标签: javascript angularjs loops for-loop


【解决方案1】:
  1. 删除eval。它速度很慢,并且会放弃对整个功能链的所有浏览器优化。
  2. 使用数组markers = [] 代替对象。
  3. 使用+ 将字符串转换为数字。
  4. 使用push 将元素附加到数组。
  5. 将items.data.data 保存到变量中。

【讨论】:

    【解决方案2】:

    有一些事情可以提高您的代码速度,例如避免eval 以及缓存循环变量和数组。通过缓存一些值,减少成员访问和不必要的计算等一堆操作。

    var items = { data: { data: [] }};
    var icons = { infost: 'infost'};
    for (var i = 0; i < 1000; i++) {
      items.data.data.push({ lat: ''+i, lng: ''+i, name:''+i });
    }
    
    console.time('time');
    
    /// YOUR CODE STARTS HERE
    
    var
      data = items.data.data,
      l = data.length,
      markers = Array(l), // or just []
      item, latVal, lngVal, ikona, message;
    
    for (var i = 0; i < l; i++) {
      item = data[i];
    
      latVal = item.lat;
      lngVal = item.lng;
      ikona = icons.infost;
      message = "<b>" + item.name + "</b>";
      markers[i] = {
        group: 'cmp',
        lat: +latVal,
        lng: +lngVal,
        icon: ikona,
        message: message
      };
    }
    console.timeEnd('time');
    //$scope.Markers = markers;

    【讨论】:

    • + 比 Number 快​​。
    • @Qwertiy 是的,你是对的,经过 1000 次迭代,它开始产生一些影响。
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2012-09-20
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2012-10-28
    相关资源
    最近更新 更多