Skip to content

Commit

Permalink
updated performance tests (with a massive gain in performance since l…
Browse files Browse the repository at this point in the history
…ast checks :) )
  • Loading branch information
DinisCruz committed Jan 20, 2025
1 parent b10750a commit 857788b
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 63 deletions.
4 changes: 1 addition & 3 deletions osbot_utils/type_safe/steps/Type_Safe__Step__Class_Kwargs.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from typing import Dict, Any, Type

from osbot_utils.helpers.Random_Guid import Random_Guid

from osbot_utils.helpers.Random_Guid import Random_Guid
from osbot_utils.type_safe.shared.Type_Safe__Cache import Type_Safe__Cache, type_safe_cache
from osbot_utils.type_safe.shared.Type_Safe__Shared__Variables import IMMUTABLE_TYPES
from osbot_utils.type_safe.shared.Type_Safe__Validation import type_safe_validation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ def setUpClass(cls):
cls.time_0_ns = 0
cls.time_100_ns = 100
cls.time_200_ns = 200
cls.time_700_ns = 700
cls.time_800_ns = 800
cls.time_1_kns = 1_000
cls.time_2_kns = 2_000
cls.time_3_kns = 3_000
Expand Down Expand Up @@ -54,11 +56,11 @@ class An_Class_6(Type_Safe):
_.measure(str ).print().assert_time(self.time_100_ns, self.time_0_ns )
_.measure(Random_Guid).print().assert_time(self.time_3_kns , self.time_5_kns, self.time_6_kns , self.time_7_kns , self.time_8_kns )
_.measure(An_Class_1 ).print().assert_time(self.time_100_ns, self.time_200_ns )
_.measure(An_Class_2 ).print().assert_time(self.time_1_kns , self.time_2_kns , self.time_3_kns , self.time_4_kns , self.time_5_kns , self.time_6_kns, self.time_7_kns )
_.measure(An_Class_3 ).print().assert_time(self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_4 ).print().assert_time(self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_5 ).print().assert_time(self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_6 ).print().assert_time(self.time_4_kns , self.time_5_kns , self.time_7_kns , self.time_8_kns ,self.time_9_kns , self.time_10_kns, self.time_20_kns )
_.measure(An_Class_2 ).print().assert_time(self.time_700_ns , self.time_800_ns, self.time_1_kns , self.time_2_kns , self.time_3_kns , self.time_4_kns , self.time_5_kns , self.time_6_kns, self.time_7_kns )
_.measure(An_Class_3 ).print().assert_time(self.time_2_kns , self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_4 ).print().assert_time(self.time_2_kns , self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_5 ).print().assert_time(self.time_2_kns , self.time_4_kns , self.time_5_kns , self.time_8_kns , self.time_9_kns ,self.time_10_kns, self.time_20_kns )
_.measure(An_Class_6 ).print().assert_time(self.time_2_kns , self.time_4_kns , self.time_5_kns , self.time_7_kns , self.time_8_kns ,self.time_9_kns , self.time_10_kns, self.time_20_kns )

type_safe_cache.print_cache_hits()

Expand Down
104 changes: 52 additions & 52 deletions tests/unit/type_safe/_performance/test__perf__Type_Safe__ctor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
from typing import Optional, List, Dict, Union, Any
from enum import Enum, auto

import pytest

from osbot_utils.testing.performance.Performance_Measure__Session import Performance_Measure__Session
from osbot_utils.type_safe.Type_Safe import Type_Safe

Expand All @@ -13,22 +11,31 @@ class test__perf__Type_Safe__ctor(TestCase):

@classmethod
def setUpClass(cls): # Set up timing thresholds

pytest.skip("skipping until refactoring of Type_Safe is complete")

#import pytest
#pytest.skip("skipping until refactoring of Type_Safe is complete")
cls.time_200_ns = 200
cls.time_300_ns = 300
cls.time_700_ns = 700
cls.time_800_ns = 800
cls.time_1_kns = 1_000
cls.time_2_kns = 2_000
cls.time_3_kns = 3_000
cls.time_4_kns = 4_000
cls.time_5_kns = 5_000
cls.time_6_kns = 6_000
cls.time_7_kns = 7_000
cls.time_8_kns = 8_000
cls.time_9_kns = 9_000
cls.time_10_kns = 10_000
cls.time_20_kns = 20_000
cls.time_30_kns = 30_000
cls.time_40_kns = 40_000
cls.time_50_kns = 50_000
cls.time_60_kns = 60_000
cls.time_70_kns = 70_000
cls.time_80_kns = 80_000
cls.time_90_kns = 90_000
cls.time_100_kns = 100_000
cls.time_200_kns = 200_000
cls.time_300_kns = 300_000
cls.time_400_kns = 400_000
Expand All @@ -49,17 +56,17 @@ class SingleDefault(Type_Safe): # Test w
value: str = "default"

with Performance_Measure__Session() as session:
session.measure(EmptyClass ).assert_time(self.time_6_kns , self.time_7_kns)
session.measure(SingleStr ).assert_time(self.time_20_kns )
session.measure(SingleInt ).assert_time(self.time_20_kns )
session.measure(SingleDefault ).assert_time(self.time_20_kns )
session.measure(EmptyClass ).assert_time(self.time_700_ns, self.time_800_ns, self.time_6_kns , self.time_7_kns)
session.measure(SingleStr ).assert_time(self.time_2_kns, self.time_20_kns )
session.measure(SingleInt ).assert_time(self.time_2_kns, self.time_20_kns )
session.measure(SingleDefault ).assert_time(self.time_2_kns, self.time_20_kns )

def test_complex_types(self): # Test complex type variations
class ComplexTypes(Type_Safe): # Multiple complex types
optional_str : Optional[str]
str_list : List[str]
int_dict : Dict[str, int]
union_field : Union[str, int]
str_list : List[str]
int_dict : Dict[str, int]
union_field : Union[str, int]

class NestedType(Type_Safe): # Basic nested type
value: str
Expand All @@ -69,9 +76,9 @@ class WithNested(Type_Safe): # Comple
items : List[NestedType]

with Performance_Measure__Session() as session:
session.measure(ComplexTypes ).assert_time(self.time_40_kns)
session.measure(NestedType ).assert_time(self.time_20_kns)
session.measure(WithNested ).assert_time(self.time_40_kns)
session.measure(ComplexTypes ).assert_time(self.time_20_kns, self.time_30_kns, self.time_40_kns)
session.measure(NestedType ).assert_time(self.time_2_kns , self.time_3_kns , self.time_20_kns)
session.measure(WithNested ).assert_time(self.time_20_kns, self.time_40_kns)

def test_inheritance_depth(self): # Test inheritance impact
class Base(Type_Safe): # Base class
Expand All @@ -87,10 +94,10 @@ class Level3(Level2): # Third
level3_value: bool

with Performance_Measure__Session() as session:
session.measure(Base ).assert_time(self.time_20_kns)
session.measure(Level1 ).assert_time(self.time_30_kns)
session.measure(Level2 ).assert_time(self.time_40_kns)
session.measure(Level3 ).assert_time(self.time_50_kns)
session.measure(Base ).assert_time(self.time_2_kns , self.time_3_kns , self.time_20_kns)
session.measure(Level1 ).assert_time(self.time_4_kns , self.time_30_kns)
session.measure(Level2 ).assert_time(self.time_6_kns , self.time_40_kns)
session.measure(Level3 ).assert_time(self.time_8_kns , self.time_9_kns , self.time_50_kns)

def test_enum_handling(self): # Test Enum type handling
class Status(Enum): # Define test enum
Expand All @@ -105,8 +112,8 @@ class WithEnumDefault(Type_Safe): # Class
status: Status = Status.ACTIVE

with Performance_Measure__Session() as session:
session.measure(WithEnum ).assert_time(self.time_10_kns)
session.measure(WithEnumDefault).assert_time(self.time_20_kns, self.time_30_kns)
session.measure(WithEnum ).assert_time(self.time_2_kns , self.time_10_kns)
session.measure(WithEnumDefault).assert_time(self.time_9_kns , self.time_20_kns, self.time_30_kns)

def test_initialization_with_values(self): # Test initialization performance
class ConfigClass(Type_Safe): # Test configuration class
Expand All @@ -123,8 +130,8 @@ def create_empty(): # Create
return ConfigClass()

with Performance_Measure__Session() as session:
session.measure(create_empty ).assert_time(self.time_40_kns)
session.measure(create_with_kwargs).assert_time(self.time_50_kns, self.time_60_kns)
session.measure(create_empty ).assert_time(self.time_5_kns , self.time_6_kns , self.time_40_kns)
session.measure(create_with_kwargs).assert_time(self.time_8_kns , self.time_50_kns, self.time_60_kns)

def test_type_validation_overhead(self): # Test validation performance
class WithValidation(Type_Safe): # Class needing validation
Expand All @@ -136,7 +143,7 @@ def create_valid(): # Direct
str_field = "test")

with Performance_Measure__Session() as session:
session.measure(create_valid ).assert_time(self.time_40_kns)
session.measure(create_valid ).assert_time(self.time_5_kns , self.time_6_kns , self.time_40_kns)

def test_collection_types(self): # Test collection performance
class WithCollections(Type_Safe): # Simple collections
Expand All @@ -149,8 +156,8 @@ class NestedCollections(Type_Safe): # Nested
nested_dict : Dict[str, Dict[str, Any]]

with Performance_Measure__Session() as session:
session.measure(WithCollections ).assert_time(self.time_30_kns, self.time_40_kns)
session.measure(NestedCollections ).assert_time(self.time_30_kns)
session.measure(WithCollections ).assert_time(self.time_30_kns, self.time_40_kns)
session.measure(NestedCollections ).assert_time(self.time_20_kns, self.time_30_kns)

def test_serialization_performance(self): # Test serialization speeds
class SerializedType(Type_Safe): # Complex type for serialization
Expand All @@ -163,16 +170,9 @@ class SerializedType(Type_Safe): # Complex
def serialize_to_json(): # Test JSON serialization
return test_obj.json()

def serialize_to_bytes(): # Test bytes serialization
return test_obj.bytes()

def serialize_to_bytes_gz(): # Test compressed serialization
return test_obj.bytes_gz()

with Performance_Measure__Session() as session:
session.measure(serialize_to_json ).assert_time(self.time_9_kns )
session.measure(serialize_to_bytes ).assert_time(self.time_20_kns )
session.measure(serialize_to_bytes_gz).assert_time(self.time_30_kns)
session.measure(serialize_to_json ).assert_time(self.time_5_kns , self.time_9_kns )

def test_method_override_performance(self): # Test method overriding impact
class BaseWithMethods(Type_Safe): # Base with typed methods
Expand Down Expand Up @@ -202,8 +202,8 @@ def call_derived_method(): # Test ove
derived.reset()

with Performance_Measure__Session() as session:
session.measure(call_base_method ).assert_time(self.time_10_kns)
session.measure(call_derived_method).assert_time(self.time_10_kns)
session.measure(call_base_method ).assert_time(self.time_1_kns , self.time_10_kns)
session.measure(call_derived_method).assert_time(self.time_1_kns , self.time_10_kns)

def test_property_access_performance(self): # Test property access speeds
class WithProperties(Type_Safe): # Class using properties
Expand Down Expand Up @@ -234,8 +234,8 @@ def access_direct(): # Test dir
_ = direct.value

with Performance_Measure__Session() as session:
session.measure(access_property).assert_time(self.time_4_kns)
session.measure(access_direct ).assert_time(self.time_6_kns, self.time_7_kns)
session.measure(access_property).assert_time(self.time_3_kns , self.time_4_kns)
session.measure(access_direct ).assert_time(self.time_700_ns , self.time_6_kns, self.time_7_kns)

def test_context_manager_performance(self): # Test context manager overhead
class SimpleType(Type_Safe): # Simple managed type
Expand All @@ -250,8 +250,8 @@ def direct_usage(): # Use witho
obj.value = 42

with Performance_Measure__Session() as session:
session.measure(use_context_manager).assert_time(self.time_20_kns)
session.measure(direct_usage ).assert_time(self.time_20_kns)
session.measure(use_context_manager).assert_time(self.time_3_kns, self.time_20_kns)
session.measure(direct_usage ).assert_time(self.time_3_kns, self.time_20_kns)

def test_merge_performance(self): # Test merge operation speed
class SourceType(Type_Safe): # Source for merge
Expand All @@ -270,7 +270,7 @@ def perform_merge(): # Test merg
target.merge_with(source)

with Performance_Measure__Session() as session:
session.measure(perform_merge).assert_time(self.time_6_kns)
session.measure(perform_merge).assert_time(self.time_3_kns, self.time_6_kns)

@dataclass
class ComplexDefault: # Helper for comparison
Expand All @@ -289,8 +289,8 @@ def create_type_safe(): # Create Type_
return TypeSafeVersion()

with Performance_Measure__Session() as session:
session.measure(create_dataclass).assert_time(self.time_300_ns)
session.measure(create_type_safe).assert_time(self.time_20_kns, self.time_30_kns)
session.measure(create_dataclass).assert_time(self.time_200_ns , self.time_300_ns)
session.measure(create_type_safe).assert_time(self.time_4_kns , self.time_20_kns, self.time_30_kns)

def test_union_type_performance(self): # Test performance of union type validation
class WithUnion(Type_Safe):
Expand All @@ -304,8 +304,8 @@ def test_last_type():
return WithUnion(field=1.0, nested=["a", "b", "c", "d"])

with Performance_Measure__Session() as session:
session.measure(test_first_type).assert_time(self.time_30_kns, self.time_40_kns)
session.measure(test_last_type ).assert_time(self.time_30_kns)
session.measure(test_first_type).assert_time(self.time_20_kns, self.time_30_kns, self.time_40_kns)
session.measure(test_last_type ).assert_time(self.time_20_kns, self.time_30_kns)

def test_forward_ref_performance(self): # Test performance of forward reference resolution
class Node(Type_Safe):
Expand All @@ -324,8 +324,8 @@ def create_tree():
return root

with Performance_Measure__Session() as session:
session.measure(create_chain).assert_time(self.time_80_kns )
session.measure(create_tree ).assert_time(self.time_200_kns, self.time_300_kns)
session.measure(create_chain).assert_time(self.time_30_kns , self.time_80_kns )
session.measure(create_tree ).assert_time(self.time_60_kns , self.time_200_kns, self.time_300_kns)

def test_mixed_defaults_performance(self): # Test performance of mixed default value handling
class MixedDefaults(Type_Safe):
Expand All @@ -348,8 +348,8 @@ def create_with_overrides():
)

with Performance_Measure__Session() as session:
session.measure(create_with_defaults ).assert_time(self.time_50_kns)
session.measure(create_with_overrides).assert_time(self.time_80_kns, self.time_90_kns)
session.measure(create_with_defaults ).assert_time(self.time_8_kns , self.time_50_kns)
session.measure(create_with_overrides).assert_time(self.time_20_kns , self.time_80_kns, self.time_90_kns)

def test_deep_nesting_performance(self): # Test performance of deeply nested type validation
class Level3(Type_Safe):
Expand All @@ -369,7 +369,7 @@ def create_deep_nested():
return Level1(nested=l2, mapping={"test": l2})

with Performance_Measure__Session() as session:
session.measure(create_deep_nested).assert_time(self.time_200_kns)
session.measure(create_deep_nested).assert_time(self.time_80_kns , self.time_200_kns)

def test_large_object_instantiation(self): # Test performance with large object graphs
class Item(Type_Safe):
Expand All @@ -386,5 +386,5 @@ def create_larger_object():
return Container(items=[Item(id=str(i), value=i)for i in range(20)])

with Performance_Measure__Session() as session:
session.measure(create_medium_object).assert_time(self.time_400_kns)
session.measure(create_larger_object).assert_time(self.time_800_kns)
session.measure(create_medium_object).assert_time(self.time_70_kns, self.time_400_kns)
session.measure(create_larger_object).assert_time(self.time_100_kns)
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ def test_class__with_one_int(self):
class Class__One_int:
an_int : int
assert self.step_class_kwargs.get_cls_kwargs(Class__One_int) == {'an_int': 0}
#Class__One_int()
#Class__One_int()
#Class__One_int()

assert self.step_class_kwargs.get_cls_kwargs(Class__One_int) == {'an_int': 0}

0 comments on commit 857788b

Please sign in to comment.