Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions benchmarks/batching.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
"""
Batching helpers for benchmarks.

Provides run_10, run_100, run_500, run_1000, run_5000 and their _exc (exception-catching) variants.
Import these helpers in all benchmark files to ensure consistency and DRY code.

Usage:
from benchmarks.batching import run_100, run_100_exc

benchmark(run_100, myfunc, arg1, arg2)
benchmark(run_100_exc, MyException, myfunc, arg1, arg2)
"""


def run_10(func, *args, **kwargs):
for _ in range(10):
func(*args, **kwargs)


def run_10_exc(exc, func, *args, **kwargs):
for _ in range(10):
try:
func(*args, **kwargs)
except exc:
pass


def run_100(func, *args, **kwargs):
for _ in range(100):
func(*args, **kwargs)


def run_100_exc(exc, func, *args, **kwargs):
for _ in range(100):
try:
func(*args, **kwargs)
except exc:
pass
else:
raise Exception(f"did not raise {exc}")


def run_500(func, *args, **kwargs):
for _ in range(500):
func(*args, **kwargs)


def run_500_exc(exc, func, *args, **kwargs):
for _ in range(500):
try:
func(*args, **kwargs)
except exc:
pass
else:
raise Exception(f"did not raise {exc}")


def run_1000(func, *args, **kwargs):
for _ in range(1000):
func(*args, **kwargs)


def run_1000_exc(exc, func, *args, **kwargs):
for _ in range(1000):
try:
func(*args, **kwargs)
except exc:
pass
else:
raise Exception(f"did not raise {exc}")


def run_5000(func, *args, **kwargs):
for _ in range(5000):
func(*args, **kwargs)


def run_5000_exc(exc, func, *args, **kwargs):
for _ in range(5000):
try:
func(*args, **kwargs)
except exc:
pass
else:
raise Exception(f"did not raise {exc}")
4 changes: 2 additions & 2 deletions benchmarks/ens/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
LABELS = [
"alice",
"bob",
"emoji\U0001F468\U0001F3FB", # emoji👨🏻
"emoji\U0001f468\U0001f3fb", # emoji👨🏻
"xn--fiqs8s",
"a" * 63,
"",
Expand All @@ -64,7 +64,7 @@
NAMES_VALIDITY = [
"alice.eth",
"bob.eth",
"emoji\U0001F468\U0001F3FB.eth", # emoji👨🏻.eth
"emoji\U0001f468\U0001f3fb.eth", # emoji👨🏻.eth
"subdomain.alice.eth",
"a" * 63 + ".eth",
"",
Expand Down
14 changes: 1 addition & 13 deletions benchmarks/ens/test_base_ens_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,19 +12,7 @@
PARENT_NAMES,
parametrize_names_full_coverage,
)


def run_10(func, *args, **kwargs):
for _ in range(10):
func(*args, **kwargs)


def run_10_exc(exc, func, *args, **kwargs):
for _ in range(10):
try:
func(*args, **kwargs)
except exc:
pass
from benchmarks.batching import run_10, run_10_exc


@pytest.mark.benchmark(group="BaseENS.labelhash")
Expand Down
16 changes: 4 additions & 12 deletions benchmarks/ens/test_ens_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,14 @@
import faster_ens.ens
import faster_ens.exceptions

import requests
from unittest.mock import patch
from web3 import HTTPProvider as Web3HTTPProvider
from faster_web3 import HTTPProvider as FasterWeb3HTTPProvider

import json
from benchmarks.ens.params import parametrize_names_full_coverage
from benchmarks.ens.fake_rpc import fake_json_rpc_response, FAKE_ENS_REGISTRY


def run_100(func, exc, *args, **kwargs):
for _ in range(100):
try:
func(*args, **kwargs)
except exc:
pass
from benchmarks.batching import run_100_exc


class FakeResponse:
Expand All @@ -36,7 +28,7 @@ def json(self):


def fake_send(*args, **kwargs):
request_data = json.loads(args[1].body)
request_data = json.loads(args[0].body)
return FakeResponse(fake_json_rpc_response(request_data))


Expand All @@ -47,7 +39,7 @@ def test_address(benchmark: BenchmarkFixture, name):
provider = Web3HTTPProvider("http://localhost:8545")
# Patch the ENS registry address to our fake one
ns = ens.ens.ENS(provider=provider, addr=FAKE_ENS_REGISTRY)
benchmark(run_100, ens.exceptions.ENSException, ns.address, name)
benchmark(run_100_exc, ens.exceptions.ENSException, ns.address, name)


@pytest.mark.benchmark(group="ENS.address")
Expand All @@ -56,4 +48,4 @@ def test_faster_address(benchmark: BenchmarkFixture, name):
with patch("requests.Session.send", side_effect=fake_send):
provider = FasterWeb3HTTPProvider("http://localhost:8545")
ns = faster_ens.ens.ENS(provider=provider, addr=FAKE_ENS_REGISTRY)
benchmark(run_100, faster_ens.exceptions.ENSException, ns.address, name)
benchmark(run_100_exc, faster_ens.exceptions.ENSException, ns.address, name)
48 changes: 27 additions & 21 deletions benchmarks/ens/test_normalization_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,40 @@
import faster_ens.exceptions

from benchmarks.ens.params import parametrize_names_full_coverage


def run_1000(func, exc, *args, **kwargs):
for _ in range(1000):
try:
func(*args, **kwargs)
except exc:
# Some cases are expected to raise (invalid names)
pass
from benchmarks.batching import run_1000, run_1000_exc


@pytest.mark.benchmark(group="normalize_name_ensip15")
@parametrize_names_full_coverage
def test_normalize_name_ensip15(benchmark: BenchmarkFixture, name):
benchmark(
run_1000,
ens.exceptions.InvalidName,
ens._normalization.normalize_name_ensip15,
name,
)
if name == "":
benchmark(
run_1000_exc,
ens.exceptions.InvalidName,
ens._normalization.normalize_name_ensip15,
name,
)
else:
benchmark(
run_1000,
ens._normalization.normalize_name_ensip15,
name,
)


@pytest.mark.benchmark(group="faster_normalize_name_ensip15")
@parametrize_names_full_coverage
def test_faster_normalize_name_ensip15(benchmark: BenchmarkFixture, name):
benchmark(
run_1000,
faster_ens.exceptions.InvalidName,
faster_ens._normalization.normalize_name_ensip15,
name,
)
if name == "":
benchmark(
run_1000_exc,
faster_ens.exceptions.InvalidName,
faster_ens._normalization.normalize_name_ensip15,
name,
)
else:
benchmark(
run_1000,
faster_ens._normalization.normalize_name_ensip15,
name,
)
19 changes: 1 addition & 18 deletions benchmarks/ens/test_utils_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,7 @@
LABEL_LISTS,
parametrize_names_full_coverage,
)


def run_10(func, *args, **kwargs):
for _ in range(10):
func(*args, **kwargs)


def run_10_exc(exc, func, *args, **kwargs):
for _ in range(10):
try:
func(*args, **kwargs)
except exc:
pass


def run_500(func, *args, **kwargs):
for _ in range(500):
func(*args, **kwargs)
from benchmarks.batching import run_10, run_10_exc, run_500


@pytest.mark.benchmark(group="normalize_name")
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/web3/_utils/params.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
"0x00000000000000000000000053d284357ec70ce289d6d64134dfac8e511c8a3d",
"0x000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e"
"0x000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e",
],
"data": "0x00000000000000000000000000000000000000000000000000000000000003e8",
"blockNumber": 12345678,
Expand Down
13 changes: 1 addition & 12 deletions benchmarks/web3/_utils/test_abi_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,7 @@

import web3._utils.abi
import faster_web3._utils.abi


# --- Helpers ---
def run_100(func, *args, **kwargs):
for _ in range(100):
func(*args, **kwargs)


def run_500(func, *args, **kwargs):
for _ in range(500):
func(*args, **kwargs)

from benchmarks.batching import run_100, run_500

# --- Type Checkers ---

Expand Down
19 changes: 3 additions & 16 deletions benchmarks/web3/_utils/test_blocks_benchmarks.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,10 @@

import web3._utils.blocks
import faster_web3._utils.blocks
from benchmarks.batching import run_100, run_100_exc

_object = object()


def run_100(func, *args, **kwargs):
for _ in range(100):
func(*args, **kwargs)


def run_100_exc(func, expected_exc, *args, **kwargs):
for _ in range(100):
try:
func(*args, **kwargs)
except expected_exc:
pass


# --- is_predefined_block_number ---

predefined_cases = [
Expand Down Expand Up @@ -57,7 +44,7 @@ def run_100_exc(func, expected_exc, *args, **kwargs):
def test_is_predefined_block_number(benchmark: BenchmarkFixture, value):
func = web3._utils.blocks.is_predefined_block_number
if value in (None, _object):
benchmark(run_100_exc, func, web3.exceptions.Web3TypeError, value)
benchmark(run_100_exc, web3.exceptions.Web3TypeError, func, value)
else:
benchmark(run_100, func, value)

Expand All @@ -67,7 +54,7 @@ def test_is_predefined_block_number(benchmark: BenchmarkFixture, value):
def test_faster_is_predefined_block_number(benchmark: BenchmarkFixture, value):
func = faster_web3._utils.blocks.is_predefined_block_number
if value in (None, _object):
benchmark(run_100_exc, func, faster_web3.exceptions.Web3TypeError, value)
benchmark(run_100_exc, faster_web3.exceptions.Web3TypeError, func, value)
else:
benchmark(run_100, func, value)

Expand Down
Loading
Loading