121 строка
3.0 KiB
Python
121 строка
3.0 KiB
Python
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT license.
|
|
|
|
import os
|
|
from time import time
|
|
|
|
from termgraph import termgraph as tg
|
|
|
|
from maro.backends.frame import (FrameBase, FrameNode, NodeAttribute, NodeBase,
|
|
node)
|
|
|
|
NODE1_NUMBER = 100
|
|
NODE2_NUMBER = 100
|
|
MAX_TICK = 10000
|
|
|
|
|
|
READ_WRITE_NUMBER = 10000000
|
|
STATES_QURING_TIME = 10000
|
|
TAKE_SNAPSHOT_TIME = 10000
|
|
|
|
AVG_TIME = 4
|
|
|
|
|
|
@node("node1")
|
|
class TestNode1(NodeBase):
|
|
a = NodeAttribute("i")
|
|
b = NodeAttribute("i")
|
|
c = NodeAttribute("i")
|
|
d = NodeAttribute("i")
|
|
e = NodeAttribute("i", 16)
|
|
|
|
|
|
@node("node2")
|
|
class TestNode2(NodeBase):
|
|
b = NodeAttribute("i", 20)
|
|
|
|
|
|
class TestFrame(FrameBase):
|
|
node1 = FrameNode(TestNode1, NODE1_NUMBER)
|
|
node2 = FrameNode(TestNode2, NODE2_NUMBER)
|
|
|
|
def __init__(self, backend_name):
|
|
super().__init__(enable_snapshot=True,
|
|
total_snapshot=TAKE_SNAPSHOT_TIME, backend_name=backend_name)
|
|
|
|
|
|
def build_frame(backend_name: str):
|
|
return TestFrame(backend_name)
|
|
|
|
|
|
def attribute_access(frame, times: int):
|
|
"""Return time cost (in seconds) for attribute acceesing test"""
|
|
start_time = time()
|
|
|
|
n1 = frame.node1[0]
|
|
|
|
for _ in range(times):
|
|
a = n1.a
|
|
n1.a = 12
|
|
|
|
return time() - start_time
|
|
|
|
|
|
def take_snapshot(frame, times: int):
|
|
"""Return times cost (in seconds) for take_snapshot operation"""
|
|
|
|
start_time = time()
|
|
|
|
for i in range(times):
|
|
frame.take_snapshot(i)
|
|
|
|
return time() - start_time
|
|
|
|
|
|
def snapshot_query(frame, times: int):
|
|
"""Return time cost (in seconds) for snapshot querying"""
|
|
|
|
start_time = time()
|
|
|
|
for i in range(times):
|
|
states = frame.snapshots["node1"][i::"a"]
|
|
|
|
return time() - start_time
|
|
|
|
|
|
if __name__ == "__main__":
|
|
chart_colors = [91, 94]
|
|
|
|
chart_args = {'filename': '-', 'title': "Performance comparison between cpp and np backends", 'width': 40,
|
|
'format': '{:<5.2f}', 'suffix': '', 'no_labels': False,
|
|
'color': None, 'vertical': False, 'stacked': False,
|
|
'different_scale': False, 'calendar': False,
|
|
'start_dt': None, 'custom_tick': '', 'delim': '',
|
|
'verbose': False, 'version': False,
|
|
'histogram': False, 'no_values': False}
|
|
|
|
chart_labels = [f'attribute accessing ({READ_WRITE_NUMBER})',
|
|
f'take snapshot ({STATES_QURING_TIME})', f'states querying ({STATES_QURING_TIME})']
|
|
|
|
chart_data = [[0.0, 0.0], [0.0, 0.0], [0.0, 0.0]]
|
|
|
|
i = 0
|
|
j = 0
|
|
|
|
for backend_name in ["static", "dynamic"]:
|
|
frame = build_frame(backend_name)
|
|
|
|
j = 0
|
|
|
|
for func, args in [(attribute_access, READ_WRITE_NUMBER), (take_snapshot, TAKE_SNAPSHOT_TIME), (snapshot_query, STATES_QURING_TIME)]:
|
|
t = func(frame, args)
|
|
|
|
chart_data[j][i] = t
|
|
|
|
j += 1
|
|
|
|
i += 1
|
|
|
|
tg.print_categories(['static', 'dynamic'], chart_colors)
|
|
tg.chart(chart_colors, chart_data, chart_args, chart_labels)
|