1

I use this loop for create map markers (1000 points):

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;

how I can improve the for loop speed in angularjs (currently it takes almost 10s)?

4
  • 3
    Don't use eval() Commented Nov 8, 2016 at 10:01
  • @devqon is right, eval is pretty slow and unsafe. Assuming that lat and lng are numbers you could use Number(latVal) and Number(lngVal). Commented Nov 8, 2016 at 10:12
  • 1
    also storing length of array outside loop couldn't hurt, `var len = items.data.data.length; for(var i = 0; i < len; i++) Commented Nov 8, 2016 at 10:14
  • @BojanaŠekeljić, doesn't matter in modern browsers. Commented Nov 8, 2016 at 10:20

2 Answers 2

2
  1. Remove eval. It's slow and drops all browser optimizations for entire chain of functions.
  2. Use array markers = [] instead of object.
  3. Use + for converting string to number.
  4. Use push to append elements to array.
  5. Save items.data.data to a variable.
Sign up to request clarification or add additional context in comments.

Comments

1

There is a few things that can improve your code speed like avoiding eval and caching loop variables and arrays as well. By caching some values, reduce a bunch of operations like member access and unecessary calculations.

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;

2 Comments

+ is faster than Number.
@Qwertiy Yes, you are right, with the amout of 1000 iterations it starts to make some difference.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.