Skip to content

Commit 8d3b9b3

Browse files
author
MPCoreDeveloper
committed
refactoring files and logic
1 parent 92ea877 commit 8d3b9b3

File tree

271 files changed

+32453
-10858
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

271 files changed

+32453
-10858
lines changed

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- Copyright (c) 2024 MPCoreDeveloper. Licensed under the MIT License. -->
1+
<!-- Copyright (c) 2026 MPCoreDeveloper. Licensed under the MIT License. -->
22
# Contributing to SharpCoreDB
33

44
We welcome contributions to SharpCoreDB! This document outlines the process for contributing.

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2024-2025 MPCoreDeveloper and GitHub Copilot
3+
Copyright (c) 2025-2026 MPCoreDeveloper and GitHub Copilot
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

LICENSE.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2025 Michel Posseth aka MPCoreDeveloper
3+
Copyright (c) 2026 Michel Posseth aka MPCoreDeveloper
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ See the comprehensive test suite:
337337
## Performance Benchmarks - Comprehensive Comparison 📊
338338

339339
**Test Environment**: Windows 11, Intel i7-10850H (6 cores), .NET 10, SSD
340-
**Date**: December 2024 | **Framework**: BenchmarkDotNet v0.14.0
340+
**Date**: December 2025 | **Framework**: BenchmarkDotNet v0.14.0
341341

342342
### 🎯 Quick Summary
343343

Lines changed: 350 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,350 @@
1+
# ?? CRITICAL: Performance Issues Identified - Action Plan
2+
3+
## ?? Benchmark Results Summary
4+
5+
**Status:** ? **COMPLETED** - 24 benchmarks executed successfully in 2min 30sec
6+
7+
**Critical Finding:** ?? SharpCoreDB is **~90x slower** than SQLite
8+
9+
---
10+
11+
## ?? CRITICAL ISSUES
12+
13+
### Issue #1: Write Performance Gap
14+
```
15+
SQLite Memory: 2.69 ms ? Baseline
16+
SharpCoreDB (Encrypted): 246.68 ms ?? 92x slower
17+
SharpCoreDB (No Encrypt): 261.28 ms ?? 97x slower
18+
```
19+
20+
**Impact:** CRITICAL - Makes SharpCoreDB unusable for most production scenarios
21+
22+
### Issue #2: Memory Usage
23+
```
24+
SQLite: 744 KB ? Efficient
25+
SharpCoreDB: 17.2 MB ?? 23x more memory
26+
```
27+
28+
**Impact:** HIGH - Limits scalability and increases GC pressure
29+
30+
---
31+
32+
## ? GOOD NEWS
33+
34+
### Encryption Performance: EXCELLENT! ??
35+
```
36+
Encryption overhead: -5.6% (encryption is FASTER!)
37+
```
38+
39+
**Insight:** Encryption has ZERO performance cost. Use it everywhere!
40+
41+
---
42+
43+
## ?? IMMEDIATE ACTION PLAN
44+
45+
### Step 1: Review HTML Reports (15 minutes)
46+
```powershell
47+
cd D:\source\repos\MPCoreDeveloper\SharpCoreDB\SharpCoreDB.Benchmarks\BenchmarkDotNet.Artifacts\results
48+
start ComparativeInsertBenchmarks-report.html
49+
start ComparativeSelectBenchmarks-report.html
50+
start ComparativeUpdateDeleteBenchmarks-report.html
51+
```
52+
53+
**Look for:**
54+
- [ ] GC statistics (Gen0/Gen1/Gen2 collections)
55+
- [ ] Memory allocation per operation
56+
- [ ] Performance distribution (outliers?)
57+
- [ ] Ratio columns (how much slower vs SQLite)
58+
59+
### Step 2: Check Configuration (5 minutes)
60+
Verify Group Commit WAL is enabled:
61+
62+
```csharp
63+
// In BenchmarkDatabaseHelper.cs, check:
64+
var dbConfig = new DatabaseConfig
65+
{
66+
UseGroupCommitWal = true, // ? Enabled
67+
WalMaxBatchSize = 100, // ? Set
68+
WalMaxBatchDelayMs = 10, // ? Set
69+
WalDurabilityMode = DurabilityMode.FullSync, // ?? May be too strict
70+
};
71+
```
72+
73+
**Action:** Try with `DurabilityMode.Async` to test if fsync is bottleneck
74+
75+
### Step 3: Profile INSERT Operations (30 minutes)
76+
Use dotTrace or PerfView to find the bottleneck:
77+
78+
```powershell
79+
# Run INSERT benchmarks only
80+
cd SharpCoreDB.Benchmarks
81+
dotnet run -c Release -- --inserts
82+
83+
# While running, attach dotTrace profiler
84+
# Capture CPU samples
85+
# Identify hottest method (likely the bottleneck)
86+
```
87+
88+
**Expected hotspots:**
89+
- WAL write/flush operations
90+
- Serialization (MessagePack)
91+
- Encryption (unlikely given results)
92+
- Lock acquisition
93+
- Page management
94+
95+
### Step 4: Quick Configuration Tests (30 minutes)
96+
97+
#### Test A: Async Durability (Remove fsync)
98+
```csharp
99+
// If fsync is the bottleneck, this should be MUCH faster
100+
WalDurabilityMode = DurabilityMode.Async
101+
```
102+
103+
#### Test B: Larger Batches
104+
```csharp
105+
WalMaxBatchSize = 500, // Up from 100
106+
WalMaxBatchDelayMs = 50 // Up from 10
107+
```
108+
109+
#### Test C: No Page Cache
110+
```csharp
111+
EnablePageCache = false // Test if cache is causing issues
112+
```
113+
114+
**Run quick test:**
115+
```powershell
116+
dotnet run -c Release -- --quick
117+
# Compare results with original
118+
```
119+
120+
### Step 5: Add Fair Comparison (1 hour)
121+
Current comparison is unfair:
122+
- SQLite **Memory mode** has NO disk I/O
123+
- SharpCoreDB is doing full fsync()
124+
125+
**Add benchmark:**
126+
```csharp
127+
[Benchmark]
128+
public void SQLite_File_WAL_FullSync()
129+
{
130+
// SQLite with file mode + WAL + full fsync
131+
// This will be MUCH slower than memory mode
132+
// Fair comparison with SharpCoreDB
133+
}
134+
```
135+
136+
---
137+
138+
## ?? INVESTIGATION HYPOTHESES
139+
140+
### Hypothesis #1: fsync() is the bottleneck (MOST LIKELY)
141+
**Test:** Set `WalDurabilityMode = DurabilityMode.Async`
142+
**Expected:** 10-50x faster if true
143+
**Probability:** 80%
144+
145+
**Why likely:**
146+
- SQLite memory mode has no fsync at all
147+
- FullSync calls fsync on every commit
148+
- fsync() can take 5-20ms on spinning disks, 0.1-1ms on SSD
149+
150+
### Hypothesis #2: Batch operations aren't batching
151+
**Test:** Add logging to see actual batch sizes
152+
**Expected:** batch size = 1 if true
153+
**Probability:** 60%
154+
155+
**Check:**
156+
```csharp
157+
// In WAL code, add logging:
158+
Console.WriteLine($"Batch size: {entries.Count}");
159+
```
160+
161+
### Hypothesis #3: Serialization is slow
162+
**Test:** Profile time in MessagePack serialization
163+
**Expected:** >30% of time if true
164+
**Probability:** 40%
165+
166+
### Hypothesis #4: Lock contention
167+
**Test:** Profile lock wait time
168+
**Expected:** >20% wait time if true
169+
**Probability:** 30%
170+
171+
### Hypothesis #5: Page cache thrashing
172+
**Test:** Disable page cache or increase size to 10,000
173+
**Expected:** Significant change if true
174+
**Probability:** 20%
175+
176+
---
177+
178+
## ?? CHECKLIST
179+
180+
### Today (2 hours)
181+
- [ ] Open and review all HTML reports
182+
- [ ] Check GC statistics
183+
- [ ] Test with `DurabilityMode.Async`
184+
- [ ] Document results
185+
- [ ] Share findings with team
186+
187+
### This Week (1 day)
188+
- [ ] Profile INSERT operations with dotTrace
189+
- [ ] Identify primary bottleneck
190+
- [ ] Test configuration changes
191+
- [ ] Add SQLite File+WAL benchmark
192+
- [ ] Create optimization plan
193+
194+
### Next Week (3 days)
195+
- [ ] Implement critical fix
196+
- [ ] Re-run benchmarks
197+
- [ ] Verify improvement
198+
- [ ] Profile memory allocations
199+
- [ ] Optimize hot path
200+
201+
### Next Sprint (2 weeks)
202+
- [ ] Achieve 10x performance improvement
203+
- [ ] Reduce memory to < 5MB
204+
- [ ] Add component benchmarks
205+
- [ ] Document performance characteristics
206+
- [ ] Set up regression tests
207+
208+
---
209+
210+
## ?? SUCCESS TARGETS
211+
212+
| Metric | Current | Target | Stretch Goal |
213+
|--------|---------|--------|--------------|
214+
| INSERT (1K) | 247 ms | 25 ms | 5 ms |
215+
| Memory | 17 MB | 2 MB | 1 MB |
216+
| Point Query | ? | 50 ?s | 25 ?s |
217+
| Encryption | -5.6% | <10% | ? Done! |
218+
219+
---
220+
221+
## ?? QUICK WINS TO TRY
222+
223+
### Win #1: Test Async Durability
224+
```powershell
225+
# Edit BenchmarkDatabaseHelper.cs, line ~50
226+
# Change: DurabilityMode.FullSync
227+
# To: DurabilityMode.Async
228+
229+
dotnet run -c Release -- --quick
230+
231+
# If MUCH faster, fsync is the bottleneck
232+
```
233+
234+
### Win #2: Increase Batch Size
235+
```csharp
236+
WalMaxBatchSize = 500, // 5x larger
237+
WalMaxBatchDelayMs = 50 // 5x longer
238+
```
239+
240+
### Win #3: Compare with SQLite File Mode
241+
Add fair comparison benchmark to see realistic gap.
242+
243+
---
244+
245+
## ?? EXPECTED OUTCOMES
246+
247+
### If fsync is the bottleneck (80% likely)
248+
```
249+
Before: SharpCoreDB 247ms, SQLite Memory 2.69ms (92x slower)
250+
After: SharpCoreDB 5-10ms, SQLite File+WAL 5-15ms (similar!)
251+
```
252+
253+
**This would be EXCELLENT news!** It means:
254+
- Performance gap is due to unfair comparison
255+
- SharpCoreDB is actually competitive
256+
- Just need to tune durability settings for use case
257+
258+
### If serialization is the bottleneck (40% likely)
259+
```
260+
Profile shows: 30-50% time in MessagePack
261+
Solution: Optimize serialization
262+
Expected improvement: 1.5-2x faster
263+
```
264+
265+
### If batching isn't working (60% likely)
266+
```
267+
Log shows: Batch size = 1 (not batching!)
268+
Solution: Fix batch accumulation logic
269+
Expected improvement: 10-50x faster
270+
```
271+
272+
---
273+
274+
## ?? NEXT IMMEDIATE STEPS
275+
276+
### Right Now (5 minutes)
277+
1. Open HTML reports
278+
2. Check GC stats
279+
3. Share analysis with team
280+
281+
### Today (30 minutes)
282+
1. Test with `DurabilityMode.Async`
283+
2. Document result
284+
3. If faster, investigate fsync optimization
285+
286+
### This Week (2 hours)
287+
1. Profile with dotTrace
288+
2. Find bottleneck
289+
3. Implement fix
290+
4. Re-benchmark
291+
292+
---
293+
294+
## ?? RESOURCES
295+
296+
**HTML Reports:**
297+
```
298+
D:\source\repos\MPCoreDeveloper\SharpCoreDB\SharpCoreDB.Benchmarks\BenchmarkDotNet.Artifacts\results\
299+
```
300+
301+
**Analysis Document:**
302+
```
303+
BENCHMARK_RESULTS_ANALYSIS.md (this file)
304+
```
305+
306+
**Configuration File:**
307+
```
308+
SharpCoreDB.Benchmarks\Infrastructure\BenchmarkDatabaseHelper.cs
309+
```
310+
311+
**Quick Test:**
312+
```powershell
313+
cd SharpCoreDB.Benchmarks
314+
dotnet run -c Release -- --quick
315+
```
316+
317+
---
318+
319+
## ?? KEY LEARNINGS
320+
321+
### ? What's Working
322+
1. Encryption has ZERO cost (amazing!)
323+
2. Benchmark infrastructure is solid
324+
3. All tests complete successfully
325+
4. Good statistical analysis
326+
327+
### ?? What Needs Work
328+
1. Write performance (90x slower)
329+
2. Memory usage (23x more)
330+
3. Fair comparison needed
331+
4. Optimization required
332+
333+
### ?? Focus Areas
334+
1. **Priority #1:** Find and fix write bottleneck
335+
2. **Priority #2:** Reduce memory usage
336+
3. **Priority #3:** Fair SQLite comparison
337+
4. **Priority #4:** Optimize hot paths
338+
339+
---
340+
341+
**Status:** ?? **CRITICAL - Action Required**
342+
**Next Action:** Test with `DurabilityMode.Async` (5 minutes)
343+
**Expected:** 10-50x improvement if fsync is bottleneck
344+
**Timeline:** Today
345+
346+
---
347+
348+
?? **The benchmarks revealed critical issues, but they're likely fixable!**
349+
?? **Start with the quick wins above to identify the root cause.**
350+
?? **Let's optimize!**

0 commit comments

Comments
 (0)