tint_me 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +17 -0
  3. data/README.md +104 -25
  4. data/lib/tint_me/sgr_builder.rb +1 -1
  5. data/lib/tint_me/style/types.rb +21 -0
  6. data/lib/tint_me/style.rb +69 -0
  7. data/lib/tint_me/version.rb +1 -1
  8. data/sig/dry-schema.rbs +8 -0
  9. data/sig/dry-types.rbs +11 -0
  10. data/sig/tint_me/error.rbs +4 -0
  11. data/sig/tint_me/sgr_builder.rbs +60 -0
  12. data/sig/tint_me/style/schema.rbs +5 -0
  13. data/sig/tint_me/style/types.rbs +14 -0
  14. data/sig/tint_me/style.rbs +73 -0
  15. data/sig/tint_me.rbs +1 -45
  16. metadata +13 -31
  17. data/.rubocop_todo.yml +0 -7
  18. data/.serena/project.yml +0 -68
  19. data/.simplecov +0 -24
  20. data/.yardopts +0 -6
  21. data/AGENTS.md +0 -60
  22. data/CLAUDE.md +0 -1
  23. data/RELEASING.md +0 -202
  24. data/Rakefile +0 -18
  25. data/benchmark/2025-09-08-style-caching-optimization/01_baseline_results.txt +0 -39
  26. data/benchmark/2025-09-08-style-caching-optimization/02_with_full_caching_results.txt +0 -54
  27. data/benchmark/2025-09-08-style-caching-optimization/03_prefix_only_caching_results.txt +0 -107
  28. data/benchmark/2025-09-08-style-caching-optimization/04_baseline_vs_optimized_analysis.txt +0 -65
  29. data/benchmark/2025-09-08-style-caching-optimization/05_caching_approaches_comparison.txt +0 -59
  30. data/benchmark/2025-09-08-style-caching-optimization/06_append_operator_results.txt +0 -107
  31. data/benchmark/2025-09-08-style-caching-optimization/07_string_concatenation_comparison.txt +0 -66
  32. data/benchmark/2025-09-08-style-caching-optimization/08_with_freeze_optimization_results.txt +0 -107
  33. data/benchmark/2025-09-08-style-caching-optimization/09_freeze_optimization_analysis.txt +0 -49
  34. data/benchmark/2025-09-08-style-caching-optimization/10_constant_access_results.txt +0 -107
  35. data/benchmark/2025-09-08-style-caching-optimization/11_constant_vs_cache_analysis.txt +0 -74
  36. data/benchmark/2025-09-08-style-caching-optimization/12_empty_prefix_analysis.txt +0 -81
  37. data/benchmark/2025-09-08-style-caching-optimization/13_nil_check_optimization_results.txt +0 -107
  38. data/benchmark/2025-09-08-style-caching-optimization/14_nil_vs_empty_check_analysis.txt +0 -81
  39. data/benchmark/2025-09-08-style-caching-optimization/README.md +0 -45
  40. data/benchmark/2025-09-08-style-caching-optimization/benchmark_script.rb +0 -180
  41. data/docs/agents/git-pr.md +0 -298
  42. data/docs/agents/languages.md +0 -388
  43. data/docs/agents/rubocop.md +0 -55
  44. data/mise.toml +0 -5
@@ -1,107 +0,0 @@
1
- ============================================================
2
- TIntMe Style Performance Benchmark
3
- ============================================================
4
-
5
- Memory Usage Analysis:
6
- ----------------------------------------
7
- Calculating -------------------------------------
8
- Create simple style 6.048k memsize ( 0.000 retained)
9
- 58.000 objects ( 0.000 retained)
10
- 2.000 strings ( 0.000 retained)
11
- Create complex style 7.744k memsize ( 0.000 retained)
12
- 79.000 objects ( 0.000 retained)
13
- 9.000 strings ( 0.000 retained)
14
- Apply simple style (short text)
15
- 616.000 memsize ( 0.000 retained)
16
- 4.000 objects ( 0.000 retained)
17
- 1.000 strings ( 0.000 retained)
18
- Apply complex style (short text)
19
- 264.000 memsize ( 0.000 retained)
20
- 2.000 objects ( 0.000 retained)
21
- 1.000 strings ( 0.000 retained)
22
-
23
- Comparison:
24
- Apply complex style (short text): 264 allocated
25
- Apply simple style (short text): 616 allocated - 2.33x more
26
- Create simple style: 6048 allocated - 22.91x more
27
- Create complex style: 7744 allocated - 29.33x more
28
-
29
- Performance Benchmark (operations per second):
30
- ----------------------------------------
31
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
32
- Warming up --------------------------------------
33
- Create simple style 2.927k i/100ms
34
- Create complex style 2.413k i/100ms
35
- Apply simple style (short)
36
- 443.590k i/100ms
37
- Apply simple style (medium)
38
- 395.847k i/100ms
39
- Apply simple style (long)
40
- 378.681k i/100ms
41
- Apply complex style (short)
42
- 321.759k i/100ms
43
- Apply complex style (medium)
44
- 382.195k i/100ms
45
- Apply complex style (long)
46
- 356.585k i/100ms
47
- Apply hex style (short)
48
- 373.664k i/100ms
49
- Calculating -------------------------------------
50
- Create simple style 29.037k (± 3.1%) i/s (34.44 μs/i) - 146.350k in 5.045026s
51
- Create complex style 24.894k (± 1.7%) i/s (40.17 μs/i) - 125.476k in 5.042000s
52
- Apply simple style (short)
53
- 4.428M (± 0.8%) i/s (225.85 ns/i) - 22.180M in 5.009439s
54
- Apply simple style (medium)
55
- 3.847M (± 1.4%) i/s (259.95 ns/i) - 19.397M in 5.043123s
56
- Apply simple style (long)
57
- 3.764M (± 1.6%) i/s (265.69 ns/i) - 18.934M in 5.031865s
58
- Apply complex style (short)
59
- 3.275M (± 1.0%) i/s (305.32 ns/i) - 16.410M in 5.010664s
60
- Apply complex style (medium)
61
- 3.748M (± 4.8%) i/s (266.82 ns/i) - 18.728M in 5.012920s
62
- Apply complex style (long)
63
- 3.469M (± 5.5%) i/s (288.30 ns/i) - 17.473M in 5.056096s
64
- Apply hex style (short)
65
- 3.747M (± 3.1%) i/s (266.90 ns/i) - 19.057M in 5.092324s
66
-
67
- Comparison:
68
- Apply simple style (short): 4427800.1 i/s
69
- Apply simple style (medium): 3846907.6 i/s - 1.15x slower
70
- Apply simple style (long): 3763792.3 i/s - 1.18x slower
71
- Apply complex style (medium): 3747858.3 i/s - 1.18x slower
72
- Apply hex style (short): 3746719.7 i/s - 1.18x slower
73
- Apply complex style (long): 3468603.6 i/s - 1.28x slower
74
- Apply complex style (short): 3275289.7 i/s - 1.35x slower
75
- Create simple style: 29037.4 i/s - 152.49x slower
76
- Create complex style: 24894.1 i/s - 177.87x slower
77
-
78
-
79
- Repeated Application Benchmark:
80
- ----------------------------------------
81
- Applying the same style 1000 times to measure caching benefit...
82
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
83
- Warming up --------------------------------------
84
- 1000x simple style 497.000 i/100ms
85
- 1000x complex style 357.000 i/100ms
86
- 1000x hex style 426.000 i/100ms
87
- Calculating -------------------------------------
88
- 1000x simple style 4.961k (± 0.9%) i/s (201.59 μs/i) - 24.850k in 5.009943s
89
- 1000x complex style 3.553k (± 3.4%) i/s (281.45 μs/i) - 17.850k in 5.031381s
90
- 1000x hex style 4.171k (± 5.0%) i/s (239.76 μs/i) - 20.874k in 5.019703s
91
-
92
- Comparison:
93
- 1000x simple style: 4960.5 i/s
94
- 1000x hex style: 4170.9 i/s - 1.19x slower
95
- 1000x complex style: 3553.0 i/s - 1.40x slower
96
-
97
-
98
- Object Allocation Analysis:
99
- ----------------------------------------
100
- Create simple style: 117 objects allocated
101
- Create complex style: 136 objects allocated
102
- Apply simple style 100x: 104 objects allocated
103
- Apply complex style 100x: 104 objects allocated
104
-
105
- ============================================================
106
- Benchmark complete!
107
- ============================================================
@@ -1,65 +0,0 @@
1
- PERFORMANCE COMPARISON ANALYSIS
2
- ===============================
3
-
4
- ## Before vs After Optimization Summary
5
-
6
- ### Style Application Performance (ops/second)
7
- | Style Type | Before | After | Improvement |
8
- |------------|-----------|-----------|-------------|
9
- | Simple | 766,000 | 5,444,000 | 7.1x faster |
10
- | Complex | 437,000 | 3,834,000 | 8.8x faster |
11
- | Hex Color | 266,000 | 4,656,000 | 17.5x faster|
12
-
13
- ### Repeated Application (1000x, ops/second)
14
- | Style Type | Before | After | Improvement |
15
- |------------|--------|-------|-------------|
16
- | Simple | 781 | 6,383 | 8.2x faster |
17
- | Complex | 433 | 4,294 | 9.9x faster |
18
- | Hex | 265 | 5,343 | 20.2x faster|
19
-
20
- ### Object Allocations (100 applications)
21
- | Style Type | Before | After | Reduction |
22
- |------------|--------|-------|-----------|
23
- | Simple | 703 | 104 | 85% less |
24
- | Complex | 1,203 | 104 | 91% less |
25
-
26
- ### Memory Usage Per Style Creation
27
- | Style Type | Before | After | Increase |
28
- |------------|---------------|---------------|----------|
29
- | Simple | 5.8KB, 52 obj| 6.1KB, 58 obj | +6% |
30
- | Complex | 6.6KB, 66 obj| 7.8KB, 79 obj | +18% |
31
-
32
- ## Key Insights
33
-
34
- ### Performance Gains
35
- 1. **Hex colors see biggest improvement**: 17.5-20x faster
36
- - RGB conversion now happens once at creation instead of every call
37
-
38
- 2. **Complex styles benefit most**: 8.8-9.9x faster
39
- - Multiple SGR parameters cached as single string
40
-
41
- 3. **Simple styles still significant**: 7.1-8.2x faster
42
- - Even basic styles benefit from eliminating repeated calculation
43
-
44
- ### Memory Trade-offs
45
- 1. **Creation cost acceptable**: 6-18% increase in creation memory
46
- - Small price for immutable objects that may be called many times
47
-
48
- 2. **Runtime memory much better**: Massive reduction in per-call allocations
49
- - 85-91% fewer objects created during style application
50
-
51
- 3. **Net positive for typical usage**: Any style called >2-3 times benefits
52
-
53
- ### Algorithm Complexity Improvements
54
- 1. **Before**: O(n) per call where n = number of style attributes
55
- 2. **After**: O(1) per call - just string concatenation
56
- 3. **One-time cost**: SGR sequence building moved to initialization
57
-
58
- ## Recommendation
59
- The optimization is highly successful with minimal downsides:
60
- - Dramatic performance improvements across all scenarios
61
- - Acceptable memory trade-off for creation
62
- - Maintains identical API and behavior
63
- - Especially beneficial for repeated use (the common case)
64
-
65
- This change transforms Style from a computation-heavy operation to a simple string concatenation, making it suitable for high-frequency styling operations.
@@ -1,59 +0,0 @@
1
- CACHING APPROACH COMPARISON
2
- ===========================
3
- Date: 2025-09-08
4
-
5
- ## Memory Usage Comparison (Style Creation)
6
-
7
- ### With reset_code caching:
8
- - Simple style: 6.1KB, 58 objects
9
- - Complex style: 7.8KB, 79 objects
10
-
11
- ### Without reset_code caching:
12
- - Simple style: 6.0KB, 58 objects (-8 bytes)
13
- - Complex style: 7.7KB, 79 objects (-8 bytes)
14
-
15
- **Memory savings: ~8 bytes per Style instance (negligible)**
16
-
17
- ## Performance Comparison (ops/second)
18
-
19
- ### Style Application Performance:
20
- | Style Type | With reset_code cache | Without reset_code cache | Difference |
21
- |------------|----------------------|---------------------------|------------|
22
- | Simple | 5.44M | 4.43M | 18% slower |
23
- | Complex | 3.83M | 3.28M | 14% slower |
24
- | Hex | 4.66M | 3.75M | 20% slower |
25
-
26
- ### Repeated Application (1000x):
27
- | Style Type | With cache | Without cache | Difference |
28
- |------------|------------|---------------|------------|
29
- | Simple | 6,383 | 4,961 | 22% slower |
30
- | Complex | 4,294 | 3,553 | 17% slower |
31
- | Hex | 5,343 | 4,171 | 22% slower |
32
-
33
- ### Memory Usage Per Application:
34
- | Style Type | With cache | Without cache | Difference |
35
- |------------|------------|---------------|------------|
36
- | Simple | 424 bytes | 616 bytes | +45% more |
37
- | Complex | 264 bytes | 264 bytes | same |
38
-
39
- ## Analysis
40
-
41
- ### Performance Impact:
42
- - **14-22% performance decrease** without reset_code caching
43
- - Simple styles show highest impact (22% slower)
44
- - Memory allocation per call increases for simple styles
45
-
46
- ### Memory Trade-off:
47
- - **Minimal creation savings**: Only 8 bytes per Style instance
48
- - **Higher runtime cost**: Simple styles use 45% more memory per call
49
- - **Net negative**: More allocations during frequent usage
50
-
51
- ### Recommendations:
52
-
53
- **Keep reset_code caching** because:
54
- 1. Negligible memory savings (8 bytes) when removed
55
- 2. Significant performance cost (14-22% slower)
56
- 3. Increased runtime memory allocations
57
- 4. Reset code is a constant string ("\e[0m") - perfect for caching
58
-
59
- The reset_code caching provides substantial performance benefits with minimal memory overhead, making it an optimal trade-off for the typical use case of applying styles multiple times.
@@ -1,107 +0,0 @@
1
- ============================================================
2
- TIntMe Style Performance Benchmark
3
- ============================================================
4
-
5
- Memory Usage Analysis:
6
- ----------------------------------------
7
- Calculating -------------------------------------
8
- Create simple style 6.056k memsize ( 0.000 retained)
9
- 58.000 objects ( 0.000 retained)
10
- 2.000 strings ( 0.000 retained)
11
- Create complex style 7.752k memsize ( 0.000 retained)
12
- 79.000 objects ( 0.000 retained)
13
- 9.000 strings ( 0.000 retained)
14
- Apply simple style (short text)
15
- 424.000 memsize ( 0.000 retained)
16
- 3.000 objects ( 0.000 retained)
17
- 1.000 strings ( 0.000 retained)
18
- Apply complex style (short text)
19
- 264.000 memsize ( 0.000 retained)
20
- 2.000 objects ( 0.000 retained)
21
- 1.000 strings ( 0.000 retained)
22
-
23
- Comparison:
24
- Apply complex style (short text): 264 allocated
25
- Apply simple style (short text): 424 allocated - 1.61x more
26
- Create simple style: 6056 allocated - 22.94x more
27
- Create complex style: 7752 allocated - 29.36x more
28
-
29
- Performance Benchmark (operations per second):
30
- ----------------------------------------
31
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
32
- Warming up --------------------------------------
33
- Create simple style 2.537k i/100ms
34
- Create complex style 2.341k i/100ms
35
- Apply simple style (short)
36
- 466.725k i/100ms
37
- Apply simple style (medium)
38
- 341.328k i/100ms
39
- Apply simple style (long)
40
- 287.127k i/100ms
41
- Apply complex style (short)
42
- 323.061k i/100ms
43
- Apply complex style (medium)
44
- 336.757k i/100ms
45
- Apply complex style (long)
46
- 303.412k i/100ms
47
- Apply hex style (short)
48
- 237.369k i/100ms
49
- Calculating -------------------------------------
50
- Create simple style 28.350k (± 3.5%) i/s (35.27 μs/i) - 142.072k in 5.018115s
51
- Create complex style 22.956k (± 8.6%) i/s (43.56 μs/i) - 114.709k in 5.048226s
52
- Apply simple style (short)
53
- 4.604M (± 1.7%) i/s (217.20 ns/i) - 23.336M in 5.069941s
54
- Apply simple style (medium)
55
- 3.365M (± 3.7%) i/s (297.21 ns/i) - 17.066M in 5.080576s
56
- Apply simple style (long)
57
- 3.071M (± 4.5%) i/s (325.67 ns/i) - 15.505M in 5.059977s
58
- Apply complex style (short)
59
- 3.362M (± 4.0%) i/s (297.41 ns/i) - 16.799M in 5.006339s
60
- Apply complex style (medium)
61
- 3.337M (± 1.8%) i/s (299.70 ns/i) - 16.838M in 5.047809s
62
- Apply complex style (long)
63
- 3.027M (± 6.1%) i/s (330.32 ns/i) - 15.171M in 5.032030s
64
- Apply hex style (short)
65
- 2.473M (± 1.8%) i/s (404.40 ns/i) - 12.581M in 5.089276s
66
-
67
- Comparison:
68
- Apply simple style (short): 4604142.2 i/s
69
- Apply simple style (medium): 3364580.5 i/s - 1.37x slower
70
- Apply complex style (short): 3362358.4 i/s - 1.37x slower
71
- Apply complex style (medium): 3336720.3 i/s - 1.38x slower
72
- Apply simple style (long): 3070605.6 i/s - 1.50x slower
73
- Apply complex style (long): 3027356.7 i/s - 1.52x slower
74
- Apply hex style (short): 2472779.1 i/s - 1.86x slower
75
- Create simple style: 28349.6 i/s - 162.41x slower
76
- Create complex style: 22956.2 i/s - 200.56x slower
77
-
78
-
79
- Repeated Application Benchmark:
80
- ----------------------------------------
81
- Applying the same style 1000 times to measure caching benefit...
82
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
83
- Warming up --------------------------------------
84
- 1000x simple style 528.000 i/100ms
85
- 1000x complex style 362.000 i/100ms
86
- 1000x hex style 238.000 i/100ms
87
- Calculating -------------------------------------
88
- 1000x simple style 5.013k (± 7.6%) i/s (199.47 μs/i) - 25.344k in 5.092091s
89
- 1000x complex style 3.694k (± 2.3%) i/s (270.71 μs/i) - 18.462k in 5.000406s
90
- 1000x hex style 2.608k (± 5.6%) i/s (383.40 μs/i) - 13.090k in 5.040010s
91
-
92
- Comparison:
93
- 1000x simple style: 5013.4 i/s
94
- 1000x complex style: 3694.0 i/s - 1.36x slower
95
- 1000x hex style: 2608.3 i/s - 1.92x slower
96
-
97
-
98
- Object Allocation Analysis:
99
- ----------------------------------------
100
- Create simple style: 117 objects allocated
101
- Create complex style: 136 objects allocated
102
- Apply simple style 100x: 104 objects allocated
103
- Apply complex style 100x: 104 objects allocated
104
-
105
- ============================================================
106
- Benchmark complete!
107
- ============================================================
@@ -1,66 +0,0 @@
1
- STRING CONCATENATION METHOD COMPARISON
2
- ======================================
3
- Date: 2025-09-08
4
-
5
- ## Performance Comparison: String Interpolation vs << Operator
6
-
7
- ### Method Implementations
8
-
9
- #### String Interpolation (Original)
10
- ```ruby
11
- def call(text)
12
- return text if @prefix.empty?
13
- "#{@prefix}#{text}#{@reset_code}"
14
- end
15
- ```
16
-
17
- #### << Operator (Experimental)
18
- ```ruby
19
- def call(text)
20
- return text if @prefix.empty?
21
- @prefix.dup << text << @reset_code
22
- end
23
- ```
24
-
25
- ### Performance Results (ops/second)
26
-
27
- | Style Type | String Interpolation | << Operator | Performance Loss |
28
- |------------|---------------------|-------------|------------------|
29
- | Simple | 5.44M/s | 4.55M/s | **16% slower** |
30
- | Complex | 3.83M/s | 3.35M/s | **13% slower** |
31
- | Hex Color | 4.66M/s | 2.45M/s | **47% slower** |
32
-
33
- ### Memory Usage (per application)
34
-
35
- | Implementation | Simple Style | Complex Style |
36
- |----------------|-------------|---------------|
37
- | String Interpolation | 424 bytes, 3 objects | 264 bytes, 2 objects |
38
- | << Operator | 424 bytes, 3 objects | 264 bytes, 2 objects |
39
-
40
- *Memory usage appears identical*
41
-
42
- ### Analysis
43
-
44
- #### Why << Operator is Slower:
45
-
46
- 1. **Extra Copy Cost**: `@prefix.dup` creates unnecessary string copy
47
- 2. **Multiple Operations**: Three separate `<<` calls vs single interpolation
48
- 3. **Ruby Optimization**: String interpolation is highly optimized in Ruby
49
- 4. **Hex Colors Impact**: Most significant performance hit (47% slower)
50
-
51
- #### Performance Loss Breakdown:
52
-
53
- - **Simple styles**: 16% slower due to dup + concatenation overhead
54
- - **Complex styles**: 13% slower, similar pattern
55
- - **Hex colors**: 47% slower, suggests interpolation especially optimized for longer strings
56
-
57
- ### Conclusion
58
-
59
- **String interpolation (`"#{a}#{b}#{c}"`) is definitively superior** for this use case:
60
-
61
- - Consistently faster across all style types
62
- - No additional memory allocation overhead
63
- - Leverages Ruby's built-in string interpolation optimizations
64
- - Simpler, more readable code
65
-
66
- The experiment confirms that the original implementation choice was optimal. Ruby's string interpolation is highly optimized and should be preferred over manual concatenation methods for performance-critical string building operations.
@@ -1,107 +0,0 @@
1
- ============================================================
2
- TIntMe Style Performance Benchmark
3
- ============================================================
4
-
5
- Memory Usage Analysis:
6
- ----------------------------------------
7
- Calculating -------------------------------------
8
- Create simple style 6.056k memsize ( 0.000 retained)
9
- 58.000 objects ( 0.000 retained)
10
- 2.000 strings ( 0.000 retained)
11
- Create complex style 7.752k memsize ( 0.000 retained)
12
- 79.000 objects ( 0.000 retained)
13
- 9.000 strings ( 0.000 retained)
14
- Apply simple style (short text)
15
- 424.000 memsize ( 0.000 retained)
16
- 3.000 objects ( 0.000 retained)
17
- 1.000 strings ( 0.000 retained)
18
- Apply complex style (short text)
19
- 264.000 memsize ( 0.000 retained)
20
- 2.000 objects ( 0.000 retained)
21
- 1.000 strings ( 0.000 retained)
22
-
23
- Comparison:
24
- Apply complex style (short text): 264 allocated
25
- Apply simple style (short text): 424 allocated - 1.61x more
26
- Create simple style: 6056 allocated - 22.94x more
27
- Create complex style: 7752 allocated - 29.36x more
28
-
29
- Performance Benchmark (operations per second):
30
- ----------------------------------------
31
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
32
- Warming up --------------------------------------
33
- Create simple style 2.829k i/100ms
34
- Create complex style 2.405k i/100ms
35
- Apply simple style (short)
36
- 551.851k i/100ms
37
- Apply simple style (medium)
38
- 476.907k i/100ms
39
- Apply simple style (long)
40
- 482.203k i/100ms
41
- Apply complex style (short)
42
- 381.682k i/100ms
43
- Apply complex style (medium)
44
- 455.559k i/100ms
45
- Apply complex style (long)
46
- 417.965k i/100ms
47
- Apply hex style (short)
48
- 470.351k i/100ms
49
- Calculating -------------------------------------
50
- Create simple style 27.161k (± 6.4%) i/s (36.82 μs/i) - 135.792k in 5.024378s
51
- Create complex style 23.009k (± 4.3%) i/s (43.46 μs/i) - 115.440k in 5.027763s
52
- Apply simple style (short)
53
- 5.264M (± 3.8%) i/s (189.96 ns/i) - 26.489M in 5.039995s
54
- Apply simple style (medium)
55
- 4.621M (± 3.1%) i/s (216.40 ns/i) - 23.368M in 5.061823s
56
- Apply simple style (long)
57
- 4.478M (± 4.8%) i/s (223.34 ns/i) - 22.664M in 5.074611s
58
- Apply complex style (short)
59
- 3.685M (± 2.4%) i/s (271.36 ns/i) - 18.702M in 5.078168s
60
- Apply complex style (medium)
61
- 4.536M (± 4.8%) i/s (220.45 ns/i) - 22.778M in 5.036293s
62
- Apply complex style (long)
63
- 4.271M (± 7.5%) i/s (234.13 ns/i) - 21.316M in 5.031500s
64
- Apply hex style (short)
65
- 4.558M (± 3.7%) i/s (219.39 ns/i) - 23.047M in 5.063931s
66
-
67
- Comparison:
68
- Apply simple style (short): 5264329.5 i/s
69
- Apply simple style (medium): 4621101.0 i/s - 1.14x slower
70
- Apply hex style (short): 4558064.1 i/s - 1.15x slower
71
- Apply complex style (medium): 4536089.7 i/s - 1.16x slower
72
- Apply simple style (long): 4477533.0 i/s - 1.18x slower
73
- Apply complex style (long): 4271132.9 i/s - 1.23x slower
74
- Apply complex style (short): 3685074.9 i/s - 1.43x slower
75
- Create simple style: 27161.3 i/s - 193.82x slower
76
- Create complex style: 23008.5 i/s - 228.80x slower
77
-
78
-
79
- Repeated Application Benchmark:
80
- ----------------------------------------
81
- Applying the same style 1000 times to measure caching benefit...
82
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
83
- Warming up --------------------------------------
84
- 1000x simple style 631.000 i/100ms
85
- 1000x complex style 412.000 i/100ms
86
- 1000x hex style 540.000 i/100ms
87
- Calculating -------------------------------------
88
- 1000x simple style 6.203k (± 2.1%) i/s (161.20 μs/i) - 31.550k in 5.088346s
89
- 1000x complex style 4.119k (± 5.2%) i/s (242.77 μs/i) - 20.600k in 5.018834s
90
- 1000x hex style 5.267k (± 2.8%) i/s (189.85 μs/i) - 26.460k in 5.027249s
91
-
92
- Comparison:
93
- 1000x simple style: 6203.3 i/s
94
- 1000x hex style: 5267.4 i/s - 1.18x slower
95
- 1000x complex style: 4119.1 i/s - 1.51x slower
96
-
97
-
98
- Object Allocation Analysis:
99
- ----------------------------------------
100
- Create simple style: 117 objects allocated
101
- Create complex style: 136 objects allocated
102
- Apply simple style 100x: 103 objects allocated
103
- Apply complex style 100x: 103 objects allocated
104
-
105
- ============================================================
106
- Benchmark complete!
107
- ============================================================
@@ -1,49 +0,0 @@
1
- FREEZE OPTIMIZATION ANALYSIS
2
- =============================
3
- Date: 2025-09-08
4
-
5
- ## Implementation Change
6
-
7
- Added `.freeze` to the cached prefix string:
8
-
9
- ```ruby
10
- # Before
11
- @prefix = sgr_builder.prefix_codes(...)
12
-
13
- # After
14
- @prefix = sgr_builder.prefix_codes(...).freeze
15
- ```
16
-
17
- ## Performance Comparison
18
-
19
- | Style Type | Without freeze | With freeze | Difference |
20
- |------------|----------------|-------------|------------|
21
- | Simple | 5.44M/s | 5.26M/s | **3% slower** |
22
- | Complex | 3.83M/s | 3.69M/s | **4% slower** |
23
- | Hex Color | 4.66M/s | 4.56M/s | **2% slower** |
24
-
25
- ## Analysis
26
-
27
- ### Why freeze didn't help (and slightly hurt):
28
-
29
- 1. **String interpolation doesn't modify strings**: The operation `"#{@prefix}#{text}#{@reset_code}"` creates a new string without modifying the original strings, so freeze protection isn't needed.
30
-
31
- 2. **Freeze call overhead**: The `.freeze` method call during initialization adds slight overhead without providing benefits for this use case.
32
-
33
- 3. **Data.define already provides immutability**: The Style instance itself is frozen after `super`, providing sufficient protection.
34
-
35
- 4. **Memory allocation patterns unchanged**: Freeze doesn't affect how string interpolation allocates memory.
36
-
37
- ### When freeze would be beneficial:
38
-
39
- - If we were doing destructive operations like `@prefix << something`
40
- - If the strings were being passed to untrusted code
41
- - If we needed to prevent accidental modification in other parts of the codebase
42
-
43
- ## Conclusion
44
-
45
- **Remove the freeze optimization** - it provides no performance benefit and adds unnecessary overhead.
46
-
47
- The original implementation without explicit freezing is optimal for this use case. Ruby's string interpolation is already highly optimized and doesn't require the strings to be frozen for maximum performance.
48
-
49
- **Recommendation**: Revert to the non-frozen version for best performance.
@@ -1,107 +0,0 @@
1
- ============================================================
2
- TIntMe Style Performance Benchmark
3
- ============================================================
4
-
5
- Memory Usage Analysis:
6
- ----------------------------------------
7
- Calculating -------------------------------------
8
- Create simple style 6.048k memsize ( 0.000 retained)
9
- 58.000 objects ( 0.000 retained)
10
- 2.000 strings ( 0.000 retained)
11
- Create complex style 7.744k memsize ( 0.000 retained)
12
- 79.000 objects ( 0.000 retained)
13
- 9.000 strings ( 0.000 retained)
14
- Apply simple style (short text)
15
- 616.000 memsize ( 0.000 retained)
16
- 4.000 objects ( 0.000 retained)
17
- 1.000 strings ( 0.000 retained)
18
- Apply complex style (short text)
19
- 264.000 memsize ( 0.000 retained)
20
- 2.000 objects ( 0.000 retained)
21
- 1.000 strings ( 0.000 retained)
22
-
23
- Comparison:
24
- Apply complex style (short text): 264 allocated
25
- Apply simple style (short text): 616 allocated - 2.33x more
26
- Create simple style: 6048 allocated - 22.91x more
27
- Create complex style: 7744 allocated - 29.33x more
28
-
29
- Performance Benchmark (operations per second):
30
- ----------------------------------------
31
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
32
- Warming up --------------------------------------
33
- Create simple style 2.828k i/100ms
34
- Create complex style 2.434k i/100ms
35
- Apply simple style (short)
36
- 566.692k i/100ms
37
- Apply simple style (medium)
38
- 492.842k i/100ms
39
- Apply simple style (long)
40
- 493.077k i/100ms
41
- Apply complex style (short)
42
- 388.767k i/100ms
43
- Apply complex style (medium)
44
- 465.948k i/100ms
45
- Apply complex style (long)
46
- 405.436k i/100ms
47
- Apply hex style (short)
48
- 454.188k i/100ms
49
- Calculating -------------------------------------
50
- Create simple style 26.982k (± 6.8%) i/s (37.06 μs/i) - 135.744k in 5.055760s
51
- Create complex style 22.324k (± 7.6%) i/s (44.80 μs/i) - 111.964k in 5.048157s
52
- Apply simple style (short)
53
- 5.383M (± 4.2%) i/s (185.78 ns/i) - 27.201M in 5.062923s
54
- Apply simple style (medium)
55
- 4.710M (± 5.8%) i/s (212.30 ns/i) - 23.656M in 5.043190s
56
- Apply simple style (long)
57
- 4.582M (± 3.1%) i/s (218.23 ns/i) - 23.175M in 5.062439s
58
- Apply complex style (short)
59
- 3.777M (± 3.0%) i/s (264.78 ns/i) - 19.050M in 5.048997s
60
- Apply complex style (medium)
61
- 4.664M (± 2.6%) i/s (214.42 ns/i) - 23.763M in 5.099101s
62
- Apply complex style (long)
63
- 4.359M (± 5.2%) i/s (229.40 ns/i) - 21.894M in 5.038110s
64
- Apply hex style (short)
65
- 4.689M (± 3.3%) i/s (213.25 ns/i) - 23.618M in 5.042292s
66
-
67
- Comparison:
68
- Apply simple style (short): 5382832.4 i/s
69
- Apply simple style (medium): 4710226.6 i/s - 1.14x slower
70
- Apply hex style (short): 4689404.2 i/s - 1.15x slower
71
- Apply complex style (medium): 4663664.1 i/s - 1.15x slower
72
- Apply simple style (long): 4582346.7 i/s - 1.17x slower
73
- Apply complex style (long): 4359256.4 i/s - 1.23x slower
74
- Apply complex style (short): 3776649.2 i/s - 1.43x slower
75
- Create simple style: 26982.3 i/s - 199.50x slower
76
- Create complex style: 22323.7 i/s - 241.13x slower
77
-
78
-
79
- Repeated Application Benchmark:
80
- ----------------------------------------
81
- Applying the same style 1000 times to measure caching benefit...
82
- ruby 3.2.9 (2025-07-24 revision 8f611e0c46) [arm64-darwin24]
83
- Warming up --------------------------------------
84
- 1000x simple style 654.000 i/100ms
85
- 1000x complex style 379.000 i/100ms
86
- 1000x hex style 546.000 i/100ms
87
- Calculating -------------------------------------
88
- 1000x simple style 6.440k (± 1.6%) i/s (155.28 μs/i) - 32.700k in 5.079043s
89
- 1000x complex style 4.218k (± 4.5%) i/s (237.07 μs/i) - 21.224k in 5.044673s
90
- 1000x hex style 5.513k (± 2.2%) i/s (181.39 μs/i) - 27.846k in 5.053459s
91
-
92
- Comparison:
93
- 1000x simple style: 6439.9 i/s
94
- 1000x hex style: 5513.1 i/s - 1.17x slower
95
- 1000x complex style: 4218.1 i/s - 1.53x slower
96
-
97
-
98
- Object Allocation Analysis:
99
- ----------------------------------------
100
- Create simple style: 117 objects allocated
101
- Create complex style: 136 objects allocated
102
- Apply simple style 100x: 104 objects allocated
103
- Apply complex style 100x: 104 objects allocated
104
-
105
- ============================================================
106
- Benchmark complete!
107
- ============================================================