From b70e9bd2c4ac2f44d702054cf16224aefea88298 Mon Sep 17 00:00:00 2001
From: Martin Lange <martin.lange@ufz.de>
Date: Sat, 26 Nov 2022 23:49:00 +0100
Subject: [PATCH] set up basic benchmarks

---
 .gitlab-ci.yml                |   6 ++
 benchmarks/data/test_tools.py | 136 ++++++++++++++++++++++++++++++++++
 pyproject.toml                |   5 +-
 3 files changed, 146 insertions(+), 1 deletion(-)
 create mode 100644 benchmarks/data/test_tools.py

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 18f2b866..b75b5cbf 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -31,6 +31,12 @@ test:
     paths:
       - cov
 
+benchmark:
+  stage: test
+  script:
+    - pip3 install --editable .[test]
+    - python -m pytest -v benchmarks/
+
 doctest:
   stage: test
   script:
diff --git a/benchmarks/data/test_tools.py b/benchmarks/data/test_tools.py
new file mode 100644
index 00000000..6b8d61d4
--- /dev/null
+++ b/benchmarks/data/test_tools.py
@@ -0,0 +1,136 @@
+import datetime as dt
+import unittest
+
+import pytest
+
+import finam as fm
+from finam.data import (
+    assign_time,
+    check,
+    full,
+    get_time,
+    get_units,
+    has_time,
+    strip_data,
+    strip_time,
+    to_units,
+    to_xarray,
+)
+
+
+class TestCheckXarray(unittest.TestCase):
+    @pytest.fixture(autouse=True)
+    def setupBenchmark(self, benchmark):
+        self.benchmark = benchmark
+
+    def test_check_xarray_01_2x1(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(check, xdata=xdata, name="test", info=info, time=time)
+
+    def test_check_xarray_02_128x64(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((128, 64)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(check, xdata=xdata, name="test", info=info, time=time)
+
+
+class TestToXarray(unittest.TestCase):
+    @pytest.fixture(autouse=True)
+    def setupBenchmark(self, benchmark):
+        self.benchmark = benchmark
+
+    def test_to_xarray_01_2x1(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        data = strip_data(xdata)
+        _result = self.benchmark(
+            to_xarray, data=data, name="test", info=info, time=time
+        )
+
+    def test_to_xarray_02_128x64(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((128, 64)), units="m")
+        xdata = full(0.0, "test", info, time)
+        data = strip_data(xdata)
+        _result = self.benchmark(
+            to_xarray, data=data, name="test", info=info, time=time
+        )
+
+    def test_to_xarray_03_2048x1024(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2048, 1024)), units="m")
+        xdata = full(0.0, "test", info, time)
+        data = strip_data(xdata)
+        _result = self.benchmark(
+            to_xarray, data=data, name="test", info=info, time=time
+        )
+
+
+class TestTimeTools(unittest.TestCase):
+    @pytest.fixture(autouse=True)
+    def setupBenchmark(self, benchmark):
+        self.benchmark = benchmark
+
+    def test_strip_time(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(strip_time, xdata=xdata)
+
+    def test_assign_time_update(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(assign_time, xdata=xdata, time=dt.datetime(2000, 1, 2))
+
+    def test_assign_time_add(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        xdata = strip_time(xdata)
+        _result = self.benchmark(assign_time, xdata=xdata, time=dt.datetime(2000, 1, 2))
+
+    def test_get_time(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(get_time, xdata=xdata)
+
+    def test_has_time(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(has_time, xdata=xdata)
+
+
+class TestUnitsTools(unittest.TestCase):
+    @pytest.fixture(autouse=True)
+    def setupBenchmark(self, benchmark):
+        self.benchmark = benchmark
+
+    def test_get_units(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(get_units, xdata=xdata)
+
+    def test_to_units_2x1(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2, 1)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(to_units, xdata=xdata, units="in")
+
+    def test_to_units_128x64(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((128, 64)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(to_units, xdata=xdata, units="in")
+
+    def test_to_units_2048x1024(self):
+        time = dt.datetime(2000, 1, 1)
+        info = fm.Info(time=time, grid=fm.UniformGrid((2048, 1024)), units="m")
+        xdata = full(0.0, "test", info, time)
+        _result = self.benchmark(to_units, xdata=xdata, units="in")
diff --git a/pyproject.toml b/pyproject.toml
index d89c0ccb..c564e04d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -65,7 +65,10 @@ doc = [
     "docutils>=0.18", # mdinclude with myst
     "matplotlib>=3",
 ]
-test = ["pytest-cov>=3"]
+test = [
+    "pytest-cov>=3",
+    "pytest-benchmark>=4.0",
+]
 
 [tool.setuptools]
 license-files = ["LICENSE"]
-- 
GitLab