O(n^2) faster than O(n)?
up vote
-4
down vote
favorite
I wrote a small program to test the speed of two separate extension methods I created, detailed in the below screenshot:
public static class Extensions
{
public static List<string> ParseEmails(this string emails, char charsToSplitOn)
{
List<string> list = new List<string>();
foreach (string email in emails)
{
string splitArr = email.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in splitArr)
{
list.Add(item);
}
}
return list;
}
public static string ParseEmails2(this string emails, char charsToSplitOn)
{
string str = string.Empty;
foreach (string item in emails)
{
str += item + ';';
}
return str.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
}
}
The Main method initializes a Stopwatch
class to track the time each method takes to execute iterations
amount of times.
The first method, ParseEmails
has a for
loop within another for
loop, while the second method 'ParseEmails2' has only one for
loop.
I would expect that then the second method, ParseEmails2
, would be faster, as, from my understanding, this is done in O(n) time, whereas my first method, ParseEmails
, is done in O(n^2) time.
If this is true, then shouldn't my results point to ParseEmails2
being the faster of the two methods?
c# .net big-o
add a comment |
up vote
-4
down vote
favorite
I wrote a small program to test the speed of two separate extension methods I created, detailed in the below screenshot:
public static class Extensions
{
public static List<string> ParseEmails(this string emails, char charsToSplitOn)
{
List<string> list = new List<string>();
foreach (string email in emails)
{
string splitArr = email.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in splitArr)
{
list.Add(item);
}
}
return list;
}
public static string ParseEmails2(this string emails, char charsToSplitOn)
{
string str = string.Empty;
foreach (string item in emails)
{
str += item + ';';
}
return str.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
}
}
The Main method initializes a Stopwatch
class to track the time each method takes to execute iterations
amount of times.
The first method, ParseEmails
has a for
loop within another for
loop, while the second method 'ParseEmails2' has only one for
loop.
I would expect that then the second method, ParseEmails2
, would be faster, as, from my understanding, this is done in O(n) time, whereas my first method, ParseEmails
, is done in O(n^2) time.
If this is true, then shouldn't my results point to ParseEmails2
being the faster of the two methods?
c# .net big-o
Code is now posted as code.
– Delfino
Nov 19 at 18:41
1
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
ParseEmails2 creates morestring
instances
– Encrypt0r
Nov 19 at 18:43
1
ParseEmails
is not O(n^2) sincen
would be the number of emails but the inner loop depends on the number of elements in the split array instead.str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.
– Lee
Nov 19 at 18:46
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55
add a comment |
up vote
-4
down vote
favorite
up vote
-4
down vote
favorite
I wrote a small program to test the speed of two separate extension methods I created, detailed in the below screenshot:
public static class Extensions
{
public static List<string> ParseEmails(this string emails, char charsToSplitOn)
{
List<string> list = new List<string>();
foreach (string email in emails)
{
string splitArr = email.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in splitArr)
{
list.Add(item);
}
}
return list;
}
public static string ParseEmails2(this string emails, char charsToSplitOn)
{
string str = string.Empty;
foreach (string item in emails)
{
str += item + ';';
}
return str.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
}
}
The Main method initializes a Stopwatch
class to track the time each method takes to execute iterations
amount of times.
The first method, ParseEmails
has a for
loop within another for
loop, while the second method 'ParseEmails2' has only one for
loop.
I would expect that then the second method, ParseEmails2
, would be faster, as, from my understanding, this is done in O(n) time, whereas my first method, ParseEmails
, is done in O(n^2) time.
If this is true, then shouldn't my results point to ParseEmails2
being the faster of the two methods?
c# .net big-o
I wrote a small program to test the speed of two separate extension methods I created, detailed in the below screenshot:
public static class Extensions
{
public static List<string> ParseEmails(this string emails, char charsToSplitOn)
{
List<string> list = new List<string>();
foreach (string email in emails)
{
string splitArr = email.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
foreach (string item in splitArr)
{
list.Add(item);
}
}
return list;
}
public static string ParseEmails2(this string emails, char charsToSplitOn)
{
string str = string.Empty;
foreach (string item in emails)
{
str += item + ';';
}
return str.Replace(" ", "").Split(charsToSplitOn, StringSplitOptions.RemoveEmptyEntries);
}
}
The Main method initializes a Stopwatch
class to track the time each method takes to execute iterations
amount of times.
The first method, ParseEmails
has a for
loop within another for
loop, while the second method 'ParseEmails2' has only one for
loop.
I would expect that then the second method, ParseEmails2
, would be faster, as, from my understanding, this is done in O(n) time, whereas my first method, ParseEmails
, is done in O(n^2) time.
If this is true, then shouldn't my results point to ParseEmails2
being the faster of the two methods?
c# .net big-o
c# .net big-o
edited Nov 19 at 18:41
asked Nov 19 at 18:38
Delfino
4131622
4131622
Code is now posted as code.
– Delfino
Nov 19 at 18:41
1
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
ParseEmails2 creates morestring
instances
– Encrypt0r
Nov 19 at 18:43
1
ParseEmails
is not O(n^2) sincen
would be the number of emails but the inner loop depends on the number of elements in the split array instead.str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.
– Lee
Nov 19 at 18:46
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55
add a comment |
Code is now posted as code.
– Delfino
Nov 19 at 18:41
1
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
ParseEmails2 creates morestring
instances
– Encrypt0r
Nov 19 at 18:43
1
ParseEmails
is not O(n^2) sincen
would be the number of emails but the inner loop depends on the number of elements in the split array instead.str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.
– Lee
Nov 19 at 18:46
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55
Code is now posted as code.
– Delfino
Nov 19 at 18:41
Code is now posted as code.
– Delfino
Nov 19 at 18:41
1
1
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
ParseEmails2 creates more
string
instances– Encrypt0r
Nov 19 at 18:43
ParseEmails2 creates more
string
instances– Encrypt0r
Nov 19 at 18:43
1
1
ParseEmails
is not O(n^2) since n
would be the number of emails but the inner loop depends on the number of elements in the split array instead. str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.– Lee
Nov 19 at 18:46
ParseEmails
is not O(n^2) since n
would be the number of emails but the inner loop depends on the number of elements in the split array instead. str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.– Lee
Nov 19 at 18:46
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55
add a comment |
4 Answers
4
active
oldest
votes
up vote
0
down vote
You have to be precise about what you mean by O(n^2)
. What is n
? If n corresponds to the number of emails (in the emails
array), then the first method runs on the scale of O(n)
, because you iterate over all emails once.
In the second method you use string concatenation, which means that you create a new string each run of the loop resulting in a complexity of O(n^2)
.
Prefer using StringBuilder
or Lists over concatenating strings inside a loop.
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
add a comment |
up vote
0
down vote
Well...you don't seem to understand the purpose of the O
-notation, O
is less about the performance and more about the consistancy of performance. O(n²)
means a parabola and O(n)
a straight line, but it doesn't tell you about the actual time. So once you get to many elements, the O(n)
algorithm should be faster. A reason for that could be that you use string
's +=
and +
operators which use the copy on write
-semantic of C# string
.
add a comment |
up vote
-1
down vote
ParseEmails2 is not actually O(n), because
str += item + ';';
contains a loop.
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
|
show 2 more comments
up vote
-1
down vote
you should check this link. string concatenation vs builder performance
String concatenation vs String Builder. Performance
The string builder will most likely be marginally faster in this case, but really it's probably not going to be enough to fret about. The number of times you are re-creating the string (because strings are immutable and joining forces a new string to be created from the two existing ones).
Because of memory allocation on very step will cause more time.
add a comment |
4 Answers
4
active
oldest
votes
4 Answers
4
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
You have to be precise about what you mean by O(n^2)
. What is n
? If n corresponds to the number of emails (in the emails
array), then the first method runs on the scale of O(n)
, because you iterate over all emails once.
In the second method you use string concatenation, which means that you create a new string each run of the loop resulting in a complexity of O(n^2)
.
Prefer using StringBuilder
or Lists over concatenating strings inside a loop.
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
add a comment |
up vote
0
down vote
You have to be precise about what you mean by O(n^2)
. What is n
? If n corresponds to the number of emails (in the emails
array), then the first method runs on the scale of O(n)
, because you iterate over all emails once.
In the second method you use string concatenation, which means that you create a new string each run of the loop resulting in a complexity of O(n^2)
.
Prefer using StringBuilder
or Lists over concatenating strings inside a loop.
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
add a comment |
up vote
0
down vote
up vote
0
down vote
You have to be precise about what you mean by O(n^2)
. What is n
? If n corresponds to the number of emails (in the emails
array), then the first method runs on the scale of O(n)
, because you iterate over all emails once.
In the second method you use string concatenation, which means that you create a new string each run of the loop resulting in a complexity of O(n^2)
.
Prefer using StringBuilder
or Lists over concatenating strings inside a loop.
You have to be precise about what you mean by O(n^2)
. What is n
? If n corresponds to the number of emails (in the emails
array), then the first method runs on the scale of O(n)
, because you iterate over all emails once.
In the second method you use string concatenation, which means that you create a new string each run of the loop resulting in a complexity of O(n^2)
.
Prefer using StringBuilder
or Lists over concatenating strings inside a loop.
edited Nov 19 at 19:02
answered Nov 19 at 18:48
areller
1,49511528
1,49511528
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
add a comment |
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
"both methods run on the scale of O(n), because in both methods you iterate once over all emails." That's only true if the body of the loop is an O(1) operation, which it is not.
– Servy
Nov 19 at 18:51
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
@Servy The body of the loop is constant in terms of the number of emails, it depends on the size of individual emails. This is where you have to apply common sense and ask yourself whether you have to worry about high variance in size of different emails, if not, you can treat it as a constant.
– areller
Nov 19 at 18:53
1
1
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
That statement is true for the first solution. The second solution's loop body's execution time is dependent on the number of emails.
– Servy
Nov 19 at 18:55
add a comment |
up vote
0
down vote
Well...you don't seem to understand the purpose of the O
-notation, O
is less about the performance and more about the consistancy of performance. O(n²)
means a parabola and O(n)
a straight line, but it doesn't tell you about the actual time. So once you get to many elements, the O(n)
algorithm should be faster. A reason for that could be that you use string
's +=
and +
operators which use the copy on write
-semantic of C# string
.
add a comment |
up vote
0
down vote
Well...you don't seem to understand the purpose of the O
-notation, O
is less about the performance and more about the consistancy of performance. O(n²)
means a parabola and O(n)
a straight line, but it doesn't tell you about the actual time. So once you get to many elements, the O(n)
algorithm should be faster. A reason for that could be that you use string
's +=
and +
operators which use the copy on write
-semantic of C# string
.
add a comment |
up vote
0
down vote
up vote
0
down vote
Well...you don't seem to understand the purpose of the O
-notation, O
is less about the performance and more about the consistancy of performance. O(n²)
means a parabola and O(n)
a straight line, but it doesn't tell you about the actual time. So once you get to many elements, the O(n)
algorithm should be faster. A reason for that could be that you use string
's +=
and +
operators which use the copy on write
-semantic of C# string
.
Well...you don't seem to understand the purpose of the O
-notation, O
is less about the performance and more about the consistancy of performance. O(n²)
means a parabola and O(n)
a straight line, but it doesn't tell you about the actual time. So once you get to many elements, the O(n)
algorithm should be faster. A reason for that could be that you use string
's +=
and +
operators which use the copy on write
-semantic of C# string
.
answered Nov 19 at 20:49
chrissx
14
14
add a comment |
add a comment |
up vote
-1
down vote
ParseEmails2 is not actually O(n), because
str += item + ';';
contains a loop.
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
|
show 2 more comments
up vote
-1
down vote
ParseEmails2 is not actually O(n), because
str += item + ';';
contains a loop.
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
|
show 2 more comments
up vote
-1
down vote
up vote
-1
down vote
ParseEmails2 is not actually O(n), because
str += item + ';';
contains a loop.
ParseEmails2 is not actually O(n), because
str += item + ';';
contains a loop.
answered Nov 19 at 18:41
Timbo
21.7k103966
21.7k103966
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
|
show 2 more comments
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@HenkHolterman Does the compiler optimize away all the re-allocation and copying the ever growing string into new string objects?
– Timbo
Nov 19 at 18:46
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:
str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
@Timbo it does create a new instance, but it's not a loop. It's equivalent of saying:
str = str + item + ';'
– Encrypt0r
Nov 19 at 18:47
1
1
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Encrypt0r But initializing the new instance with characters does iterate over all the characters of the the parts string is constructed from?
– Timbo
Nov 19 at 18:49
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
@Timbo well, in that case, Replace and Split are also loops. I think concatenating two strings in c# should be considered as one operation.
– Encrypt0r
Nov 19 at 18:58
1
1
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
@Encrypt0r Yes, replacing, splitting, or concattenating strings are all operations that are O(n) where n is the size of the string(s) the operation is being performed on. The first loop only performs those operations on small strings, the individual strings being looped on (making the loop O(2*n), effectively), the second performs them on very large strings, specifically, the aggregate of all of the strings processed so far, making it O(n*(n -1)/2) or O(n^2),
– Servy
Nov 19 at 19:16
|
show 2 more comments
up vote
-1
down vote
you should check this link. string concatenation vs builder performance
String concatenation vs String Builder. Performance
The string builder will most likely be marginally faster in this case, but really it's probably not going to be enough to fret about. The number of times you are re-creating the string (because strings are immutable and joining forces a new string to be created from the two existing ones).
Because of memory allocation on very step will cause more time.
add a comment |
up vote
-1
down vote
you should check this link. string concatenation vs builder performance
String concatenation vs String Builder. Performance
The string builder will most likely be marginally faster in this case, but really it's probably not going to be enough to fret about. The number of times you are re-creating the string (because strings are immutable and joining forces a new string to be created from the two existing ones).
Because of memory allocation on very step will cause more time.
add a comment |
up vote
-1
down vote
up vote
-1
down vote
you should check this link. string concatenation vs builder performance
String concatenation vs String Builder. Performance
The string builder will most likely be marginally faster in this case, but really it's probably not going to be enough to fret about. The number of times you are re-creating the string (because strings are immutable and joining forces a new string to be created from the two existing ones).
Because of memory allocation on very step will cause more time.
you should check this link. string concatenation vs builder performance
String concatenation vs String Builder. Performance
The string builder will most likely be marginally faster in this case, but really it's probably not going to be enough to fret about. The number of times you are re-creating the string (because strings are immutable and joining forces a new string to be created from the two existing ones).
Because of memory allocation on very step will cause more time.
answered Nov 19 at 18:53
Sameer Ahmad
14818
14818
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53380764%2fon2-faster-than-on%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Code is now posted as code.
– Delfino
Nov 19 at 18:41
1
You don't add timings and your methods have different return types. Comparing apples to oranges etc. You cannot assume library methods (Split, Replace) to be O(1)
– Henk Holterman
Nov 19 at 18:41
ParseEmails2 creates more
string
instances– Encrypt0r
Nov 19 at 18:43
1
ParseEmails
is not O(n^2) sincen
would be the number of emails but the inner loop depends on the number of elements in the split array instead.str += item + ';';
is a very inefficient way of appending to the end of a string. In general though, an O(n) algorithm can be slower than an O(n^2) algorithm depending on the size of the input and the associated constant factors.– Lee
Nov 19 at 18:46
Be aware that Big-O notation does not directly equate to time used or memory used, it only relates to the growth of those things. If processing the emails always takes 2 years, it's an O(1) algorithm.
– Lasse Vågsæther Karlsen
Nov 19 at 18:55