Files
2026-01-15 15:27:48 +01:00

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)