In [1]:
"""
Benchmark equivalent employee/department queries in
SQLite, PostgreSQL, and Neo4j.
"""
from dataclasses import dataclass
from exercise_02_11_benchmark import BenchmarkResult

Import benchmark implementations¶

In [2]:
from exercise_02_11_sqlite import (
    create_database as create_sqlite,
    benchmark as benchmark_sqlite,
)
from exercise_02_11_postgres import (
    create_database as create_postgres,
    benchmark as benchmark_postgres,
)
from exercise_02_11_neo4j import (
    create_database as create_neo4j,
    benchmark as benchmark_neo4j,
)

Result object¶

In [3]:
@dataclass
class BenchmarkResult:
    database: str
    rows: int
    average_ms: float
    minimum_ms: float
    maximum_ms: float
    stddev_ms: float

Pretty printer¶

In [4]:
def print_results(results):

    print()

    print("=" * 78)
    print("Employee / Department Benchmark")
    print("=" * 78)

    print(
        f"{'Database':<15}"
        f"{'Rows':>8}"
        f"{'Avg (ms)':>12}"
    )

    print("-" * 78)

    fastest = min(r.average_ms for r in results)

    for r in results:

        relative = r.average_ms / fastest
        print(
            f"{r.database:<15}"
            f"{r.rows:>8}"
            f"{r.average_ms:>12.3f}"
            f"   ({relative:.2f}×)"
)

    print("=" * 78)

Main¶

In [5]:
def main():
    print("Creating benchmark databases...\n")
    create_sqlite()
    create_postgres()
    create_neo4j()
    print("Running benchmarks...\n")
    results = [
        benchmark_sqlite(),
        benchmark_postgres(),
        benchmark_neo4j()
    ]
    print_results(results)
    print(len(results), "benchmarks completed.")
In [6]:
if __name__ == "__main__":
    main()
Creating benchmark databases...

Loaded 107 employee-department rows.
Rows in Employee_Department: 107
Database loaded successfully.
Running benchmarks...


==============================================================================
Employee / Department Benchmark
==============================================================================
Database           Rows    Avg (ms)
------------------------------------------------------------------------------
SQLite                5       0.045   (1.00×)
PostgreSQL            5       0.069   (1.53×)
Neo4j                 5       1.939   (43.07×)
==============================================================================
3 benchmarks completed.