chia-blockchain/benchmarks/blockchains.py
2023-11-27 10:20:57 -06:00

65 lines
2.2 KiB
Python

from __future__ import annotations
import asyncio
import cProfile
import time
from contextlib import contextmanager
from subprocess import check_call
from typing import Iterator
from chia.simulator.block_tools import create_block_tools_async, test_constants
from chia.simulator.keyring import TempKeyring
from chia.util.keyring_wrapper import KeyringWrapper
from tests.util.blockchain import persistent_blocks
@contextmanager
def enable_profiler(profile: bool, name: str) -> Iterator[None]:
if not profile:
yield
return
with cProfile.Profile() as pr:
yield
pr.create_stats()
output_file = f"{name}"
pr.dump_stats(output_file + ".profile")
check_call(["gprof2dot", "-f", "pstats", "-o", output_file + ".dot", output_file + ".profile"])
with open(output_file + ".png", "w+") as f:
check_call(["dot", "-T", "png", output_file + ".dot"], stdout=f)
print(" output written to: %s.png" % output_file)
async def run_test_chain_benchmark() -> None:
with TempKeyring() as keychain:
bt = await create_block_tools_async(constants=test_constants, keychain=keychain)
with enable_profiler(True, "load-test-chain"):
start = time.monotonic()
for version in ["", "_hardfork"]:
for count, name in [
(400, "test_blocks_400_rc5"),
(1000, "test_blocks_1000_rc5"),
(1000, "pre_genesis_empty_slots_1000_blocksrc5"),
(1500, "test_blocks_1500_rc5"),
(10000, "test_blocks_10000_rc5"),
(758 + 320, "test_blocks_long_reorg_rc5"),
(2000, "test_blocks_2000_compact_rc5"),
(10000, "test_blocks_10000_compact_rc5"),
]:
persistent_blocks(count, f"{name}{version}.db", bt, seed=b"100")
end = time.monotonic()
KeyringWrapper.cleanup_shared_instance()
print(f"time to load test chains: {end - start:.2f}s")
if __name__ == "__main__":
import logging
logger = logging.getLogger()
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.WARNING)
asyncio.run(run_test_chain_benchmark())