concat กับ push
หลังจากหาวิธีแก้มานานว่าทำยังไงดีที่จะเพิ่มข้อมูลใส่ Array ให้เร็วขึ้นเพราะว่า ถ้าใช้ฟังก์ชั่นมาตรฐานทั่วไปในการต่อ Array สองอันเข้าด้วยกันชื่อฟังก์ชั่นที่นึกถึงอย่างแรกเลยก็คือ concat แต่ว่าปัญหาเกิดขึ้นเมื่อ Array ที่ใช้มันใหญ่ขึ้น เวลาที่ใช้ในการ concat ก็จะช้าลงๆ แบบรับไม่ได้เลยหละ ซึ่งก็ยังไม่ได้แงะลงไปว่า concat มันทำอะไร แต่ตอนนี้เจอฟังก์ชั่นใหม่ที่ใช้แทนกันได้แล้วนั่นคือ push นั่นเอง
ข้อแตกต่างระหว่างสองอันนี้คือ concat จะเชื่อม Array เข้าด้วยกัน แต่ push เป็นแค่การเพิ่มข้อมูลไปท้าย Array ดังนั้นหากใช้ push ต้องไล่ข้อมูลใน Array ที่จะเอามาเชื่อมทีละตัวเอาออกมาแล้วค่อยยัดเข้ามาใหม่ ดูแล้วมันก็น่าจะทำเหมือนกันแต่ปรากฏว่าไล่วนเอง เร็วกว่ากันเยอะเลย - -”
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | public function generatePush(event:MouseEvent):void { var average:Number = 0 var total:int = 10000 var na:Array = new Array() var samplingArray:Array = [new SampleStructure("mr.bun", "021587623"), new SampleStructure("ms.rally", "0359234752"), new SampleStructure("mrs.blick", "0852093428"), new SampleStructure("mr.geouge", "0348543235"), new SampleStructure("ms.lulu", "0912438534")] var sumStart:int = getTimer() for (var i:int = 0; i < total; i++) { var start:int = getTimer() for each (var o:* in samplingArray) { na.push(o) } var stop:int = getTimer() average += (stop-start) } var sumStop:int = getTimer() trace("na size: " + na.length) trace("total usage: " + (sumStop - sumStart)) trace("average usage: " + (average / total)) } public function generateConcat(event:MouseEvent):void { var average:Number = 0 var total:int = 10000 var na:Array = new Array() var samplingArray:Array = [new SampleStructure("mr.bun", "021587623"), new SampleStructure("ms.rally", "0359234752"), new SampleStructure("mrs.blick", "0852093428"), new SampleStructure("mr.geouge", "0348543235"), new SampleStructure("ms.lulu", "0912438534")] var sumStart:int = getTimer() for (var i:int = 0; i < total; i++) { var start:int = getTimer() na = na.concat(samplingArray) var stop:int = getTimer() average += (stop-start) } var sumStop:int = getTimer() trace("na size: " + na.length) trace("total usage: " + (sumStop - sumStart)) trace("average usage: " + (average / total)) } |
ใครอยากลองก็เอา code ด้านบนไปใส่ดูแล้วกด debug รับรองจะเห็นถึงความแตกต่าง ยิ่งเลข total ยิ่งเยอะ ความแตกต่างยิ่งเห็นได้ชัด ไฟล์นี้จริงๆ ทดลองอีกเรื่องนึงด้วยแต่เดี๊ยวแยกเป็นอีกหัวข้อนึงละกัน ;p




Add Yours
YOU