diff --git a/.gitignore b/.gitignore index 8bd92964c..29a868796 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ requirements.txt .pyi_generator_last_run .pyi_generator_diff reflex.db +.codspeed \ No newline at end of file diff --git a/benchmarks/test_benchmark_compile_components.py b/benchmarks/test_benchmark_compile_components.py index ba7e9c571..dc03882e1 100644 --- a/benchmarks/test_benchmark_compile_components.py +++ b/benchmarks/test_benchmark_compile_components.py @@ -8,9 +8,7 @@ from typing import Generator import pytest -from benchmarks import WINDOWS_SKIP_REASON from reflex import constants -from reflex.compiler import utils from reflex.testing import AppHarness, chdir from reflex.utils import build from reflex.utils.prerequisites import get_web_dir @@ -115,34 +113,24 @@ def render_component(num: int): ] * num -def AppWithTenComponentsOnePage(): - """A reflex app with roughly 10 components on one page.""" +# This is a fake component, technically, it's not needed for runtime, +# but it's used to make the type checker happy. +components = 1 + + +def AppWithComponents(): + """Generate an app with a number of components. + + Args: + components: The number of components to generate. + + Returns: + The generated app. + """ import reflex as rx def index() -> rx.Component: - return rx.center(rx.vstack(*render_component(1))) - - app = rx.App(_state=rx.State) - app.add_page(index) - - -def AppWithHundredComponentOnePage(): - """A reflex app with roughly 100 components on one page.""" - import reflex as rx - - def index() -> rx.Component: - return rx.center(rx.vstack(*render_component(100))) - - app = rx.App(_state=rx.State) - app.add_page(index) - - -def AppWithThousandComponentsOnePage(): - """A reflex app with roughly 1000 components on one page.""" - import reflex as rx - - def index() -> rx.Component: - return rx.center(rx.vstack(*render_component(1000))) + return rx.center(rx.vstack(*render_component(components))) app = rx.App(_state=rx.State) app.add_page(index) @@ -165,8 +153,9 @@ def app_with_10_components( yield AppHarness.create( root=root, app_source=functools.partial( - AppWithTenComponentsOnePage, + AppWithComponents, render_component=render_component, # type: ignore + components=10, # pyright: ignore [reportGeneralTypeIssues] ), ) # type: ignore @@ -188,8 +177,9 @@ def app_with_100_components( yield AppHarness.create( root=root, app_source=functools.partial( - AppWithHundredComponentOnePage, + AppWithComponents, render_component=render_component, # type: ignore + components=100, # pyright: ignore [reportGeneralTypeIssues] ), ) # type: ignore @@ -211,40 +201,13 @@ def app_with_1000_components( yield AppHarness.create( root=root, app_source=functools.partial( - AppWithThousandComponentsOnePage, + AppWithComponents, render_component=render_component, # type: ignore + components=1000, # pyright: ignore [reportGeneralTypeIssues] ), ) # type: ignore -@pytest.mark.skipif(constants.IS_WINDOWS, reason=WINDOWS_SKIP_REASON) -@pytest.mark.benchmark( - group="Compile time of varying component numbers", - timer=time.perf_counter, - disable_gc=True, - warmup=False, -) -def test_app_10_compile_time_cold(benchmark, app_with_10_components): - """Test the compile time on a cold start for an app with roughly 10 components. - - Args: - benchmark: The benchmark fixture. - app_with_10_components: The app harness. - """ - - def setup(): - with chdir(app_with_10_components.app_path): - utils.empty_dir(web_pages, ["_app.js"]) - app_with_10_components._initialize_app() - build.setup_frontend(app_with_10_components.app_path) - - def benchmark_fn(): - with chdir(app_with_10_components.app_path): - app_with_10_components.app_instance._compile() - - benchmark.pedantic(benchmark_fn, setup=setup, rounds=10) - - @pytest.mark.benchmark( group="Compile time of varying component numbers", min_rounds=5, @@ -270,34 +233,6 @@ def test_app_10_compile_time_warm(benchmark, app_with_10_components): benchmark(benchmark_fn) -@pytest.mark.skipif(constants.IS_WINDOWS, reason=WINDOWS_SKIP_REASON) -@pytest.mark.benchmark( - group="Compile time of varying component numbers", - timer=time.perf_counter, - disable_gc=True, - warmup=False, -) -def test_app_100_compile_time_cold(benchmark, app_with_100_components): - """Test the compile time on a cold start for an app with roughly 100 components. - - Args: - benchmark: The benchmark fixture. - app_with_100_components: The app harness. - """ - - def setup(): - with chdir(app_with_100_components.app_path): - utils.empty_dir(web_pages, ["_app.js"]) - app_with_100_components._initialize_app() - build.setup_frontend(app_with_100_components.app_path) - - def benchmark_fn(): - with chdir(app_with_100_components.app_path): - app_with_100_components.app_instance._compile() - - benchmark.pedantic(benchmark_fn, setup=setup, rounds=5) - - @pytest.mark.benchmark( group="Compile time of varying component numbers", min_rounds=5, @@ -323,34 +258,6 @@ def test_app_100_compile_time_warm(benchmark, app_with_100_components): benchmark(benchmark_fn) -@pytest.mark.skipif(constants.IS_WINDOWS, reason=WINDOWS_SKIP_REASON) -@pytest.mark.benchmark( - group="Compile time of varying component numbers", - timer=time.perf_counter, - disable_gc=True, - warmup=False, -) -def test_app_1000_compile_time_cold(benchmark, app_with_1000_components): - """Test the compile time on a cold start for an app with roughly 1000 components. - - Args: - benchmark: The benchmark fixture. - app_with_1000_components: The app harness. - """ - - def setup(): - with chdir(app_with_1000_components.app_path): - utils.empty_dir(web_pages, keep_files=["_app.js"]) - app_with_1000_components._initialize_app() - build.setup_frontend(app_with_1000_components.app_path) - - def benchmark_fn(): - with chdir(app_with_1000_components.app_path): - app_with_1000_components.app_instance._compile() - - benchmark.pedantic(benchmark_fn, setup=setup, rounds=5) - - @pytest.mark.benchmark( group="Compile time of varying component numbers", min_rounds=5,