LoginSignup
1
2

More than 5 years have passed since last update.

JavaScriptで座標を配列とオブジェクト、どちらで管理した方が処理が早くなるか実験

Last updated at Posted at 2015-12-15

オブジェクトより配列を使ったほうが、計算が早くなると思いましたが実際は違いました。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オブジェクトができると、
計算負荷が大きくなるみたいです。
###
1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2