5 ms·
> it's rare for a branch result to be random How rare, though? QuickSort has fundamentally unpredictable branches, and it’s a pretty widely used algorithm. Bi
by branko_d 2y ago
> it's rare for a branch result to be random
How rare, though?
QuickSort has fundamentally unpredictable branches, and it’s a pretty widely used algorithm. Binary search, B-trees also come to mind.
- kllrnohj 2y agoBinary searching is quite slow and should be used sparingly but not because of branch misprediction necessarily but because of memory stalls - you're almost always guaranteed to have a cache miss during the search. Similarly for B-trees it's going to be memory stalls that you're probably more focused on addressing, not branch mispredicts.
- emn13 2y agoThis probably depends on the size of the area to be searched, and just how hot that region is. After all, if it's fairly small, there won't be any cache misses, and the data structure does use less memory than a typical hash table, which is itself an advantage.
- orf 2y agoIf the size of the data is small, a linear search through a contiguous array is going to be far faster than anything more complex.
- emn13 2y agoYep; though we'd have to test a few cases to figure out what the cutoffs are here, and if there's any middle ground left for a divide-and-conquer strategy. It's also definitely going to depend on the cost of the hash function and comparison function - for something like strings, where those can be quite expensive, binary search probably has a better chance of applicability than for guid's say.
- kllrnohj 2y agoFor things with non-trivial comparison functions you're all but certainly better off with those in something else like a hashmap. After all, the more expensive the compare, the more expensive the sort & reordering that a binary search requires. And then for trivial comparison objects, binary searching is still slower even at "huge" sizes like 10,000. It's really hard to find a good use of binary searching an array on modern CPUs.
- eru 2y agoWell, it depends on how expensive your comparison is compared to a cache miss.
- barrkel 2y agoB-trees are cache friendly, spending more time doing linear scans at each level to keep the tree shallow, and thus indirection less frequent. They're designed for high latency indirection - loading pages from spinning rust.
- eyegor 2y agoAlso happens to be why quicksort loses to almost anything else on small arrays, even bubble sort
- jayd16 2y agoLoops are usually much more one way than the other.
- sjburt 2y agoIn benchmarks, branch predictors guess correctly 90-95% of the time.
- gpderetta 2y agoQsort can be implemented branchless by converting the branch into a data dependency.
- saagarjha 2y agoMost code with branches is not “algorithms”. (Bear with me.) It’s simple loops and function calls and vtable indirection. Those can be predicted with very high accuracy, and loops in particular by their very nature dominate execution. For every unpredictable branch in your quicksort there are several very predictable branches that do things like check bounds, the recursion base case, and return address.