Temat: Czy znacie taką bibliotekę, którą zamienie mi...
Dawid Zawada:
Karim A.:
Sergiusz B.:
Co do wydajności to bez konkretnych liczb dyskusja wydaje się być bezcelowa.
Zgodzę się :)
(...)
Wynik działania:
Regex: 850,4706
StrSplit: 317,4909
String.Split prawie 3x wydajniejszy ;-)
Wyrażenia regularne potrafią być wydajne zarówno w tych mniej, jak i bardziej skomplikowanych przypadkach. Problem z nimi jest taki, że jeśli się nie zna dobrze składni i nie wie, chociaż pobieżnie, jak to wszystko działa pod maską, to bardzo łatwo jest wdepnąć w wydajnościową dziurę.
Dla porównania taki kod:
static void Main( string[] args )
{
Stopwatch timer = new Stopwatch();
string testString = File.ReadAllText(Environment.GetFolderPath( Environment.SpecialFolder.Desktop ) + "\\text.txt");
string[] result;
timer.Start();
Regex regex = new Regex( @"\r\n", RegexOptions.Compiled );
for( int i = 0; i < 30000; i++ )[/quote]> result = regex.Split( testString );[quote]
timer.Stop();
TimeSpan regexTime = timer.Elapsed;
timer.Reset();
timer.Start();
for (int i = 0; i < 30000; i++)[/quote]> result = testString.Split(new[] { [quote]Environment.NewLine }, StringSplitOptions.None);
timer.Stop();
TimeSpan stringSplitTime = timer.Elapsed;
Console.WriteLine("Regex: {0}", regexTime.TotalMilliseconds);
Console.WriteLine("StrSplit: {0}", stringSplitTime.TotalMilliseconds);
Console.ReadLine();
}
I mam nieznaczną przewagę regexa :)
Jeśli już tak tuningujemy to dzielmy po charach a nie po stringach i będzie minimalna różnica po stronie str.split :P hehe (na tyle minimalna, że można ją lekceważyć)
To co chciałem podkreślić w mojej pierwszej odpowiedzi, to jest to, że bardzo często ludzie używają narzędzi które są niepotrzebnie za ciężkie / nieoptymalne do danego zadania.
Osobiście, jakbym musiał wykonać identycznie takie dzielenie stringów jak w tym temacie to bym nie użył ani jednej ani drugiej metody, tylko po prostu jedną pętlę for która zrobi to kilka razy szybciej a wysiłek ten sam.
Tak jako ciekawostka:
static void Main(string[] args)
{
Stopwatch timer = new Stopwatch();
string testString = File.ReadAllText(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\text.txt");
string[] result;
timer.Start();
Regex regex = new Regex(@"\r\n", RegexOptions.Compiled);
for (int i = 0; i < 30000; i++)
result = regex.Split(testString);
timer.Stop();
TimeSpan regexTime = timer.Elapsed;
timer.Reset();
timer.Start();
for (int i = 0; i < 30000; i++)
result = testString.Split(new[] { '\r','\n' }, StringSplitOptions.RemoveEmptyEntries);
timer.Stop();
TimeSpan stringSplitTime = timer.Elapsed;
List<String> lines = new List<string>();
timer.Reset();
timer.Start();
for (int i = 0, lastPos = 0; i < 3000; i++, lastPos = 0)
{
for (int j = 0; j < testString.Length - 1; j++)
{
if (testString[j] == '\r' && testString[j + 1] == '\n')
{
lines.Add(testString.Substring(lastPos, j - lastPos));
j += 2;
lastPos = j;
}
}
lines.Add(testString.Substring(lastPos, testString.Length - lastPos));
}
TimeSpan manualTime = timer.Elapsed;
Console.WriteLine("Regex: {0}", regexTime.TotalMilliseconds);
Console.WriteLine("StrSplit: {0}", stringSplitTime.TotalMilliseconds);
Console.WriteLine("Manual: {0}", manualTime.TotalMilliseconds);
Console.ReadLine();
}
Wynik:
Regex: 791,965
StrSplit: 771,9464
Manual: 118,0244