mirror of
https://github.com/b4tman/sync_ics2gcal
synced 2025-01-21 07:28:24 +00:00
+ bench_converter
This commit is contained in:
parent
2ab96d1b00
commit
2e114db5c9
105
tests/bench_converter.py
Normal file
105
tests/bench_converter.py
Normal file
@ -0,0 +1,105 @@
|
||||
|
||||
from typing import Iterable, List, Tuple, Union, Optional
|
||||
from uuid import uuid4
|
||||
import datetime
|
||||
from itertools import islice
|
||||
from dataclasses import dataclass
|
||||
import time
|
||||
import statistics
|
||||
import functools
|
||||
|
||||
from sync_ics2gcal import CalendarConverter
|
||||
|
||||
|
||||
@dataclass
|
||||
class IcsTestEvent:
|
||||
uid: str
|
||||
start_date: Union[datetime.datetime, datetime.date]
|
||||
end_date: Union[datetime.datetime, datetime.date, None] = None
|
||||
duration: Optional[datetime.timedelta] = None
|
||||
created: Union[datetime.datetime, datetime.date, None] = None
|
||||
updated: Union[datetime.datetime, datetime.date, None] = None
|
||||
|
||||
@staticmethod
|
||||
def _format_datetime(value: Union[datetime.datetime, datetime.date]):
|
||||
result: str = ''
|
||||
if isinstance(value, datetime.datetime):
|
||||
result += f'DATE-TIME:{value.strftime("%Y%m%dT%H%M%SZ")}'
|
||||
else:
|
||||
result += f'DATE:{value.strftime("%Y%m%d")}'
|
||||
return result
|
||||
|
||||
def render(self) -> str:
|
||||
result: str = ''
|
||||
result += 'BEGIN:VEVENT\r\n'
|
||||
result += f'UID:{self.uid}\r\n'
|
||||
result += f'DTSTART;VALUE={IcsTestEvent._format_datetime(self.start_date)}\r\n'
|
||||
if self.end_date is not None:
|
||||
result += f'DTEND;VALUE={IcsTestEvent._format_datetime(self.end_date)}\r\n'
|
||||
else:
|
||||
result += f'DURATION:P{self.duration.days}D\r\n'
|
||||
if self.created is not None:
|
||||
result += f'CREATED:{self.created.strftime("%Y%m%dT%H%M%SZ")}\r\n'
|
||||
if self.updated is not None:
|
||||
result += f'LAST-MODIFIED:{self.updated.strftime("%Y%m%dT%H%M%SZ")}\r\n'
|
||||
result += 'END:VEVENT\r\n'
|
||||
return result
|
||||
|
||||
|
||||
@dataclass
|
||||
class IcsTestCalendar:
|
||||
events: List[IcsTestEvent]
|
||||
|
||||
def render(self) -> str:
|
||||
result: str = ''
|
||||
result += 'BEGIN:VCALENDAR\r\n'
|
||||
for event in self.events:
|
||||
result += event.render()
|
||||
result += 'END:VCALENDAR\r\n'
|
||||
return result
|
||||
|
||||
|
||||
def gen_test_calendar(events_count: int) -> IcsTestCalendar:
|
||||
def gen_events() -> Iterable[IcsTestEvent]:
|
||||
for i in range(10000000):
|
||||
uid = f'{uuid4()}@test.com'
|
||||
start_date = datetime.datetime.now() + datetime.timedelta(hours=i)
|
||||
end_date = start_date + datetime.timedelta(hours=1)
|
||||
event: IcsTestEvent = IcsTestEvent(
|
||||
uid=uid, start_date=start_date, end_date=end_date, created=start_date, updated=start_date)
|
||||
yield event
|
||||
|
||||
events: List[IcsTestEvent] = list(islice(gen_events(), events_count))
|
||||
result: IcsTestCalendar = IcsTestCalendar(events)
|
||||
return result
|
||||
|
||||
|
||||
test_calendar: IcsTestCalendar = gen_test_calendar(1000)
|
||||
ics_test_calendar: str = test_calendar.render()
|
||||
converter = CalendarConverter()
|
||||
converter.loads(ics_test_calendar)
|
||||
|
||||
|
||||
def bench(num_iters=1000):
|
||||
def make_wrapper(func):
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kw):
|
||||
times = []
|
||||
for _ in range(num_iters):
|
||||
t0 = time.perf_counter_ns()
|
||||
result = func(*args, **kw)
|
||||
t1 = time.perf_counter_ns()
|
||||
times.append(t1 - t0)
|
||||
best = min(times)
|
||||
avg = round(sum(times) / num_iters, 2)
|
||||
median = statistics.median(times)
|
||||
print(
|
||||
f'{func.__name__} x {num_iters} => best: {best} ns, \tavg: {avg} ns, \tmedian: {median} ns')
|
||||
return result
|
||||
return wrapper()
|
||||
return make_wrapper
|
||||
|
||||
|
||||
@bench(num_iters=500)
|
||||
def events_to_gcal():
|
||||
converter.events_to_gcal()
|
Loading…
Reference in New Issue
Block a user