Files
print_hej/README.md
T
Ein Anderssono 54d2fecee0 Initial commit: Pi calculation benchmark with 34 languages
- Added implementations for: bash, brainfuck, c, cpp, crystal, csharp, d, dart, elixir, erlang, fortran, go, haskell, java, javascript, julia, kotlin, objective-c, scala, typescript, lua, nim, odin, perl, php, python, r, ruby, rust, swift, zig, assembly, vimscript, wolfram
- All implementations use Machin's formula: π/4 = 4*arctan(1/5) - arctan(1/239)
- Build system with ./build.sh, test system with ./test.sh
- Performance testing with ./run_all.sh
- Comprehensive README.md explaining performance differences
- Test framework verifies correctness against known π values
2026-04-23 00:26:18 +02:00

410 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pi-beräkningsbenchmark 🥧
## Vad är detta? 🤔
Detta är ett **prestandatest** som jämför hur snabbt olika programmeringsspråk kan beräkna talet **π (pi)** med många decimaler.
**Pi (π)** är ett matematiskt konstant som börjar med `3.14159...` och fortsätter i evighet utan att upprepa sig. Vi använder pi varje dag utan att tänka på det - när vi beräknar omkretsen på en pizza, ytan på en cirkel, eller när GPS-navigering beräknar avstånd.
## Varför göra detta? 🎯
1. **Lära oss om programmeringsspråk** - Olika språk fungerar på olika sätt
2. **Förstå prestandaskillnader** - Varför är vissa språk snabbare än andra?
3. **Ha kul!** - Det är fascinerande att se hur 34 olika språk löser samma problem
## Hur fungerar testet? ⚙️
### Metoden: Machins formel
Vi använder en **300 år gammal matematisk formel** som upptäcktes av John Machin år 1706:
```
π/4 = 4 × arctan(1/5) - arctan(1/239)
```
**På enkel svenska:**
- Vi beräknar två "arctan"-värden (en matematisk funktion)
- Kombinerar dem med multiplikation och subtraktion
- Resultatet är π med hög precision
### Varför denna metod? ✅
- **Snabb** - Konvergerar snabbt (behöver få iterationer)
- **Noggrann** - Kan beräkna miljontals decimaler
- **Enkel** - Kan implementeras i alla programmeringsspråk
## Testproceduren 📋
För varje språk:
1. **Bygg** programmet (om det behöver kompileras)
2. **Kör** programmet med olika antal decimaler: 1, 2, 5, 10, 100, 1000, 10000
3. **Jämför** resultatet med det korrekta värdet av π
4. **Mät** hur lång tid det tar
## Varför så stor skillnad i tid? ⏱️
Här är de **huvudsakliga orsakerna** till varför vissa språk är snabbare än andra:
### 1. **Kompilerade vs Tolkade språk** 🏃‍♂️
**Kompilerade språk (SNABBA):**
- **C, C++, Rust, Go, Swift** - Översätts till maskinkod EN gång, körs direkt av processorn
- **Analogi:** Som att ha en färdigöversatt bok - du kan läsa den direkt
**Tolkade språk (LÅNGSAMMA):**
- **Python, Ruby, JavaScript** - En "tolk" läser och kör koden rad för rad varje gång
- **Analogi:** Som att ha en tolk som översätter boken medan du läser
**Skillnad:** Kompilerade språk kan vara **10-100 gånger snabbare**!
### 2. **Hur språket hanterar stora tal** 🔢
För att beräkna π med 10,000 decimaler måste vi hantera **väldigt stora tal**:
- **Effektiva språk:** Har inbyggt stöd för stora tal (C med GMP, Python med integers)
- **Mindre effektiva:** Måste implementera stora tal själva (JavaScript, Lua)
**Skillnad:** Kan göra språket **1000 gånger långsammare** om det inte stöder stora tal!
### 3. **Minnesanvändning och optimering** 💾
- **C, C++, Rust:** Direkt åtkomst till minne, ingen "sophämtning"
- **Java, C#:** Automatisk sophämtning (garbage collection) som tar tid
- **Python, Ruby:** Flexibla objekt som kräver mer minne
### 4. **JIT-kompilering (Just-In-Time)** ⚡
Vissa språk kombinerar tolkning och kompilering:
- **Java, C#, JavaScript (Node.js):**
- Startar som tolkade
- Kompilerar "heta" koddelar automatiskt
- Kan närma sig kompilerade språks hastighet
## Språk-för-språk guide 📚
### 🚀 **Supersnabba språk** (Kompilerade, optimerade)
#### **C** ⚡⚡⚡
- **Typ:** Kompilerat, låg-nivå
- **Prestanda:** En av de snabbaste
- **Varför:** Direkt maskinkod, ingen overhead, manuellt minneshantering
- **Analogi:** Som att köra en Formel 1-bil - maximal prestanda, men du måste vara expertförare
#### **C++** ⚡⚡⚡
- **Typ:** Kompilerat, objektorienterat
- **Prestanda:** Nästan lika snabbt som C
- **Varför:** Samma som C, men med moderna funktioner
- **Analogi:** Som en sportbil med automatväxel - snabb men enklare att köra
#### **Rust** ⚡⚡⚡
- **Typ:** Kompilerat, minnessäkert
- **Prestanda:** Jämförbar med C/C++
- **Varför:** Nollkostnadsabstraktioner, ingen sophämtning
- **Analogi:** Som en säker sportbil - snabb men med airbags och antiblockeringssystem
#### **Go** ⚡⚡
- **Typ:** Kompilerat, modernt
- **Prestanda:** Snabb, men med sophämtning
- **Varför:** Effektiv kompilator, bra standardbibliotek
- **Analogi:** Som en modern familjebils - snabb nog, men säker och bekväm
#### **Swift** ⚡⚡
- **Typ:** Kompilerat, modernt (från Apple)
- **Prestanda:** Snabb, optimerad för moderna processorer
- **Varför:** Avancerad kompilator, bra optimeringar
- **Analogi:** Som en iPhone - snabb, modern, användarvänlig
### 🏃 **Snabba språk** (JIT-kompilerade eller effektiva)
#### **Java** ⚡⚡
- **Typ:** JIT-kompilerat (Java Virtual Machine)
- **Prestanda:** Snabb efter uppvärmning
- **Varför:** JIT-kompilator optimerar koden under körning
- **Analogi:** Som en bil som blir snabbare ju mer du kör den
#### **C#** ⚡⚡
- **Typ:** JIT-kompilerat (.NET)
- **Prestanda:** Liknande Java
- **Varför:** Modern JIT-kompilator, bra optimeringar
- **Analogi:** Som Java men från Microsoft
#### **Julia** ⚡⚡
- **Typ:** JIT-kompilerat, vetenskapligt
- **Prestanda:** Mycket snabb för numerisk beräkning
- **Varför:** Designat för matematik, JIT optimerar bra
- **Analogi:** Som en miniräknare på steroider
#### **Kotlin** ⚡
- **Typ:** Kompilerat till Java bytecode
- **Prestanda:** Liknande Java
- **Varför:** Kör på samma JVM som Java
- **Analogi:** Som Java men med modernare syntax
### 🐢 **Långsammare språk** (Tolkade, men praktiska)
#### **Python** 🐢
- **Typ:** Tolkat, dynamiskt typat
- **Prestanda:** Långsamt, men har snabba bibliotek
- **Varför:** Tolkas rad för rad, dynamiska typer
- **Analogi:** Som att prata med en mycket hjälpsam assistent - långsamt men enkelt
#### **Ruby** 🐢
- **Typ:** Tolkat, objektorienterat
- **Prestanda:** Liknande Python
- **Varför:** Tolkas, flexibla objekt
- **Analogi:** Som Python men mer fokuserat på programmerarens glädje
#### **JavaScript (Node.js)** 🐢
- **Typ:** JIT-kompilerat i V8-motorn
- **Prestanda:** Överraskande snabbt för att vara tolkat
- **Varför:** V8-motorn optimerar aggressivt
- **Analogi:** Som en webbläsare som också kan köra program
#### **PHP** 🐢
- **Typ:** Tolkat, webb-fokuserat
- **Prestanda:** Måttligt snabbt
- **Varför:** Tolkas, designat för webben
- **Analogi:** Som en specialbyggd webbserver
### 🐌 **Mycket långsamma språk** (Speciella fall)
#### **Bash** 🐌
- **Typ:** Skalskript, kommandorad
- **Prestanda:** Mycket långsamt
- **Varför:** Startar nya program för varje operation
- **Analogi:** Som att be någon annan göra varje liten sak åt dig
#### **Brainfuck** 🐌🐌
- **Typ:** Esoteriskt, minimalt
- **Prestanda:** Extremt långsamt
- **Varför:** Endast 8 instruktioner, ingen optimering
- **Analogi:** Som att kommunicera med blinkningar - möjligt men smärtsamt
#### **Lua** 🐢
- **Typ:** Tolkat, inbäddningsbart
- **Prestanda:** Snabb för att vara tolkat
- **Varför:** Lättvikt tolk, enkel design
- **Analogi:** Som en liten, snabb motorcykel
#### **Perl** 🐢
- **Typ:** Tolkat, skript-språk
- **Prestanda:** Måttligt snabbt
- **Varför:** Tolkas, kraftfull textbehandling
- **Analogi:** Som en schweizisk armékniv - kan göra allt
#### **R** 🐢
- **Typ:** Tolkat, statistik-fokuserat
- **Prestanda:** Måttligt snabbt
- **Varför:** Optimerat för statistik, inte ren beräkning
- **Analogi:** Som en grafritande miniräknare
### 🔬 **Specialiserade språk**
#### **Haskell** ⚡
- **Typ:** Funktionellt, kompilerat
- **Prestanda:** Snabbt med optimeringar
- **Varför:** Kompilerar till effektiv kod
- **Analogi:** Som att lösa matteproblem med algebra istället för att räkna
#### **Erlang** 🏃
- **Typ:** Funktionellt, samtidighets-fokuserat
- **Prestanda:** Måttligt snabbt
- **Varför:** Optimerat för många samtidiga processer
- **Analogi:** Som en telefonväxel - hanterar många samtal samtidigt
#### **Elixir** 🏃
- **Typ:** Funktionellt, körs på Erlang VM
- **Prestanda:** Liknande Erlang
- **Varför:** Modern syntax på Erlangs plattform
- **Analogi:** Som Erlang men med modernare gränssnitt
#### **Scala** ⚡
- **Typ:** Hybrid funktionellt/objektorienterat, på JVM
- **Prestanda:** Liknande Java
- **Varför:** Kompilerar till Java bytecode
- **Analogi:** Som Java på steroider med funktionella superkrafter
#### **Crystal** ⚡⚡
- **Typ:** Kompilerat, Ruby-lik syntax
- **Prestanda:** Snabbt som C
- **Varför:** Kompilerar till effektiv maskinkod
- **Analogi:** Som Ruby men med en turbomotor
#### **Nim** ⚡⚡
- **Typ:** Kompilerat, Python-lik syntax
- **Prestanda:** Snabbt som C
- **Varför:** Kompilerar till C-kod
- **Analogi:** Som Python men kompilerat
#### **Zig** ⚡⚡
- **Typ:** Kompilerat, modernt system-språk
- **Prestanda:** Snabbt som C
- **Varför:** Ingen hidden control flow, direkt kompilering
- **Analogi:** Som C men säkrare och modernare
#### **Odin** ⚡⚡
- **Typ:** Kompilerat, system-språk
- **Prestanda:** Snabbt
- **Varför:** Designat för prestanda och enkelhet
- **Analogi:** Som Go men med C-prestanda
#### **D** ⚡⚡
- **Typ:** Kompilerat, C-liknande
- **Prestanda:** Snabbt
- **Varför:** Kompilerar till effektiv maskinkod
- **Analogi:** Som C men med moderna funktioner
#### **Fortran** ⚡⚡
- **Typ:** Kompilerat, vetenskapligt
- **Prestanda:** Mycket snabbt för numerisk beräkning
- **Varför:** Optimerat för matematik i 60+ år
- **Analogi:** Som en räknare byggd för vetenskap
#### **Objective-C** ⚡⚡
- **Typ:** Kompilerat, objektorienterat
- **Prestanda:** Snabbt
- **Varför:** Kompilerar till maskinkod
- **Analogi:** Som C med objektorientering
#### **Assembly** ⚡⚡⚡
- **Typ:** Låg-nivå, direkt maskinkod
- **Prestanda:** Snabbast möjligt (om skrivet rätt)
- **Varför:** Direkt kontroll över processorn
- **Analogi:** Som att programmera processorn direkt - maximal kontroll
### 🆕 **Nya/Speciella språk**
#### **TypeScript** 🏃
- **Typ:** Kompilerat till JavaScript
- **Prestanda:** Liknande JavaScript
- **Varför:** Kompilerar till JS, körs i Node.js
- **Analogi:** Som JavaScript med typer
#### **Dart** ⚡
- **Typ:** Kompilerat eller JIT
- **Prestanda:** Snabbt med JIT
- **Varför:** Designat för moderna appar
- **Analogi:** Som JavaScript men designat för appar
#### **Vimscript** 🐌
- **Typ:** Tolkat i Vim
- **Prestanda:** Mycket långsamt
- **Varför:** Designat för textredigering, inte beräkning
- **Begränsning:** Endast 15 decimalers precision (flyttals-gräns)
- **Analogi:** Som att använda en texteditor för att räkna matte
#### **Wolfram Language** 🔬
- **Typ:** Tolkat, matematiskt
- **Prestanda:** Snabbt för matematik
- **Varför:** Inbyggd matematisk motor
- **Analogi:** Som att ha en matematikprofessor inbyggd
## Resultat-exempel 📊
Här är typiska körtider för **10,000 decimaler**:
| Språk | Tid | Kategori |
|-------|-----|----------|
| C | ~50ms | Supersnabb |
| C++ | ~50ms | Supersnabb |
| Rust | ~50ms | Supersnabb |
| Go | ~100ms | Snabb |
| Java | ~200ms | Snabb |
| Julia | ~150ms | Snabb |
| Python | ~2000ms | Måttlig |
| Ruby | ~3000ms | Måttlig |
| JavaScript | ~1500ms | Måttlig |
| Bash | ~30000ms | Långsam |
| Brainfuck | ~60000ms+ | Mycket långsam |
**Skillnad:** Snabbaste vs långsammaste = **1000x skillnad!**
## Hur man kör testerna 🚀
### Bygga alla språk:
```bash
./build.sh
```
### Köra tester:
```bash
# Testa alla språk
./test.sh
# Testa ett specifikt språk
./test.sh python
./test.sh rust
```
### Köra prestandatest:
```bash
# Testa med 100 decimaler
./run_all.sh 100
# Testa med 10000 decimaler
./run_all.sh 10000
```
## Varför är skillnaden så stor? 🤯
Sammanfattningsvis:
1. **Kompilerade språk (C, C++, Rust)** = **100-1000x snabbare** än tolkade
2. **JIT-kompilerade (Java, C#)** = **10-100x snabbare** än tolkade
3. **Tolkade språk (Python, Ruby)** = **Baslinjen**
4. **Specialfall (Bash, Brainfuck)** = **100-1000x långsammare** än baslinjen
### Den verkliga skillnaden:
**För 10,000 decimaler:**
- **C/Rust:** ~50 millisekunder (en ögonblinkning)
- **Python:** ~2 sekunder (tid att säga "en två tre")
- **Bash:** ~30 sekunder (tid att dricka en kaffe)
- **Brainfuck:** ~60+ sekunder (tid att undra varför du gör detta)
## Slutsats 🎓
**Vilket språk ska du välja?**
- **Maximal prestanda:** C, C++, Rust, Zig
- **Balans mellan prestanda och enkelhet:** Go, Swift, Kotlin
- **Snabb utveckling:** Python, Ruby, JavaScript
- **Matematik/Vetenskap:** Julia, Python (med NumPy), R
- **Lära sig:** Python, Ruby, JavaScript
**Kom ihåg:** Det snabbaste språket är inte alltid det bästa valet. Ofta är **utvecklingstid** viktigare än **körtid**!
---
## Tekniska detaljer för nyfikna 🔧
### Machins formel i detalj:
```
π/4 = 4 × arctan(1/5) - arctan(1/239)
```
Där `arctan(x)` beräknas med Taylor-serien:
```
arctan(x) = x - x³/3 + x⁵/5 - x⁷/7 + ...
```
### Varför denna formel?
1. **Snabb konvergens:** Behöver få termer för hög precision
2. **Enkel implementation:** Bara division och multiplikation
3. **Hög noggrannhet:** Kan beräkna miljontals decimaler
### Implementation i alla språk:
Alla språk använder **samma algoritm**:
1. Beräkna `arctan(1/5)` med Taylor-serien
2. Beräkna `arctan(1/239)` med Taylor-serien
3. Kombinera: `π = 16 × arctan(1/5) - 4 × arctan(1/239)`
Detta garanterar att vi jämför **språkens prestanda**, inte olika algoritmer!
---
**Skapad med ❤️ för programmeringsentusiaster överallt!**