182 lines
5.0 KiB
GDScript
182 lines
5.0 KiB
GDScript
## Set and Array Performance Tests
|
|
## Tests Set operations and ArrayExtensions performance
|
|
extends GdUnitTestSuite
|
|
|
|
var runner: GdUnitSceneRunner
|
|
var world: World
|
|
|
|
|
|
func before():
|
|
runner = scene_runner("res://addons/gecs/tests/test_scene.tscn")
|
|
world = runner.get_property("world")
|
|
ECS.world = world
|
|
|
|
|
|
func after_test():
|
|
if world:
|
|
world.purge(false)
|
|
|
|
|
|
## Helper to create test arrays with specified overlap
|
|
func create_test_arrays(size1: int, size2: int, overlap_percent: float = 0.5) -> Array:
|
|
var array1: Array = []
|
|
var array2: Array = []
|
|
|
|
# Create first array
|
|
for i in size1:
|
|
array1.append("Entity_%d" % i)
|
|
|
|
# Create second array with specified overlap
|
|
var overlap_count = int(size2 * overlap_percent)
|
|
var unique_count = size2 - overlap_count
|
|
|
|
# Add overlapping elements
|
|
for i in overlap_count:
|
|
if i < size1:
|
|
array2.append(array1[i])
|
|
|
|
# Add unique elements
|
|
for i in unique_count:
|
|
array2.append("Entity_%d" % (size1 + i))
|
|
|
|
return [array1, array2]
|
|
|
|
|
|
## Test Set.intersect() performance
|
|
func test_set_intersect(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var set1 = Set.new(arrays[0])
|
|
var set2 = Set.new(arrays[1])
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = set1.intersect(set2)
|
|
)
|
|
|
|
PerfHelpers.record_result("set_intersect", scale, time_ms)
|
|
|
|
|
|
## Test Set.union() performance
|
|
func test_set_union(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var set1 = Set.new(arrays[0])
|
|
var set2 = Set.new(arrays[1])
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = set1.union(set2)
|
|
)
|
|
|
|
PerfHelpers.record_result("set_union", scale, time_ms)
|
|
|
|
|
|
## Test Set.difference() performance
|
|
func test_set_difference(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var set1 = Set.new(arrays[0])
|
|
var set2 = Set.new(arrays[1])
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = set1.difference(set2)
|
|
)
|
|
|
|
PerfHelpers.record_result("set_difference", scale, time_ms)
|
|
|
|
|
|
## Test ArrayExtensions.intersect() performance
|
|
func test_array_intersect(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var array1 = arrays[0]
|
|
var array2 = arrays[1]
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = ArrayExtensions.intersect(array1, array2)
|
|
)
|
|
|
|
PerfHelpers.record_result("array_intersect", scale, time_ms)
|
|
|
|
|
|
## Test ArrayExtensions.union() performance
|
|
func test_array_union(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var array1 = arrays[0]
|
|
var array2 = arrays[1]
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = ArrayExtensions.union(array1, array2)
|
|
)
|
|
|
|
PerfHelpers.record_result("array_union", scale, time_ms)
|
|
|
|
|
|
## Test ArrayExtensions.difference() performance
|
|
func test_array_difference(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.5)
|
|
var array1 = arrays[0]
|
|
var array2 = arrays[1]
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
var result = ArrayExtensions.difference(array1, array2)
|
|
)
|
|
|
|
PerfHelpers.record_result("array_difference", scale, time_ms)
|
|
|
|
|
|
## Test Set.erase() performance
|
|
func test_set_erase(scale: int, test_parameters := [[100], [1000], [10000]]):
|
|
var array1: Array = []
|
|
for i in scale:
|
|
array1.append("Entity_%d" % i)
|
|
|
|
var test_set := Set.new(array1)
|
|
|
|
var time_ms = PerfHelpers.time_it(func():
|
|
# erase half the elements
|
|
for i in scale / 2:
|
|
test_set.erase("Entity_%d" % i)
|
|
)
|
|
|
|
PerfHelpers.record_result("set_erase", scale, time_ms)
|
|
|
|
|
|
## Test Set vs Array operations with no overlap
|
|
func test_set_vs_array_no_overlap(scale: int, test_parameters := [[100], [1000]]):
|
|
var arrays = create_test_arrays(scale, scale, 0.0) # No overlap
|
|
var array1 = arrays[0]
|
|
var array2 = arrays[1]
|
|
var set1 = Set.new(array1)
|
|
var set2 = Set.new(array2)
|
|
|
|
# Test array intersect
|
|
var array_time = PerfHelpers.time_it(func():
|
|
var result = ArrayExtensions.intersect(array1, array2)
|
|
)
|
|
|
|
# Test set intersect
|
|
var set_time = PerfHelpers.time_it(func():
|
|
var result = set1.intersect(set2)
|
|
)
|
|
|
|
PerfHelpers.record_result("array_intersect_no_overlap", scale, array_time)
|
|
PerfHelpers.record_result("set_intersect_no_overlap", scale, set_time)
|
|
|
|
|
|
## Test Set vs Array operations with complete overlap
|
|
func test_set_vs_array_complete_overlap(scale: int, test_parameters := [[100], [1000]]):
|
|
var arrays = create_test_arrays(scale, scale, 1.0) # Complete overlap
|
|
var array1 = arrays[0]
|
|
var array2 = arrays[1]
|
|
var set1 = Set.new(array1)
|
|
var set2 = Set.new(array2)
|
|
|
|
# Test array intersect
|
|
var array_time = PerfHelpers.time_it(func():
|
|
var result = ArrayExtensions.intersect(array1, array2)
|
|
)
|
|
|
|
# Test set intersect
|
|
var set_time = PerfHelpers.time_it(func():
|
|
var result = set1.intersect(set2)
|
|
)
|
|
|
|
PerfHelpers.record_result("array_intersect_complete_overlap", scale, array_time)
|
|
PerfHelpers.record_result("set_intersect_complete_overlap", scale, set_time)
|