473,583 Members | 3,114 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

A test about searching in a String I promised Jay B.

Cor
Hallo,

I have promised Jay B yesterday to do some tests.

The subject was a string evaluation that Jon had send in. Jay B was in doubt
what was better because there was a discussion in the C# newsgroup on 25
September. The regular expressions where in that newsgroup too involved.

I told yesterday night, to Jay that I would test all 4 methods and the
stupid method I was thinking of the first time that night when I saw Jon's
code. Herfried said from that, that it would become slow with a string from
10Mb. So I told Herfried that I would make the test program if he would type
in a real mixed string for me. But till now he did not send that. (Or maybe
he has again problems with the newsgroup server)

To Jay B I told also that I would try to test extra the difference between
the Microsoft.visua l basic function Instr and the system function indexof.

The methods I tested were:
- a do until method with index of (Jay B)
- a do method with Instr (Jon)
- the same I changed something to indexof (Jon)
Those works all with strings
The others only with characters as a search item
- a stupid method that only needs 2 lines code what became in my thoughts
yesterday night
- a indexof with a char (Jay B)
- a for each with a char (Jay B)
I made a test program that I send with this message beneath.
Because all is dependable on the computer you use, I don't give absolute
figures if you wish you can try it yourself. On my computer it is impossible
to see with any method a difference from more than 1/1000 of a second with a
string shorter than 5000 characters.
With more than that amount of characters that the stupid method I thought of
yesterday becomes visible slower.

When it are real long strings, than with a charsearch was in my test the
fastest method the "do for loop" with "indexof" and second was the for "each
char" both from Jay B.

But for me the most surprising was that the Microsoft.visua lbasic function
with "Instr" from Jon was almost 2 times faster with a 3 character string
than the net.system method "indexoff".

I do the test program beneath; it is made with a windowsform project, and
need 2 textboxes from which textbox1 needs to have multi line true, a
button1 and a large label1.

Texbox1 is for the text to make a string with (automaticly made till
Herfried send his in).
Textbox2 the length of the text string to make (Yes you understand it
till....)

I hope this gives some idea's (too about some people who said the
microsoft.visua lbasic functions are slow and outdated, This you can of
course not test with C#.)
Cor
\\\
Private Sub Button1_Click(B yVal sender _
As Object, ByVal e As System.EventArg s) Handles Button1.Click
If Me.TextBox1.Tex t = "" Then
Me.label1.Text = "Enter strings in uper textbox"
Exit Sub
End If
If Not IsNumeric(Me.Te xtBox2.Text) Then
Me.label1.Text = "Enter value in down textbox"
Exit Sub
End If
TestString.Buil d(Me.TextBox1.T ext.ToString, CInt(Me.TextBox 2.Text))
Dim delimiter As String
If TestString.Stri ngToTest.Length > 3 Then
delimiter = TestString.Stri ngToTest.Substr ing(0, 3)
Else
Exit Sub
End If
Dim i As Integer
Dim labeltext As New System.Text.Str ingBuilder
Dim count As Integer
Dim testname As String
For i = 1 To 3
Dim StartTick As Integer = Environment.Tic kCount
Select Case i
Case 1
testname = "Jay B, string "
count = Test1(TestStrin g.StringToTest, delimiter)
Case 2
testname = "Jon, string "
count = Test2(TestStrin g.StringToTest, delimiter)
Case 3
testname = "Jon, but with indexof"
count = Test3(TestStrin g.StringToTest, delimiter)
End Select
Dim Elapsed As Integer = Environment.Tic kCount - StartTick
labeltext.Appen d(testname & "count: " & _
count & " Elapsed : " & Elapsed.ToStrin g & vbCrLf)
Next
delimiter = delimiter.Subst ring(0, 1)
labeltext.Appen d("characters " & vbCrLf)
For i = 1 To 6
Dim StartTick As Integer = Environment.Tic kCount
Select Case i
Case 1
testname = "Jay B, string "
count = Test1(TestStrin g.StringToTest, delimiter)
Case 2
testname = "Jon, string "
count = Test2(TestStrin g.StringToTest, delimiter)
Case 3
testname = "Jon, but with indexof "
count = Test3(TestStrin g.StringToTest, delimiter)
Case 4
If TestString.Stri ngToTest.Length < 599999 Then
testname = "Cor stupid "
count = Test4(TestStrin g.StringToTest, delimiter)
Else
testname = "Skipped test"
End If
Case 5
testname = "Jay B char do until "
count = test5(TestStrin g.StringToTest, delimiter)
Case 6
testname = "Jay B char for each "
count = test6(TestStrin g.StringToTest, delimiter)
End Select
Dim Elapsed As Integer = Environment.Tic kCount - StartTick
labeltext.Appen d(testname & "count: " & _
count & " Elapsed : " & Elapsed.ToStrin g & vbCrLf)
Next
Me.label1.Text = labeltext.ToStr ing

End Sub
Private Sub Form1_Load(ByVa l sender As Object, ByVal _
e As System.EventArg s) Handles MyBase.Load
Me.Button1.Text = "start test"
End Sub
Public Function Test1(ByVal input As String, ByVal delimiter _
As String) As Integer 'Jay B 1(string)
Dim count, index As Integer
index = input.IndexOf(d elimiter)
Do Until index < 0
count += 1
index = input.IndexOf(d elimiter, index + 1)
Loop
Return count
End Function
Public Function Test2(ByVal strInput As String, ByVal strDelimiter _
As String) As Int32 'Jon (string)
Dim iStart As Int32, iCount As Int32, iResult As Int32
iStart = 1
iCount = 0
Do
iResult = InStr(iStart, strInput, strDelimiter)
If iResult = 0 Then Exit Do
iCount += 1
iStart = iResult + 1
Loop
Return iCount
End Function
Public Function Test3(ByVal input As String, ByVal delimiter _
As String) As Integer 'Jon with indexof(x,x,x)
Dim iStart As Int32, iCount As Int32, iResult As Int32
iStart = 0
iCount = 0
Do
iResult = input.IndexOf(d elimiter, iStart)
If iResult = -1 Then Exit Do
iCount += 1
iStart = iResult + 1
Loop
Return iCount
End Function
Public Function Test4(ByVal input As String, ByVal delimiter _
As String) As Integer 'Cor stupid
Dim teststring As String() = Split(input, delimiter)
Return teststring.Leng th - 1
End Function
Public Function test5(ByVal input As String, ByVal _
delimiter As Char) As Integer 'Jay 1(char)
Dim count, index As Integer
index = input.IndexOf(d elimiter)
Do Until index < 0
count += 1
index = input.IndexOf(d elimiter, index + 1)
Loop
Return count
End Function
Public Shared Function test6(ByVal input As String, _
ByVal delimiter As Char) As Integer 'JayB 2(char)
Dim count As Integer
For Each ch As Char In input
If ch = delimiter Then
count += 1
End If
Next ch
Return count
End Function
End Class
Public Class TestString
Private Shared mStringTest As String
Public Shared ReadOnly Property StringToTest() As String
Get
Return mStringTest
End Get
End Property
Public Shared Sub Build(ByVal strToTest As String, ByVal x As Integer)
Dim strTest As New System.Text.Str ingBuilder
Dim strTextbox As String() = Split(strToTest , vbCrLf)
Do While strTest.ToStrin g.Length < x
Dim i As Integer
For i = 0 To strTextbox.Leng th - 1
Dim y As Integer
For y = 0 To i
If strTest.ToStrin g.Length < x / 2 Then
strTest.Append( strTest.ToStrin g & strTextbox(i))
Else
strTest.Append( strTest.ToStrin g.Substring(0, x / 2) _
& strTextbox(i))
End If

Next
Next
Loop
mStringTest = strTest.ToStrin g.Substring(0, x)
End Sub
End Class
///
Nov 20 '05 #1
35 2553
Hi Cor,

|| Herfried said from that, that it would become slow
|| with a string from 10Mb. So I told Herfried that I
|| would make the test program if he would type in a
|| real mixed string for me. But till now he did not send
|| that. (Or maybe he has again problems with the
|| newsgroup server)

I've just been speaking to Herfried at the Hospital - it's not looking
good. He got as far as character 432764 before the pain was too much to bear.
The doctors have diagnosed the most severe case of RSI that they have seen in
years. Not surprising when Herfried was typing as fast as he couldto get you
the file in time. Unfortunately amputation may be the most reasonable outcome.
:-((

Regards,
Fergus
Nov 20 '05 #2
"Fergus Cooney" <fi******@tesco .net> scripsit:
Herfried said from that, that it would become slow
with a string from 10Mb. So I told Herfried that I

I told that it will consume a lot of memory, but I never told that the
performance will be bad.
I've just been speaking to Herfried at the Hospital
- it's not looking good. He got as far as character
432764 before the pain was too much to bear. The doctors
have diagnosed the most severe case of RSI that
What's RSI?
they have seen in years. Not surprising when Herfried was
typing as fast as he couldto get you the file in time.
Unfortunately amputation may be the most reasonable outcome.
:-((


:-(

--
Herfried K. Wagner
MVP · VB Classic, VB.NET
<http://www.mvps.org/dotnet>
Nov 20 '05 #3
Hi Herfried,

Repetitive Strain Injury - what you get from typing too much for too long.
How's the wrist now - do the doctors still think the hand will have to come
off? ;-)

Regards,
Fergus
Nov 20 '05 #4
Cor
Because all is dependable on the computer you use, I don't give absolute
figures if you wish you can try it yourself. On my computer it is impossible to see with any method a difference from more than 1/1000 of a second with a string shorter than 5000 characters. When timing really fast functions like this, what you can do is put the
function in a loop, and call the function 1000 times, as long as you call
all the functions 1000 times you are safe to compare the amount of time they
took. You can increase the # of times you loop depending on how quick the
function. The danger becomes you start timing the loop itself and lose the
fact you are timing a function.

Jon Skeet a C# MVP wrote up the following on benchmarking, the samples are
in C# however the concepts should apply to VB.NET benchmarks.

http://www.yoda.arachsys.com/csharp/benchmark.html

BTW: Thank you for the code!

Hope this helps
Jay

"Cor" <no*@non.com> wrote in message
news:3f******** **************@ reader20.wxs.nl ... Hallo,

I have promised Jay B yesterday to do some tests.

The subject was a string evaluation that Jon had send in. Jay B was in doubt what was better because there was a discussion in the C# newsgroup on 25
September. The regular expressions where in that newsgroup too involved.

I told yesterday night, to Jay that I would test all 4 methods and the
stupid method I was thinking of the first time that night when I saw Jon's
code. Herfried said from that, that it would become slow with a string from 10Mb. So I told Herfried that I would make the test program if he would type in a real mixed string for me. But till now he did not send that. (Or maybe he has again problems with the newsgroup server)

To Jay B I told also that I would try to test extra the difference between
the Microsoft.visua l basic function Instr and the system function indexof.

The methods I tested were:
- a do until method with index of (Jay B)
- a do method with Instr (Jon)
- the same I changed something to indexof (Jon)
Those works all with strings
The others only with characters as a search item
- a stupid method that only needs 2 lines code what became in my thoughts
yesterday night
- a indexof with a char (Jay B)
- a for each with a char (Jay B)
I made a test program that I send with this message beneath.
Because all is dependable on the computer you use, I don't give absolute
figures if you wish you can try it yourself. On my computer it is impossible to see with any method a difference from more than 1/1000 of a second with a string shorter than 5000 characters.
With more than that amount of characters that the stupid method I thought of yesterday becomes visible slower.

When it are real long strings, than with a charsearch was in my test the
fastest method the "do for loop" with "indexof" and second was the for "each char" both from Jay B.

But for me the most surprising was that the Microsoft.visua lbasic function with "Instr" from Jon was almost 2 times faster with a 3 character string
than the net.system method "indexoff".

I do the test program beneath; it is made with a windowsform project, and
need 2 textboxes from which textbox1 needs to have multi line true, a
button1 and a large label1.

Texbox1 is for the text to make a string with (automaticly made till
Herfried send his in).
Textbox2 the length of the text string to make (Yes you understand it
till....)

I hope this gives some idea's (too about some people who said the
microsoft.visua lbasic functions are slow and outdated, This you can of
course not test with C#.)
Cor
\\\
Private Sub Button1_Click(B yVal sender _
As Object, ByVal e As System.EventArg s) Handles Button1.Click
If Me.TextBox1.Tex t = "" Then
Me.label1.Text = "Enter strings in uper textbox"
Exit Sub
End If
If Not IsNumeric(Me.Te xtBox2.Text) Then
Me.label1.Text = "Enter value in down textbox"
Exit Sub
End If
TestString.Buil d(Me.TextBox1.T ext.ToString, CInt(Me.TextBox 2.Text))
Dim delimiter As String
If TestString.Stri ngToTest.Length > 3 Then
delimiter = TestString.Stri ngToTest.Substr ing(0, 3)
Else
Exit Sub
End If
Dim i As Integer
Dim labeltext As New System.Text.Str ingBuilder
Dim count As Integer
Dim testname As String
For i = 1 To 3
Dim StartTick As Integer = Environment.Tic kCount
Select Case i
Case 1
testname = "Jay B, string "
count = Test1(TestStrin g.StringToTest, delimiter)
Case 2
testname = "Jon, string "
count = Test2(TestStrin g.StringToTest, delimiter)
Case 3
testname = "Jon, but with indexof"
count = Test3(TestStrin g.StringToTest, delimiter)
End Select
Dim Elapsed As Integer = Environment.Tic kCount - StartTick
labeltext.Appen d(testname & "count: " & _
count & " Elapsed : " & Elapsed.ToStrin g & vbCrLf)
Next
delimiter = delimiter.Subst ring(0, 1)
labeltext.Appen d("characters " & vbCrLf)
For i = 1 To 6
Dim StartTick As Integer = Environment.Tic kCount
Select Case i
Case 1
testname = "Jay B, string "
count = Test1(TestStrin g.StringToTest, delimiter)
Case 2
testname = "Jon, string "
count = Test2(TestStrin g.StringToTest, delimiter)
Case 3
testname = "Jon, but with indexof "
count = Test3(TestStrin g.StringToTest, delimiter)
Case 4
If TestString.Stri ngToTest.Length < 599999 Then
testname = "Cor stupid "
count = Test4(TestStrin g.StringToTest, delimiter)
Else
testname = "Skipped test"
End If
Case 5
testname = "Jay B char do until "
count = test5(TestStrin g.StringToTest, delimiter)
Case 6
testname = "Jay B char for each "
count = test6(TestStrin g.StringToTest, delimiter)
End Select
Dim Elapsed As Integer = Environment.Tic kCount - StartTick
labeltext.Appen d(testname & "count: " & _
count & " Elapsed : " & Elapsed.ToStrin g & vbCrLf)
Next
Me.label1.Text = labeltext.ToStr ing

End Sub
Private Sub Form1_Load(ByVa l sender As Object, ByVal _
e As System.EventArg s) Handles MyBase.Load
Me.Button1.Text = "start test"
End Sub
Public Function Test1(ByVal input As String, ByVal delimiter _
As String) As Integer 'Jay B 1(string)
Dim count, index As Integer
index = input.IndexOf(d elimiter)
Do Until index < 0
count += 1
index = input.IndexOf(d elimiter, index + 1)
Loop
Return count
End Function
Public Function Test2(ByVal strInput As String, ByVal strDelimiter _
As String) As Int32 'Jon (string)
Dim iStart As Int32, iCount As Int32, iResult As Int32
iStart = 1
iCount = 0
Do
iResult = InStr(iStart, strInput, strDelimiter)
If iResult = 0 Then Exit Do
iCount += 1
iStart = iResult + 1
Loop
Return iCount
End Function
Public Function Test3(ByVal input As String, ByVal delimiter _
As String) As Integer 'Jon with indexof(x,x,x)
Dim iStart As Int32, iCount As Int32, iResult As Int32
iStart = 0
iCount = 0
Do
iResult = input.IndexOf(d elimiter, iStart)
If iResult = -1 Then Exit Do
iCount += 1
iStart = iResult + 1
Loop
Return iCount
End Function
Public Function Test4(ByVal input As String, ByVal delimiter _
As String) As Integer 'Cor stupid
Dim teststring As String() = Split(input, delimiter)
Return teststring.Leng th - 1
End Function
Public Function test5(ByVal input As String, ByVal _
delimiter As Char) As Integer 'Jay 1(char)
Dim count, index As Integer
index = input.IndexOf(d elimiter)
Do Until index < 0
count += 1
index = input.IndexOf(d elimiter, index + 1)
Loop
Return count
End Function
Public Shared Function test6(ByVal input As String, _
ByVal delimiter As Char) As Integer 'JayB 2(char)
Dim count As Integer
For Each ch As Char In input
If ch = delimiter Then
count += 1
End If
Next ch
Return count
End Function
End Class
Public Class TestString
Private Shared mStringTest As String
Public Shared ReadOnly Property StringToTest() As String
Get
Return mStringTest
End Get
End Property
Public Shared Sub Build(ByVal strToTest As String, ByVal x As Integer)
Dim strTest As New System.Text.Str ingBuilder
Dim strTextbox As String() = Split(strToTest , vbCrLf)
Do While strTest.ToStrin g.Length < x
Dim i As Integer
For i = 0 To strTextbox.Leng th - 1
Dim y As Integer
For y = 0 To i
If strTest.ToStrin g.Length < x / 2 Then
strTest.Append( strTest.ToStrin g & strTextbox(i))
Else
strTest.Append( strTest.ToStrin g.Substring(0, x / 2) _
& strTextbox(i))
End If

Next
Next
Loop
mStringTest = strTest.ToStrin g.Substring(0, x)
End Sub
End Class
///

Nov 20 '05 #5
Cor
Jay,
Thanks for the tip, but I am not intrested in differences between functions
who take less than 1/1000 of a second, if you are, we can try it.
Cor
When timing really fast functions like this, what you can do is put the
function in a loop, and call the function 1000 times, as long as you call
all the functions 1000 times you are safe to compare the amount of time theytook. You can increase the # of times you loop depending on how quick the
function. The danger becomes you start timing the loop itself and lose the
fact you are timing a function.

Nov 20 '05 #6
Cor
Herfried,
I am very sorry, I did not know that it would take such an amount of effort
for you to make that string.
Don't botter, I think that string of 422764 characters is as well as 10Mb,
other wise I just can do:
stringA = StringA + StringA + StringA and then it has enough characters to
do the test.

But lets not talk about those not so important things, more important is
your health.
I am worried about your hamster too, is somebode feeding it?

I hope the RSI is soon over.

Good luck

Cor

Nov 20 '05 #7
Good morning Cor. :-)

ROFL.

Regards,
Fergus
Nov 20 '05 #8
"Cor" <no*@non.com> scripsit:
I am very sorry, I did not know that it would take such an amount of effort
for you to make that string.
:-)
Don't botter, I think that string of 422764 characters is as well as 10Mb,
other wise I just can do:
stringA = StringA + StringA + StringA and then it has enough characters to
do the test.
Use "&" to concatenate a string. You you want it to be faster, use a 'StringBuilder' .
But lets not talk about those not so important things, more important is
your health.
I am worried about your hamster too, is somebode feeding it?
I feeded it in the morning.
I hope the RSI is soon over.


;-)

--
Herfried K. Wagner
MVP · VB Classic, VB.NET
<http://www.mvps.org/dotnet>
Nov 20 '05 #9
"Fergus Cooney" <fi******@tesco .net> scripsit:
Repetitive Strain Injury - what you get from typing too much for too long.
How's the wrist now - do the doctors still think the hand will have to come
off? ;-)


ROFLM*O

--
Herfried K. Wagner
MVP · VB Classic, VB.NET
<http://www.mvps.org/dotnet>
Nov 20 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
2592
by: Mark Carter | last post by:
In v0.2.0 starting boa.py produces the error message: File "C:\Python23\Lib\site-packages\wxPython\tools\boa\About.py", line 301, in write ss = string.strip(s) NameError: global name 'string' is not defined It appears that string is not imported in many modules, because fixing this gives the further error:
2
1836
by: Roberto Dias | last post by:
Hi all, What to do for searching for more than one string occurrence in the same string (this last are line of a text). I have used getline(), to get the text lines by means of WHILE loop and find(), to searching. When find() finds a first occurrence it scape and don't detect possible other one in the same string. Here is a fragment: ...
1
1650
by: Crimarc | last post by:
I come back to ask qustion what did he promised you that you soudned so much happy and sometime later so painful like you heart broken becase of his dificults ???? What did you sacrifice for C++ things, means how much effort you spend for c++ so far to becaome takable like a professional ? I know C++ overloading functions always hardest to...
34
14994
by: Kishor | last post by:
Hi Friends Click here : www.c4swimmers.esmartguy.com to Test Your C Programming Strengths. You can find Tricky Questions on C, Interview type queries on C, Infrequently Answered Questions in C and many more... Thank You Regards
4
2541
by: Pokerkook | last post by:
Hello, If anybody could help me with this I would greatly appreciate it. Or at least tell me why I get the output of this garbage: 49 49 10 49 52
11
2918
by: HopfZ | last post by:
I coudn't understand some behavior of RegExp.test function. Example html code: ---------------- <html><head></head><body><script type="text/javascript"> var r = /^https?:\/\//g; document.write( ); </script></body></html> ---------------------
17
5247
by: Petyr David | last post by:
Just looking for the simplest. right now my perl script returns an error messge to the user if the date string is invalid. would like to do this before accessing the server. TX
18
2411
by: Umesh | last post by:
Do you have any answer to it? thx.
3
2496
by: yogi_bear_79 | last post by:
I'm sure I have a few things wrong here. But I am stuck on how to do a recurring search. Also my statement cin >quote; acts weird. If I enter more than one word it blows right past cin >findMe; and completes and exits the code. If you string for cin >quote; is one word it behaves correctly or at least in that regard! #include...
0
7896
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main...
0
8328
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that...
0
6581
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then...
0
5375
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert...
0
3820
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in...
0
3845
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
2334
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
1
1434
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
1158
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.