Native Sort (stalls UI)

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
  3.  layout="absolute"
  4.  backgroundGradientAlphas="[1.0, 1.0]" backgroundGradientColors="[#FFFFFF, #B6B6B6]">
  5.  
  6.  <mx:Script>
  7.   <![CDATA[
  8.  
  9.    import __AS3__.vec.Vector;
  10.    
  11.    [Bindable]
  12.    /**
  13.     * @private
  14.     * Are we sorting records?
  15.     */
  16.    private var sorting:Boolean = false;
  17.    
  18.    [Bindable]
  19.    /**
  20.     * Which iteration are we on?
  21.     */
  22.    private var iteration:int = 0;
  23.  
  24.    /**
  25.     * @private
  26.     * How many records to include in each sort run.
  27.     */
  28.    private const RECORD_CHUNK:int = 10000;
  29.    
  30.    /**
  31.     * @private
  32.     * Number of times to run the sorting routine.
  33.     */
  34.    private const ITERATIONS:int = 100;
  35.    
  36.    /**
  37.     * @private
  38.     */
  39.    private var startTime:Number;
  40.    
  41.    /**
  42.     * @private
  43.     */
  44.    private var endTime:Number;  
  45.  
  46.  
  47.    /**
  48.     * @private
  49.     * Sort chunks of N Numbers (as Vectors) for N iterations. UI
  50.     * stalls until processing is complete.
  51.     */
  52.    private function startSort():void
  53.    {
  54.     startTime = getTimer();
  55.     debug( "starting sort at: " + startTime.toString() + " ms");
  56.    
  57.     pgb.setProgress( 0, 100 );
  58.     iteration = 0;
  59.    
  60.     sorting = true;
  61.  
  62.     for ( var j:int = 0; j <= ITERATIONS; j++ )
  63.     {
  64.      debug("iteration: " + iteration.toString());
  65.      
  66.      if ( iteration >= ITERATIONS )
  67.      {
  68.       endTime = getTimer();
  69.       debug("ending sort at: " + endTime.toString() + " ms");
  70.       debug("time: " + ( ( endTime - startTime ) / 1000 ) + " seconds");
  71.       sorting = false;
  72.       return;
  73.      }
  74.      
  75.      debug("generating " + RECORD_CHUNK.toString() + " record chunk...");
  76.      var data:Vector.<Number> = new Vector.<Number>();
  77.      
  78.      for( var i:int = 0; i < RECORD_CHUNK; i++ )
  79.       data.push( Math.random() * RECORD_CHUNK );
  80.      
  81.      debug("records generated.");
  82.      debug("sorting records...");
  83.      
  84.      data.sort(shuffle);
  85.      
  86.      debug("sort complete.");
  87.      debug("---");
  88.      
  89.      iteration++;
  90.      pgb.setProgress( iteration, ITERATIONS );
  91.     }
  92.    }
  93.  
  94.  
  95.    /**
  96.     * @private
  97.     * Simple record sort.
  98.     */
  99.    private function shuffle( a:Number, b:Number ):int
  100.    {
  101.     return ( a == b ? 0 : (a < b) ? -1 : 1 );
  102.    }
  103.    
  104.    
  105.    /**
  106.     * @private
  107.     * Sends debug messages to text box.
  108.     */
  109.    private function debug( msg:String ):void
  110.    {
  111.     dbg.text += msg + "\n";
  112.    }
  113.  
  114.    
  115.   ]]>
  116.  </mx:Script>
  117.  
  118.  <mx:Box direction="vertical" horizontalCenter="0" verticalCenter="0" horizontalAlign="center">
  119.   <mx:TextArea y="243" width="323" height="276" id="dbg" wordWrap="true" editable="false" horizontalCenter="0"/>
  120.   <mx:Button y="584" label="start sort" click="startSort();" horizontalCenter="0" enabled="{!sorting}"/>
  121.  
  122.   <mx:ProgressBar id="pgb" labelPlacement="bottom" themeColor="#19CD3F"
  123.               minimum="0" visible="true" maximum="100" label="CurrentProgress 0%"
  124.               direction="right" mode="manual" width="323" y="527" horizontalCenter="0"/>
  125.  </mx:Box>
  126.  
  127. </mx:Application>