# Faster Array Concatenation in AS3

> 

Published: 2011-01-18
URL: https://kaochenlong.com/faster-array-concatenation-in-as3

---

前不久在 Grant Skinner 大人的 twitter 上看到這個：

&gt; Just discovered a handy trick for merging two arrays in JS: arr1.push.apply(arr1, arr2);
&gt; - [@gskinner](https://twitter.com/#!/gskinner/status/24695778207338496)

真神奇，原來 `Function.apply` 還可以這樣玩，而且這招似乎在 AS3 上也可行，直接寫幾行程式碼測一下：

```actionscript
function test_concat():void
{
	trace(&quot;== TEST Array Concat ==&quot;);
	var array1:Array = [1, 2, 3];
	var array2:Array = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];
	var timer_start = getTimer();
	for (var i:int = 0; i&lt; 10000; i++)
	{
		array1 = array1.concat(array2);
	}
	var timer_end = getTimer();
	trace(&quot;the length of array1 is : &quot; + array1.length);
	trace(&quot;== &quot; + (timer_end - timer_start) + &quot; miniseconds ==&quot;);
}

function test_push_and_apply():void
{
	trace(&quot;== TEST Array Push and Apply ==&quot;);
	var array1:Array = [1, 2, 3];
	var array2:Array = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;];
	var timer_start = getTimer();
	for (var i:int = 0; i&lt; 10000; i++)
	{
		array1.push.apply(array1, array2);
	}
	var timer_end = getTimer();
	trace(&quot;the length of array1 is : &quot; + array1.length);
	trace(&quot;== &quot; + (timer_end - timer_start) + &quot; miniseconds ==&quot;);
}

// 測試
test_concat();
trace(&quot;&quot;);
test_push_and_apply();
```

### 我的環境：

- Macbook Pro
- CPU : Intel Core 2 Duo 2.4 GHz
- RAM : 4 GB

### 執行結果：

    == TEST Array Concat ==
    the length of array1 is : 30003
    == 4119 miniseconds ==

    == TEST Array Push and Apply ==
    the length of array1 is : 30003
    == 5 miniseconds ==

array1 最後結果內容是一樣的，但花的時間差非常大，我想這其中主要的差異應該是在於 `Array.concat` 每次都會產生一個新的 array，而且還得再 assign 給原來的 array 的緣故。

後來還有看到[這篇](http://f-site.org/articles/2011/01/12235027.html)，野中さん有在 wonderfl 上做了幾個實驗，結果發現跟這兩個 array 的大小有關。&lt;strike&gt;不過在我的機器上好像在試不出來差異，不知道是不是我哪邊有錯，即使調整兩個 array 的大小，Function.apply 的速度都是遠大於 Array.concat 的。&lt;/strike&gt;

update: 是我自己耍笨，測試數字請見連結裡野中さん的那三個測試。

I may be wrong, please correct me if there’s anything wrong :)

