オブジェクトより配列を使ったほうが、計算が早くなると思いましたが実際は違いました。C言語の時は、プリミティブ値が連続的に配置された集まりだったから配列の走査が速いのかもしれません。JavaScriptだと配列はArrayオブジェクトなので、オブジェクトを増やすぐらいならプロパティを増やしたほうがいいということでした。まさか処理速度に約3倍の差が出るとは思いませんでした。
###
実験内容
1組の座標を管理するのに、下記のどちらが速いかを実験。
実行環境はpaiza.ioにしました。
1. 各座標を別の配列で管理する
{x:[10, 23], y:[1, 0]}
2. 1組をオブジェクトでまとめる
[{x: 10, y: 1}, {x: 23, y: 0}]
###
###
# リファレンス #
Math.random()
0から1未満を返す。1は含みません。
Math.floor(number)
小数点以下を切り捨てます。
###
# 0~99の乱数を生成
getPoint = ->
Math.floor(Math.random() * 100)
# いくつ座標を格納するか
count = 100000
# x, yを別々で管理する。
# 各配列のインデックスがずれてはいけません。
points = { x: [], y: [] }
console.time('array')
# 座標の格納
for i in [0..count]
points.x.push(getPoint())
points.x.push(getPoint())
# 座標の取り出し
for i in [0..count]
nowX = points.x[i]
nowY = points.y[i]
console.timeEnd('array')
# => 20ms
points = []
console.time('object')
# 座標の格納
for i in [0..count]
points.push({ x: getPoint(), y:getPoint() })
# 座標の取り出し
for i in [0..count]
nowX = points[i].x
nowY = points[i].y
console.timeEnd('object')
# => 7ms
###
結果
1組の座標はオブジェクトで管理でした方が3倍早かったです。
配列もオブジェクトなので、x, yという2つのArrayオブジェクトができると、
計算負荷が大きくなるみたいです。
###