#!/usr/bin/env python3 # bench-linux-0007.py # net/core/pktgen.c __pktgen_NN_threads: threads list + per-thread if_list walk. # Models O(T*D) → O(T+D) via list-scan inside a loop vs set/dict lookup. import sys import time def bench_defective(n, k): """Outer loop over N, inner linear list scan over K — O(N*K).""" pool = list(range(k)) items = list(range(n)) t0 = time.perf_counter() accepted = [] for x in items: if x in pool: # list __contains__ = O(K) accepted.append(x) # simulate nested work: scan pool to find position try: _ = pool.index(x) except ValueError: pass return time.perf_counter() - t0 def bench_fixed(n, k): """Outer loop over N, inner O(1) set/dict lookup.""" pool = list(range(k)) pool_set = set(pool) pool_pos = {v: i for i, v in enumerate(pool)} items = list(range(n)) t0 = time.perf_counter() accepted = [] for x in items: if x in pool_set: # O(1) accepted.append(x) _ = pool_pos.get(x) # O(1) return time.perf_counter() - t0 TRIALS = 3 CASES = [(50, 100), (100, 200), (200, 500), (500, 1000)] def run(): lines = [] header = "=== linux-0007: pktgen.c thread-dev list walk ===" print(header); lines.append(header) for n, k in CASES: df = min(bench_defective(n, k) for _ in range(TRIALS)) fx = min(bench_fixed(n, k) for _ in range(TRIALS)) speedup = (df / fx) if fx > 0 else float("inf") line = f"T={n:<5} D={k:<5}: defective={df*1000:.3f}ms fixed={fx*1000:.3f}ms speedup={speedup:.1f}x" print(line); lines.append(line); sys.stdout.flush() return lines if __name__ == "__main__": run()