Estimate effective performance gain from hyperthreading versus physical core count.
Hyper-Threading / SMT exposes two logical CPUs per physical core, but they share the core's execution units, caches and pipeline — so the OS-visible 'double the cores' from `nproc` overstates real throughput gain. The realistic effective core count models HT as a percentage boost over physical cores (not a full doubling), and that gain factor varies significantly by workload: heavily CPU-bound code with saturated execution units gains little from a sibling thread, while workloads with frequent stalls (cache misses, branch mispredicts, I/O waits) let the sibling thread productively fill otherwise-wasted cycles.
Effective core count
effective_cores = physical_cores × (1 + HT_gain%)
Because sibling logical CPUs on the same physical core share execution units, cache and memory bandwidth rather than doubling them — a benchmark showing 2 logical cores delivering 2× a single core's throughput is the exception, not the rule. Realistic HT gains of 15-30% mean 16 logical cores from 8 physical cores behave closer to 9.2-10.4 'effective' cores for most workloads.
Rarely beneficial for throughput — HT almost always adds some net gain even for CPU-bound work, just a smaller one. It's occasionally disabled for security isolation (mitigating certain side-channel/speculative-execution vulnerabilities between sibling threads) or for latency-critical workloads where predictable single-thread performance matters more than aggregate throughput.
`lscpu -e` lists each logical CPU with its CORE column, showing which logical CPUs are siblings on the same physical core — useful for CPU affinity decisions like avoiding pinning two unrelated latency-sensitive threads onto sibling logical CPUs of the same core.