extends Node

var n := 1000000
var benchmarks = [
	"pass",
	"get_node",
	"find_child",
	"get_child",
	"get_parent",
	"get_viewport",
	"get_tree",
	"create_timer",
]

func _ready():
	for b in benchmarks:
		print("%s:" % b)
		bench(self["_%s" % b])
	
	await get_tree().create_timer(0.5).timeout
	get_tree().quit()

func bench(callable: Callable):
	var t := now()
	callable.call()
	prints(round((now() - t) / n * 1000000000), "ns")

func now() -> float:
	return Time.get_unix_time_from_system()

func _pass():
	for i in range(n):
		pass

func _get_node():
	for i in range(n):
		get_node("Child")

func _find_child():
	for i in range(n):
		find_child("Child")

func _get_child():
	for i in range(n):
		get_child(0)

func _get_parent():
	for i in range(n):
		get_parent()

func _get_viewport():
	for i in range(n):
		get_viewport()

func _get_tree():
	for i in range(n):
		get_tree()

func _create_timer():
	var tree := get_tree()

	for i in range(n):
		tree.create_timer(0)