diff --git a/tests/benchmark.py b/tests/benchmark.py
new file mode 100644
index 0000000000000000000000000000000000000000..bbeca43b2e201864d41eee960a555166f3c7a392
--- /dev/null
+++ b/tests/benchmark.py
@@ -0,0 +1,104 @@
+from datetime import datetime, timedelta
+import time
+import requests
+from pathlib import Path
+
+from toargridding.toar_rest_client import AnalysisServiceDownload
+from toargridding.metadata import Metadata, TimeSample, TOARVariable
+
+start = datetime(2016, 3, 1)
+end = datetime(2016, 3, 3)
+
+SAMPLING = "daily"  # FIXME check monthly !!!
+STATISTICS_ENDPOINT = "https://toar-data.fz-juelich.de/api/v2/analysis/statistics/"
+STATISTIC = "mean"
+TEST_ROOT = Path(__file__).parent
+
+
+def get_toar_response(start, end):
+    end_with_padding = end + timedelta(1)
+
+    response = requests.get(
+        STATISTICS_ENDPOINT,
+        params={
+            "daterange": f"{start.isoformat()},{end_with_padding.isoformat()}",  # 1-year
+            "variable_id": 5,
+            "statistics": STATISTIC,
+            "sampling": SAMPLING,
+            "min_data_capture": 0,
+            "limit": "None",  # get all timeseries
+            "format": "by_statistic",
+            "metadata_scheme": "basic",
+        },
+    )
+    return wait_for_data(response)
+
+
+def wait_for_data(response):
+    tries = 0
+    while True:
+        print(f"n tries: {tries}")
+        if response.headers["Content-Type"] == "application/zip":
+            break
+        else:
+            status_endpoint = response.json()["status"]
+            time.sleep(60)
+            try:
+                response = requests.get(status_endpoint)
+            except ConnectionError:
+                print("temporarly no connection")
+        tries += 1
+
+    return tries
+
+
+def time_toar_response(start, end):
+    print(f"starting request for {start}-{end}")
+
+    timer_start = datetime.now()
+    tries = get_toar_response(start, end)
+    timer_end = datetime.now()
+    response_time = timer_end - timer_start
+
+    print(f"response time for {start}-{end}: {response_time} ({tries} tries)")
+
+
+def wait_for_client_response(client, sample):
+    for half_hours in range(20):
+        try:
+            client.get_data(sample)
+        except RuntimeError:
+            print(f"time out after 30min, try {half_hours+1}")
+
+
+def time_rest_client_response(start, end):
+    print(f"starting request for {start}-{end}")
+
+    rest_client = AnalysisServiceDownload(
+        STATISTICS_ENDPOINT,
+        TEST_ROOT / "temp_data_cache",
+        TEST_ROOT / "temp_data",
+        use_downloaded=False,
+    )
+    time_window = TimeSample(start, end, SAMPLING)
+    sample = Metadata.construct("mole_fraction_of_ozone_in_air", STATISTIC, time_window)
+
+    timer_start = datetime.now()
+    wait_for_client_response(rest_client, sample)
+    timer_end = datetime.now()
+    response_time = timer_end - timer_start
+
+    print(f"response time for {start}-{end}: {response_time} (tries)")
+
+
+if __name__ == "__main__":
+    time_windows = [
+        (datetime(2010, 1, 1), datetime(2010, 1, 2)),
+        (datetime(2010, 1, 1), datetime(2010, 1, 8)),
+        (datetime(2010, 1, 1), datetime(2010, 1, 31)),
+        (datetime(2010, 1, 1), datetime(2010, 12, 31)),
+        (datetime(2010, 1, 1), datetime(2015, 12, 31)),
+    ]
+    for start, end in time_windows:
+        print("rest client")
+        time_rest_client_response(start, end)