ex4nicegui icon indicating copy to clipboard operation
ex4nicegui copied to clipboard

rxui.vmodel executes slowly

Open CrystalWindSnake opened this issue 1 year ago • 1 comments

from nicegui import ui
from ex4nicegui import deep_ref, rxui
from ex4nicegui.utils.signals import to_ref_wrapper
import time


def calculate_execution_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(
            f"Function '{func.__name__}' took {end_time - start_time} seconds to execute."
        )
        return result

    return wrapper


@calculate_execution_time
def use_vmodel():
    data = deep_ref({"a": "text"})

    rxui.label(data)
    rxui.input(value=rxui.vmodel(data.value["a"]))


use_vmodel()


@calculate_execution_time
def use_to_wrap():
    data = deep_ref({"a": "text"})

    def setter(new_value):
        data.value["a"] = new_value

    wrapper = to_ref_wrapper(lambda: data.value["a"], setter)

    rxui.label(data)
    rxui.input(value=wrapper)


use_to_wrap()

ui.run()

Using rxui.vmodel is much slower than using to_ref_wrapper

Function 'use_vmodel' took 0.6890246868133545 seconds to execute.
Function 'use_to_wrap' took 0.0 seconds to execute.

CrystalWindSnake avatar Mar 21 '24 08:03 CrystalWindSnake

Inefficient execution due to vmodel needing to fetch the caller's previous frame. Consider adding a new type of binding

data = deep_ref({"a": "text"})
rxui.input(value=rxui.two_way_binding(data.value,'a'))

CrystalWindSnake avatar Mar 21 '24 08:03 CrystalWindSnake

now we can :

data = deep_ref({"a": "text"})
rxui.input(value=rxui.vmodel(data,'a'))

CrystalWindSnake avatar Aug 28 '24 08:08 CrystalWindSnake