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
This commit is contained in:
@@ -0,0 +1,410 @@
|
||||
# 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!**
|
||||
Reference in New Issue
Block a user