title: AS3: How accurate are the getTimer() method and the Timer class?
body: <p>I'm in the process of making a game (a shmup) and I've started to question the accuracy of the timers in ActionScript.  Sure, they're accurate enough when you want to time things on the order of a few seconds or deciseconds, but it seems to perform pretty poorly when you get to finer ranges.  This makes it pretty tough to do things like have a spaceship firing a hundred lasers per second.  </p>
  
  <p>In the following sample, I tested how long (on average) the intervals were between 1000 timer ticks intended for 30ms.  Time and time again, the results are ~35-36ms.  Decreasing the time, I found the floor on the timer delay to be ~16-17ms.  This gives me a max fps of ~60, which is great visually but also means I can't possibly fire more than 60 lasers per second :-(.  I ran this test a few times at 100 and 1000 loops, but for both the 30ms test and the 1ms test the results didn't change.  I print to a textField at the end because using trace() and launching the swf in debug mode seems to negatively affect the test.  So what I'm wondering is:</p>
  
  <ul>
  <li>Is this test a decent measure of the Timer class's performance, or are my results questionable?</li>
  <li>Will these results change dramatically on other machines?</li>
  </ul>
  
  <p>I understand this is dependent on the getTimer() method's accuracy, but the discussions I find on this topic usually center around getTimer()'s accuracy on larger intervals.</p>
  
  <p><pre>package 
  {<br>
      import flash.display.Sprite;
      import flash.events.TimerEvent;
      import flash.text.TextField;
      import flash.utils.getTimer;
      import flash.utils.Timer;</pre><code></p>
  
  <pre>public class testTimerClass extends Sprite
  {
      private var testTimer:Timer = new Timer(30, 1000);
      private var testTimes:Array = new Array();
      private var testSum:int = 0;
      private var testAvg:Number;
      private var lastTime:int;
      private var thisTime:int;
  
      public function testTimerClass()
      {
          testTimer.addEventListener(TimerEvent.TIMER, step);
          testTimer.addEventListener(TimerEvent.TIMER_COMPLETE, printResults);
          lastTime = getTimer();
          testTimer.start();
      }
  
      private function step(event:TimerEvent):void
      {
          thisTime = getTimer();
          testTimes.push(thisTime - lastTime);
          lastTime = thisTime;
      }
  
      private function printResults(event:TimerEvent):void
      {
          while (testTimes.length &gt; 0)
          {
              testSum += testTimes.pop();
          }
          testAvg = testSum / Number(testTimer.repeatCount);              
          var txtTestResults:TextField = new TextField();
          txtTestResults.text = testAvg.toString();
          this.addChild(txtTestResults);  
      }       
  }
  </code></pre>
  
  <p>}</p>
  
  <p>I guess the best route to take would be to just draw multiple lasers in the same frame with different positions and avoid having more than one Timer object.  </p>
  
  <p>edit:  I used stage.frameRate to change the render frameRate and ran the test on several framerates but there was no change.</p>