Skip to content

Commit c70bea4

Browse files
authored
Merge pull request #8 from scottgal/feature/v4.5-audio-playback
Feature/v4.5 audio playback
2 parents 1593bde + 618294d commit c70bea4

51 files changed

Lines changed: 2064 additions & 321 deletions

Some content is hidden

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

.claude/settings.local.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,15 @@
147147
"Bash(git log:*)",
148148
"Bash(git rm:*)",
149149
"Bash(git checkout:*)",
150-
"Bash(ffplay:*)"
150+
"Bash(ffplay:*)",
151+
"WebFetch(domain:humanfactors.arc.nasa.gov)",
152+
"WebFetch(domain:developer.nvidia.com)",
153+
"WebFetch(domain:bartwronski.com)",
154+
"WebFetch(domain:surma.dev)",
155+
"Bash(\"E:\\\\source\\\\vectorascii\\\\ConsoleImage\\\\test-publish\\\\consoleimage.exe\" tools --verify)",
156+
"Bash(git stash:*)",
157+
"WebFetch(domain:news.ycombinator.com)",
158+
"Bash(git status:*)"
151159
]
152160
},
153161
"enableAllProjectMcpServers": true,

ConsoleImage.Benchmarks/BrailleRendererBenchmarks.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ namespace ConsoleImage.Benchmarks;
1212
/// Run with: dotnet run -c Release -- --filter *Braille*
1313
/// </summary>
1414
[MemoryDiagnoser]
15-
[SimpleJob(RuntimeMoniker.Net90)]
15+
[SimpleJob]
1616
public class BrailleRendererBenchmarks
1717
{
1818
private Image<Rgba32> _largeImage = null!;
@@ -130,7 +130,7 @@ public string RenderSmall_NoColor()
130130
/// Benchmarks for brightness calculation optimizations.
131131
/// </summary>
132132
[MemoryDiagnoser]
133-
[SimpleJob(RuntimeMoniker.Net90)]
133+
[SimpleJob]
134134
public class BrightnessCalculationBenchmarks
135135
{
136136
private float[] _largeBuffer = null!;
@@ -226,7 +226,7 @@ private static (float min, float max) GetMinMaxUnrolled(float[] buffer)
226226
/// Benchmarks for ANSI escape sequence generation.
227227
/// </summary>
228228
[MemoryDiagnoser]
229-
[SimpleJob(RuntimeMoniker.Net90)]
229+
[SimpleJob]
230230
public class AnsiEscapeBenchmarks
231231
{
232232
private static readonly string[] GreyscaleEscapes = InitGreyscale();
Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,200 @@
1+
using BenchmarkDotNet.Attributes;
2+
using ConsoleImage.Core;
3+
4+
namespace ConsoleImage.Benchmarks;
5+
6+
/// <summary>
7+
/// Benchmarks for BrailleCharacterMap shape vector matching.
8+
/// Run with: dotnet run -c Release -- --filter *ShapeMatching*
9+
/// </summary>
10+
[MemoryDiagnoser]
11+
[SimpleJob]
12+
public class BrailleShapeMatchingBenchmarks
13+
{
14+
private BrailleCharacterMap _brailleMap = null!;
15+
private float[][] _randomVectors = null!;
16+
private float[][] _sparseVectors = null!;
17+
private float[][] _denseVectors = null!;
18+
19+
[GlobalSetup]
20+
public void Setup()
21+
{
22+
_brailleMap = new BrailleCharacterMap();
23+
24+
var random = new Random(42);
25+
26+
// Random 8D vectors (covers full range)
27+
_randomVectors = new float[1000][];
28+
for (var i = 0; i < _randomVectors.Length; i++)
29+
{
30+
_randomVectors[i] = new float[8];
31+
for (var j = 0; j < 8; j++)
32+
_randomVectors[i][j] = (float)random.NextDouble();
33+
}
34+
35+
// Sparse vectors (mostly 0, few dots on - like thin lines)
36+
_sparseVectors = new float[1000][];
37+
for (var i = 0; i < _sparseVectors.Length; i++)
38+
{
39+
_sparseVectors[i] = new float[8];
40+
for (var j = 0; j < 8; j++)
41+
_sparseVectors[i][j] = random.NextDouble() < 0.25 ? (float)random.NextDouble() : 0f;
42+
}
43+
44+
// Dense vectors (mostly 1, few dots off - like filled areas)
45+
_denseVectors = new float[1000][];
46+
for (var i = 0; i < _denseVectors.Length; i++)
47+
{
48+
_denseVectors[i] = new float[8];
49+
for (var j = 0; j < 8; j++)
50+
_denseVectors[i][j] = random.NextDouble() < 0.25 ? (float)random.NextDouble() : 1f;
51+
}
52+
}
53+
54+
[Benchmark(Baseline = true)]
55+
public char FindBestMatch_Random_Cached()
56+
{
57+
char result = ' ';
58+
for (var i = 0; i < _randomVectors.Length; i++)
59+
result = _brailleMap.FindBestMatch(_randomVectors[i]);
60+
return result;
61+
}
62+
63+
[Benchmark]
64+
public char FindBestMatch_Random_BruteForce()
65+
{
66+
char result = ' ';
67+
for (var i = 0; i < _randomVectors.Length; i++)
68+
result = _brailleMap.FindBestMatchBruteForce(_randomVectors[i]);
69+
return result;
70+
}
71+
72+
[Benchmark]
73+
public char FindBestMatch_Sparse()
74+
{
75+
char result = ' ';
76+
for (var i = 0; i < _sparseVectors.Length; i++)
77+
result = _brailleMap.FindBestMatch(_sparseVectors[i]);
78+
return result;
79+
}
80+
81+
[Benchmark]
82+
public char FindBestMatch_Dense()
83+
{
84+
char result = ' ';
85+
for (var i = 0; i < _denseVectors.Length; i++)
86+
result = _brailleMap.FindBestMatch(_denseVectors[i]);
87+
return result;
88+
}
89+
}
90+
91+
/// <summary>
92+
/// Benchmarks for ASCII CharacterMap with different character set sizes.
93+
/// Measures the impact of the expanded full-printable character set.
94+
/// Run with: dotnet run -c Release -- --filter *CharacterSet*
95+
/// </summary>
96+
[MemoryDiagnoser]
97+
[SimpleJob]
98+
public class CharacterSetBenchmarks
99+
{
100+
private CharacterMap _classicMap = null!; // 70 chars (old default)
101+
private CharacterMap _fullMap = null!; // 95 chars (new default)
102+
private CharacterMap _extendedMap = null!; // 93 chars
103+
private ShapeVector[] _testVectors = null!;
104+
105+
[GlobalSetup]
106+
public void Setup()
107+
{
108+
_classicMap = new CharacterMap(CharacterMap.ClassicCharacterSet);
109+
_fullMap = new CharacterMap(CharacterMap.DefaultCharacterSet);
110+
_extendedMap = new CharacterMap(CharacterMap.ExtendedCharacterSet);
111+
112+
var random = new Random(42);
113+
_testVectors = new ShapeVector[1000];
114+
for (var i = 0; i < _testVectors.Length; i++)
115+
_testVectors[i] = new ShapeVector(
116+
(float)random.NextDouble(),
117+
(float)random.NextDouble(),
118+
(float)random.NextDouble(),
119+
(float)random.NextDouble(),
120+
(float)random.NextDouble(),
121+
(float)random.NextDouble()
122+
);
123+
}
124+
125+
[Benchmark(Baseline = true)]
126+
public char Classic_70Chars()
127+
{
128+
char result = ' ';
129+
for (var i = 0; i < _testVectors.Length; i++)
130+
result = _classicMap.FindBestMatch(_testVectors[i]);
131+
return result;
132+
}
133+
134+
[Benchmark]
135+
public char Full_95Chars()
136+
{
137+
char result = ' ';
138+
for (var i = 0; i < _testVectors.Length; i++)
139+
result = _fullMap.FindBestMatch(_testVectors[i]);
140+
return result;
141+
}
142+
143+
[Benchmark]
144+
public char Extended_93Chars()
145+
{
146+
char result = ' ';
147+
for (var i = 0; i < _testVectors.Length; i++)
148+
result = _extendedMap.FindBestMatch(_testVectors[i]);
149+
return result;
150+
}
151+
152+
[Benchmark]
153+
public char Classic_BruteForce()
154+
{
155+
char result = ' ';
156+
for (var i = 0; i < _testVectors.Length; i++)
157+
result = _classicMap.FindBestMatchBruteForce(_testVectors[i]);
158+
return result;
159+
}
160+
161+
[Benchmark]
162+
public char Full_BruteForce()
163+
{
164+
char result = ' ';
165+
for (var i = 0; i < _testVectors.Length; i++)
166+
result = _fullMap.FindBestMatchBruteForce(_testVectors[i]);
167+
return result;
168+
}
169+
}
170+
171+
/// <summary>
172+
/// Benchmarks for disk cache performance (CharacterMap startup).
173+
/// Run with: dotnet run -c Release -- --filter *DiskCache*
174+
/// </summary>
175+
[MemoryDiagnoser]
176+
[SimpleJob]
177+
[IterationCount(5)]
178+
[WarmupCount(2)]
179+
public class DiskCacheBenchmarks
180+
{
181+
[Benchmark(Baseline = true)]
182+
public CharacterMap CreateMap_Classic_CacheHit()
183+
{
184+
// Second creation should hit disk cache
185+
return new CharacterMap(CharacterMap.ClassicCharacterSet);
186+
}
187+
188+
[Benchmark]
189+
public CharacterMap CreateMap_Full_CacheHit()
190+
{
191+
return new CharacterMap(CharacterMap.DefaultCharacterSet);
192+
}
193+
194+
[Benchmark]
195+
public BrailleCharacterMap CreateBrailleMap()
196+
{
197+
// Mathematical generation - no disk cache needed
198+
return new BrailleCharacterMap();
199+
}
200+
}

0 commit comments

Comments
 (0)