-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathMarshallBenchmark.cs
More file actions
166 lines (138 loc) · 6.32 KB
/
MarshallBenchmark.cs
File metadata and controls
166 lines (138 loc) · 6.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
class NotTooSafeStringReverse
{
public static void Main()
{
var a = BenchmarkRunner.Run<ReverseBench>();
}
public static string GetLargeString()
{
string insanOlmak = "Bu konularda kafa yoran ve bir türlü taşı yerine oturtamayan arkadaşlarla zaman, zaman “neden” diye tartışıp, fikir teatisinde bulunuruz.. Ne yazık ki, sonuçta konu hüsranla kapanır çoğunlukla.. Çünkü toplumun büyük bir kesiminde dostlukları, iyilikleri, güzellikleri, hizmetleri unutma ya hastalık olmuş, ya da işlerine geliyor, kararına varırız.. Maneviyata dönmek isteriz.. Ama nerde.. Aramak faydasız.. Manevi değerler dünyamıza gözümüzü kapattığımız ölçüde vefadan, minnet duygusundan, kadirbilir olmaktan kopup uzaklaşılmış olduğunu görürüz.. Anlarız ki, insanlık için önce insan olmak gerekir.. Aslında bize şöyle öğretmişti atalarımız.. “Aman haaa, bir fincan kahvenin kırk yıl hatırı vardır”.. “Komşu komşunun külüne muhtaçtır, iyi geçinin çevrenizdekilerle, sayın, sevin” derlerdi..Hatta bizlerin beyinlerine kazınacağına inandıkları hikayelerle nasihatte bulunurlardı.. Demek gerçekten başarılı olmuşlar, nasıl hayatımda beklentisiz hizmet aşkı coşkusu hiç eksilmediyse, her şeye rağmen anlatılan hikayeler de unutulmadı şükürler olsun.. Hem de tüm etkisiyle beynimde koruyor yerini.. Mesela bakın bir tanesi şöyleydi ve bu hikayenin insan üstüne hassasiyetini şimdi çok daha iyi anlıyorum.Küçük bir kız çocuğu çimenlerin üzerinde yürürken bir kelebeğin dikene takılıp kalmış olduğunu görür..Hemen koşar ve çok dikkatli bir şekilde kelebeği dikenden kurtarır..Kelebek sevinçle uçmaya başlar..Ve az sonra çok güzel ve iyi kalpli bir peri olarak geri döner..Küçük kıza “Güzel kız, bu iyiliğine karşı bende sana en çok istediğin şeyi vermek istiyorum” der..Küçük kız bir an düşünür ve cevap verir “Hayat boyu mutlu olmak istiyorum” Onun üzerine peri ona doğru eğilir ve kulağına bir şeyler fısıldar..Ardından birden bire gözden kaybolur..Kız büyür..Çevresindeki hiç kimse ondan daha mutlu değildir..Bu mutluluğun sırrını ona her sorduklarında yalnızca gülümser ve “iyi bir perinin sözünü dinledim” der..Seneler geçer ve bu mutlu yaşlının sırrının onunla birlikte öleceğinden korkan komşuları “Lütfen bu sırrı artık bize de söyle” diye yalvarırlar. “Perinin sana ne ";
string largeString = string.Empty;
for (int i = 0; i < 15; i++)
{
largeString += insanOlmak;
}
return largeString;
}
}
[MemoryDiagnoser]
public class ReverseBench
{
string largeString;
[GlobalSetup]
public void CreateLargeString()
{
largeString = NotTooSafeStringReverse.GetLargeString();
}
[Benchmark]
public void CustomReverseTest()
{
var a = largeString.CustomReverse();
}
[Benchmark]
public void LinqReverseTest()
{
var b = largeString.LinqReverse();
}
[Benchmark]
public void SpanReverseTest()
{
var c = largeString.SpanReverse();
}
[Benchmark]
public void MemoryReverseTest()
{
var d = largeString.MemoryReverse();
}
[Benchmark]
public void StringCreateReverseTest()
{
var d = largeString.StringCreateReverse();
}
}
public static class ExtensionString
{
public static string CustomReverse(this string script)
{
string result = null;
string strValue = script;
int strLength = strValue.Length;
// Allocate HGlobal memory for source and destination strings
IntPtr sourcePtr = Marshal.StringToHGlobalUni(strValue);
IntPtr destPtr = Marshal.StringToHGlobalUni(strValue);
// The unsafe section where byte pointers are used.
try
{
if (sourcePtr != IntPtr.Zero && destPtr != IntPtr.Zero)
{
unsafe
{
ushort* src = (ushort*)sourcePtr.ToPointer();
ushort* dst = (ushort*)destPtr.ToPointer();
if (strLength > 0)
{
// set the source pointer to the end of the string
// to do a reverse copy.
src += strLength - 1;
while (strLength-- > 0)
{
*dst++ = *src--;
}
*dst = 0;
}
}
result = Marshal.PtrToStringUni(destPtr);
}
return result;
}
finally
{
Marshal.FreeHGlobal(sourcePtr);
Marshal.FreeHGlobal(destPtr);
}
}
public static string LinqReverse(this string script)
{
var tmpString = new StringBuilder();
var reversedStr = script.Reverse();
foreach (var c in reversedStr)
{
tmpString.Append(c);
}
return tmpString.ToString();
}
public static string SpanReverse(this string script)
{
Span<char> spnStr = new Span<char>(script.ToCharArray());
spnStr.Reverse<char>();
return spnStr.ToString();
}
public static string MemoryReverse(this string script)
{
Memory<char> spnStr = new Memory<char>(script.ToCharArray());
spnStr.Span.Reverse<char>();
return spnStr.ToString();
}
public static string StringCreateReverse(this string script)
{
var text = script;
if (text == null)
throw new NullReferenceException();
if (text == string.Empty)
return text;
return string.Create(text.Length, text, (output, context) =>
{
int length = context.Length - 1;
for (int i = length; i >= 0; i--)
{
output[length - i] = context[i];
}
});
}
}