Skip to content

Commit 54b27c7

Browse files
committed
test framework for performance and memory usage
1 parent fd8f312 commit 54b27c7

File tree

4 files changed

+117
-0
lines changed

4 files changed

+117
-0
lines changed

stress/__init__.py

Whitespace-only changes.

stress/dev_requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
psutil
2+
matplotlib

stress/unit/local_iterator.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import base64
2+
import io
3+
4+
import stress.util as stress_util
5+
from snowflake.connector.arrow_context import ArrowConverterContext
6+
from snowflake.connector.arrow_iterator import PyArrowIterator
7+
from stress.util import task_memory_decorator, task_time_execution_decorator
8+
9+
stress_util.print_to_console = False
10+
can_draw = True
11+
try:
12+
import matplotlib.pyplot as plt
13+
except ImportError:
14+
can_draw = False
15+
16+
b64data = "<data>"
17+
iteration_cnt = 100000
18+
decoded_bytes = base64.b64decode(b64data)
19+
arrow_context = ArrowConverterContext()
20+
21+
22+
def task_for_loop_iterator(bytes_data):
23+
arrow_iter = PyArrowIterator(
24+
None,
25+
io.BytesIO(bytes_data),
26+
arrow_context,
27+
False,
28+
False,
29+
False,
30+
)
31+
for _ in arrow_iter:
32+
pass
33+
34+
35+
def execute_task(task, bytes_data):
36+
for _ in range(iteration_cnt):
37+
task(bytes_data)
38+
39+
40+
if __name__ == "__main__":
41+
42+
perf_check_task_for_loop_iterator = task_time_execution_decorator(
43+
task_for_loop_iterator
44+
)
45+
memory_check_task_for_loop_iterator = task_memory_decorator(task_for_loop_iterator)
46+
47+
execute_task(memory_check_task_for_loop_iterator, decoded_bytes)
48+
memory_records = stress_util.collect_memory_records()
49+
execute_task(perf_check_task_for_loop_iterator, decoded_bytes)
50+
time_records = stress_util.collect_time_execution_records()
51+
52+
if can_draw:
53+
plt.plot([i for i in range(len(time_records))], time_records)
54+
plt.title("per iteration execution time")
55+
plt.show()
56+
plt.plot(
57+
[item[0] for item in memory_records], [item[1] for item in memory_records]
58+
)
59+
plt.title("memory usage")
60+
plt.show()

stress/util.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import os
2+
import time
3+
4+
import psutil
5+
6+
pid = os.getpid()
7+
process = psutil.Process(pid)
8+
9+
last_memory_record = None
10+
memory_records = []
11+
time_records = []
12+
memory_decoration_execution_time = 0
13+
print_to_console = False
14+
15+
16+
def collect_memory_records():
17+
memory_records.append(last_memory_record)
18+
return memory_records
19+
20+
21+
def collect_time_execution_records():
22+
return time_records
23+
24+
25+
def task_memory_decorator(func):
26+
memory_records.clear()
27+
global memory_decoration_execution_time
28+
memory_decoration_execution_time = 0
29+
30+
def wrapper(*args, **kwargs):
31+
global memory_decoration_execution_time
32+
global print_to_console
33+
global last_memory_record
34+
func(*args, **kwargs)
35+
percent = process.memory_percent()
36+
if not memory_records or (memory_records and percent != memory_records[-1][1]):
37+
memory_records.append((memory_decoration_execution_time, percent))
38+
memory_decoration_execution_time += 1
39+
last_memory_record = (memory_decoration_execution_time, percent)
40+
if print_to_console:
41+
print(memory_decoration_execution_time, percent)
42+
43+
return wrapper
44+
45+
46+
def task_time_execution_decorator(func):
47+
time_records.clear()
48+
49+
def wrapper(*args, **kwargs):
50+
start = time.time()
51+
func(*args, **kwargs)
52+
period = time.time() - start
53+
time_records.append(period)
54+
55+
return wrapper

0 commit comments

Comments
 (0)