Konstantin Svist wrote:
lemme take a crack at it..

_boundedStack: {
  _max: 500,
  _stack: [],
  _current: 0,   // next position to be written
  _overfly: false,
  push: function(obj) {
    var current = this._current;    // minor optimization
    this._stack[current] = obj;

This needs to realloc the array, unless js is really clever about those, you realloc 500 times, which is slow and consumes basically 1000 entries in memory at max. Not really worth it, if you usually do hit the 500 soonish.

    if (current >= this._max) {
      this._current = 0;
      this._overfly = true;
    }
  },
  length: function() { return this._stack.length; },    // note_1
  item: function(idx) {        // note_2
    if (this._overfly) {
      idx += this._current;
      if (idx >= this._max) { idx -= this._max; }
    }
    return this._stack[idx];
  }
}

note_1: it'll probably be a little faster to call myStack._stack.length directly

note_2: caller needs to bound-check. this can be done implicitly: get the length first, then only ask for elements within that length.


logic check: _current points to next field to write into. when getting an element by index, _current points to oldest element iff there was an overflow.


By the way, never skimp on the curly braces {}: for some reason Fx 1.0 favors the code with lots of {}s, by a slight margin (or so my testing showed).






also, does it have to be an array? what if you just use a linked list of objects? it may work faster if you keep retrieving the whole list each time, not just a certain item

_boundedStack: {
  first: null,
  last: null,
  len: 0,
  max: 500,
  push: function(obj) {
    if (null == this.last) { this.last = obj; }
    else {
      this.last.next = obj;
      this.last = obj;
    }
    this.len++;
    if (null == first) { first = obj; }
    else if (this.len >= this.max) {
        this.first = this.first.next;
        this.len--;
    }
  }
}

obj should be fairly easy to implement, i think..
to get the length of your stack, just grab the len variable
to get the list, get the first element then .next until .next == null


Linked lists are non-local in storage, that may or may not have an impact on perf. In theory, I bet that doesn't matter at all in an interpreted language.
It may be a little stressful on GC to have 500 additional objects.
It looks like you're polluting obj with next members, too.

Axel
_______________________________________________
Project_owners mailing list
[email protected]
http://mozdev.org/mailman/listinfo/project_owners

Reply via email to