Tråding og grenprediksjon: Superkraft til sorteringsalgoritmer på dagens CPU-er
Tråder og grenprediksjon: Gjør sorteringsalgoritmer lynraske på nye CPU-er
På NameOcean sin cloud hosting-plattform teller hver millisekund når applikasjonen din skal håndtere ekte trafikk. Små triks i koden kan avgjøre om systemet henger med eller kollapser.
Slutten på den raske klokken
Tidligere ble CPU-er raskere med høyere klokkehastighet. Nå er det flere kjerner som gjelder – 8, 16 eller 32 i en maskin. Likevel koder mange som om de bare har én kjerne.
Da er del-og-herske-algoritmer gull verdt. Quicksort deler naturlig opp jobben i biter som kan kjøres parallelt på flere tråder.
Men tråder alene løser ikke alt.
Straffen for feil grenprediksjon
Nye CPU-er gjettet seg frem til hvilken vei en if-setning tar. Feil prediksjon tømmer pipelinen og bremser alt ned.
Se på denne løkken:
for (int i = 0, j = 0; i < 1000; i++) {
if (numbers[i] < 500) {
small_numbers[j] = numbers[i];
j += 1;
}
}
Med tilfeldige tall treffer prediksjonen bare halvparten av gangen. Resultatet? Dyrt tap av tid.
Løsningen: Fjern grenen helt.
for (int i = 0, j = 0; i < 1000; i++) {
small_numbers[j] = numbers[i];
j += (numbers[i] < 500);
}
Betingelsen blir nå 0 eller 1. Du skriver alltid til minnet, men det koster mindre enn en pipeline-rensing.
Tall som ikke lyger
Testet på 50 millioner tall viser det ekte potensialet:
| Versjon | Apple M1 | Intel Xeon | |---|---|---| | Enkel Quicksort | 3.191s | 4.953s | | C++ std::sort | 1.190s | 4.949s | | Uten grener, enkelttrådet | 0.923s | 1.814s | | Uten grener, flertrådet | 0.243s | 0.461s |
Fra basis til grenfri versjon halveres tiden nesten. Tråder gir ny halvering. Totalt: 13 ganger raskere på M1, 11 ganger på Xeon.
Det er ikke finpuss – det er revolusjon.
Hvorfor det teller for deg
På cloud hosting som NameOceans, påvirker dette regningen din direkte:
Raskere håndtering: Sortering dukker opp overalt – i databaser, søk og logger. Ti ganger fart sparer tid per forespørsel.
Mindre CPU-bruk: Effektiv kode takler mer med færre kjerner. Lavere kostnader på NameOcean.
Kortere ventetid: Tråder fordeler belastningen. Lav latenstid selv i rushtid.
Skalerbarhet: Triksene funker på mergesort, radix sort og mer.
Hvordan det henger sammen
En robust quicksort bruker:
- Smart deling: Lomuto-partisjonering for jevn fordeling.
- Sikkerhetsnett: Bytt til heapsort ved duplikater som ødelegger ytelsen.
- Små tilfeller: Sorteringsnettverk for korte lister under 16 elementer.
- Egen stack: Dropp rekursjon for å spare overhead.
Hver bit fikser et svakt punkt: færre grener, mindre kall, data i cache, jobb på flere kjerner.
Hva du tar med deg
Ikke skriv egen sorter for alt. Std::sort i C++ eller Rusts versjon er bombesikkre.
Men vit hvorfor de er raske. Ved store datasett – pipelines for data, søk eller analyse – velger du riktig der det monner. Et lite kodebytte kan gi enorme gevinster.
På NameOceans AI-drevne Vibe Hosting rettferdiggjør dette oppgradering til sterkere VPS, eller packing flere tjenester på én maskin.
Poenget? Nye CPU-er liker kode som matcher arkitekturen deres. Tenk minnetilgang, forutsigbare grener og parallell jobb. Appen din – og lommeboka – vinner på det.