@@ -16,27 +16,28 @@ public class ToStringEnumerable
16
16
/// </summary>
17
17
[ Benchmark ]
18
18
[ ArgumentsSource ( nameof ( DataSource ) ) ]
19
- public string Previous ( IEnumerable < Rune > runes , int size )
19
+ public string Previous ( IEnumerable < Rune > runes , int len )
20
20
{
21
- return StringAppendInLoop ( runes ) ;
21
+ return StringConcatInLoop ( runes ) ;
22
22
}
23
23
24
24
/// <summary>
25
- /// Benchmark for current implementation with rune chars appending to StringBuilder.
25
+ /// Benchmark for current implementation with stackalloc char buffer and
26
+ /// fallback to rune chars appending to StringBuilder.
26
27
/// </summary>
27
28
/// <param name="runes"></param>
28
29
/// <returns></returns>
29
30
[ Benchmark ( Baseline = true ) ]
30
31
[ ArgumentsSource ( nameof ( DataSource ) ) ]
31
- public string Current ( IEnumerable < Rune > runes , int size )
32
+ public string Current ( IEnumerable < Rune > runes , int len )
32
33
{
33
34
return Tui . StringExtensions . ToString ( runes ) ;
34
35
}
35
36
36
37
/// <summary>
37
- /// Previous implementation with string append in a loop.
38
+ /// Previous implementation with string concatenation in a loop.
38
39
/// </summary>
39
- private static string StringAppendInLoop ( IEnumerable < Rune > runes )
40
+ private static string StringConcatInLoop ( IEnumerable < Rune > runes )
40
41
{
41
42
var str = string . Empty ;
42
43
@@ -49,22 +50,35 @@ private static string StringAppendInLoop (IEnumerable<Rune> runes)
49
50
}
50
51
51
52
public IEnumerable < object [ ] > DataSource ( )
53
+ {
54
+ // Extra length argument as workaround for the summary grouping
55
+ // different length collections to same baseline making comparison difficult.
56
+ foreach ( string text in GetTextData ( ) )
57
+ {
58
+ Rune [ ] runes = [ ..text . EnumerateRunes ( ) ] ;
59
+ yield return [ runes , runes . Length ] ;
60
+ }
61
+ }
62
+
63
+ private IEnumerable < string > GetTextData ( )
52
64
{
53
65
string textSource =
54
66
"""
55
- Ĺόŕéḿ íṕśúḿ d́όĺόŕ śít́ áḿét́, ćόńśéćt́ét́úŕ ád́íṕíśćíńǵ éĺít́. Ṕŕáéśéńt́ q́úíś ĺúćt́úś éĺít́. Íńt́éǵéŕ út́ áŕćú éǵét́ d́όĺόŕ śćéĺéŕíśq́úé ḿát́t́íś áć ét́ d́íáḿ.
56
- Ṕéĺĺéńt́éśq́úé śéd́ d́áṕíb́úś ḿáśśá, v́éĺ t́ŕíśt́íq́úé d́úí. Śéd́ v́ít́áé ńéq́úé éú v́éĺít́ όŕńáŕé áĺíq́úét́. Út́ q́úíś όŕćí t́éḿṕόŕ, t́éḿṕόŕ t́úŕṕíś íd́, t́éḿṕúś ńéq́úé.
57
- Ṕŕáéśéńt́ śáṕíéń t́úŕṕíś, όŕńáŕé v́éĺ ḿáúŕíś át́, v́áŕíúś śúśćíṕít́ áńt́é. Út́ ṕúĺv́íńáŕ t́úŕṕíś ḿáśśá, q́úíś ćúŕśúś áŕćú f́áúćíb́úś íń.
58
- Óŕćí v́áŕíúś ńát́όq́úé ṕéńát́íb́úś ét́ ḿáǵńíś d́íś ṕáŕt́úŕíéńt́ ḿόńt́éś, ńáśćét́úŕ ŕíd́íćúĺúś ḿúś. F́úśćé át́ éx́ b́ĺáńd́ít́, ćόńv́áĺĺíś q́úáḿ ét́, v́úĺṕút́át́é ĺáćúś.
59
- Śúśṕéńd́íśśé śít́ áḿét́ áŕćú út́ áŕćú f́áúćíb́úś v́áŕíúś. V́ív́áḿúś śít́ áḿét́ ḿáx́íḿúś d́íáḿ. Ńáḿ éx́ ĺéό, ṕh́áŕét́ŕá éú ĺόb́όŕt́íś át́, t́ŕíśt́íq́úé út́ f́éĺíś.
60
- """;
67
+ Ĺόŕéḿ íṕśúḿ d́όĺόŕ śít́ áḿét́, ćόńśéćt́ét́úŕ ád́íṕíśćíńǵ éĺít́. Ṕŕáéśéńt́ q́úíś ĺúćt́úś éĺít́. Íńt́éǵéŕ út́ áŕćú éǵét́ d́όĺόŕ śćéĺéŕíśq́úé ḿát́t́íś áć ét́ d́íáḿ.
68
+ Ṕéĺĺéńt́éśq́úé śéd́ d́áṕíb́úś ḿáśśá, v́éĺ t́ŕíśt́íq́úé d́úí. Śéd́ v́ít́áé ńéq́úé éú v́éĺít́ όŕńáŕé áĺíq́úét́. Út́ q́úíś όŕćí t́éḿṕόŕ, t́éḿṕόŕ t́úŕṕíś íd́, t́éḿṕúś ńéq́úé.
69
+ Ṕŕáéśéńt́ śáṕíéń t́úŕṕíś, όŕńáŕé v́éĺ ḿáúŕíś át́, v́áŕíúś śúśćíṕít́ áńt́é. Út́ ṕúĺv́íńáŕ t́úŕṕíś ḿáśśá, q́úíś ćúŕśúś áŕćú f́áúćíb́úś íń.
70
+ Óŕćí v́áŕíúś ńát́όq́úé ṕéńát́íb́úś ét́ ḿáǵńíś d́íś ṕáŕt́úŕíéńt́ ḿόńt́éś, ńáśćét́úŕ ŕíd́íćúĺúś ḿúś. F́úśćé át́ éx́ b́ĺáńd́ít́, ćόńv́áĺĺíś q́úáḿ ét́, v́úĺṕút́át́é ĺáćúś.
71
+ Śúśṕéńd́íśśé śít́ áḿét́ áŕćú út́ áŕćú f́áúćíb́úś v́áŕíúś. V́ív́áḿúś śít́ áḿét́ ḿáx́íḿúś d́íáḿ. Ńáḿ éx́ ĺéό, ṕh́áŕét́ŕá éú ĺόb́όŕt́íś át́, t́ŕíśt́íq́úé út́ f́éĺíś.
72
+ """;
61
73
62
- // Extra argument as workaround for the summary grouping different length collections to same baseline making comparison difficult.
63
- int [ ] sizes = [ 1 , 10 , 100 , textSource . Length / 2 , textSource . Length ] ;
74
+ int [ ] lengths = [ 1 , 10 , 100 , textSource . Length / 2 , textSource . Length ] ;
64
75
65
- foreach ( int size in sizes )
76
+ foreach ( int length in lengths )
66
77
{
67
- yield return [ textSource . EnumerateRunes ( ) . Take ( size ) . ToArray ( ) , size ] ;
78
+ yield return textSource [ .. length ] ;
68
79
}
80
+
81
+ string textLongerThanStackallocThreshold = string . Concat ( Enumerable . Repeat ( textSource , 10 ) ) ;
82
+ yield return textLongerThanStackallocThreshold ;
69
83
}
70
84
}
0 commit comments