Everyone says c++ is faster than c#, why?
-
C++ is filth. For real speed you need C. :cool:
C is filth. For real speed you need Assembler. :cool:
Visit my blog at Sander's bits - Writing the code you need. Or read my articles at my CodeProject profile.
Simplicity is prerequisite for reliability. — Edsger W. Dijkstra
Regards, Sander
-
This link is a blog series done by Raymond Chen and Rico Mariani where Raymond wrote a Chinese dictionary in C++ and Rico wrote a naïve line-by-line translation of the C++ code in C#. The C# code blew away the C++ code in performance. Raymond then did a number of ever more severe optimizations (including writing his own string class) to finally beat the naïve C# performance. Rico then optimized the C# code and again beat the C++ performance. Raymond then did a couple of more optimizations to finally beat the C#. The summary is thus: Doing a straightforward implementation in C# will yield really good performance (and is much quicker to implement, relative to C++), in many cases better than a straightforward implementation in C++. But, if you put in a significant amount of optimization effort, C++ CAN clearly outperform the C# code - as noted in the final blog post of that series, there's certain initial overhead (60ms in Rico's case) that the CLR imposes that you cannot optimize away in C#.
Gjeltema wrote:
is much quicker to implement
Yes, and probably with lower maintenance requirements. As well as C# probably requiring a development team with an overall lower payroll. These are factors that really matter in real-world development. And if the result is "good enough", then call it done and move on.
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
What dreadful code. Try a proper Sieve of Eratosthenes in both languages. Sieve of Eratosthenes - Wikipedia, the free encyclopedia[^] And, as the others have said, don't judge by IO. Also, run each several times, discard the highest and lowest times, and take the average. And use optimized builds. P.S. Streams is a big reason I do not use C++. X|
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
Remove cout and see... Somewhere I read streams in c++ aren't performant
-
After a quick check, what you're really comparing here is the efficiency of
Console.WriteLine
vscout
If you swapcout
forprintf
you get much more similar times. In my case the C++ was a second faster than the C# but it's not a very fair comparison. Really I don't think you'll find much difference in performance of either.Exactly. To make a fair comparison, just eliminate all io within the loop. Or, better yet, don't do any io within the code block that is measured. That said, I wouldn't expect *any* meaningful difference for this code. it's just basic arithmetic that translates directly to assembly, and that goes for both C++ and C#.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
We all know that VB is faster than them both.
cheers Chris Maunder
-
I'm not an expert in this but I can tell you this much: - You didn't set a processor affinity. Stack swaps could have skewed your results. - You didn't set the process and thread priority to high. Your programs code have been interrupted by other threads. - Did you make sure you ran both programs with compiler optimization and without debugger/profiler attached? - Integer-arithmetic isn't representative for the overall speed of the language. Take a look here: Head-to-head benchmark: C++ vs .NET[^]
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
That article provides a rather thorough comparison, but it focuses on library implementations, not the core language. Just from skimming over the results I spotted several remarks on 'lousy' implementations, and that alone is a dead giveaway that the results should be taken with a huge pint of salt.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
As many others have also shown, your main issue is the cout streaming in C++ is less than optimal (to say the least). Also things like compiling to production settings (i.e. all optimizations possible) instead of debug, ensuring thread priority is set to high and cpu affinity set to ensure no other processes interfere and cause a cache reload during the test. All these thing could throw out any such benchmarking. But just to be nitpicky: You're using a simple clock to time your benchmark. In both C++ as well as C#, that has previously been seen to have lots of inaccuracies due to optimizations in the clock's implementation. To ensure the most accurate such timing (if you're not using a profiler instead - which BTW you should rather do) then rather use: - In C++ it depends on the system. Under Linux clock_gettime[^], under Windows QPC [^] is a better alternative - In C# you should be using Stopwatch[^] instead.
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
Comparing apples and pears ... **c** for (int i = 2; i **<** 2000000; i++) for (int j = 2; j*j **<=** i; j++) **c#** for (int i = 2; i **<=** 2000000; i++) for (int j = 2; j * j **<** i; j++) As it stands now, C does quite a few more loops than C# ... Change the loops (so that they are the same) and remove I/O from inside them. YMMV
-
Comparing apples and pears ... **c** for (int i = 2; i **<** 2000000; i++) for (int j = 2; j*j **<=** i; j++) **c#** for (int i = 2; i **<=** 2000000; i++) for (int j = 2; j * j **<** i; j++) As it stands now, C does quite a few more loops than C# ... Change the loops (so that they are the same) and remove I/O from inside them. YMMV
-
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
-
Any benchmark test never ever should include I/O! You're not experienced here, so we forgive you. :)
-
Good catch!
If the brain were so simple we could understand it, we would be so simple we couldn't. — Lyall Watson
-
You sound like a liberal. On and you're wrong. It's simply a technical discussion.
".45 ACP - because shooting twice is just silly" - JSOP, 2010
-----
You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010
-----
When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013 -
I used same algorithm for c# and c++. I have read c++ is faster than c# but my tests shows c# is faster than c++. What's wrong? My codes like this. c++ is 36 seconds
#include
#includeusing namespace std;
int main(){
const clock_t beginTime = clock();
for (int i = 2; i < 2000000; i++)
{
bool isPrime = true;
for (int j = 2; j*j <= i; j++)
{
if (i%j == 0){
isPrime = false;
break;
}
}
if (isPrime)
cout << i << endl;
}
cout << float(clock() - beginTime) / CLOCKS_PER_SEC;
}c# is 9 seconds
using System;
namespace Console01
{
class Program
{static void Main(string\[\] args) { DateTime beginTime = DateTime.Now; for (int i = 2; i <= 2000000; i++) { bool isPrime = true; for (int j = 2; j \* j < i; j++) { if (i % j == 0) { isPrime = false; break; } } if (isPrime) Console.WriteLine(i); } TimeSpan ts = DateTime.Now - beginTime; Console.WriteLine(ts.Seconds); } }
}
All the comments are like "but you didn't do it this way" or "you didn't do it that way". So that pretty much just says that you can easily write c# code to be fast, and in many cases faster than c++. However if you want to obsess over your code optimization and use uncommon coding practices you can make c++ be faster than c# in many cases.
Elephant elephant elephant, sunshine sunshine sunshine
-
So liberals are not permitted here. I'm not a liberal, but I'm sure that sooner or later I'll say something that is not extreme right wing enough to satisfy you.
-
Ygnaiih wrote:
So liberals are not permitted here.
Only a liberal would have made that leap. :-\
There are only 10 types of people in the world, those who understand binary and those who don't.
-
Told you up front I'm not a liberal. My point is if you want to do a political discussion, code project is not the place for it.
Ygnaiih wrote:
Told you up front I'm not a liberal
Ya, I was making a silly joke.
Ygnaiih wrote:
if you want to do a political discussion, code project is not the place for it.
Actually, it is, but not in the Lounge. The Soapbox is the place for it. However, John wasn't making any political statements. :doh:
There are only 10 types of people in the world, those who understand binary and those who don't.
-
After a quick check, what you're really comparing here is the efficiency of
Console.WriteLine
vscout
If you swapcout
forprintf
you get much more similar times. In my case the C++ was a second faster than the C# but it's not a very fair comparison. Really I don't think you'll find much difference in performance of either.An answer to the question? What's wrong with you!!! :-) It's funny how it was so horrible that this question was here, but the whole long conversation about liberals and stuff is just fine! Hmmm people just being people again. It's a shame the way we act sometimes.
hatfok King Yiddum's Castle Pegasus Galaxy