Tôi đã lo lắng về tốc độ của C# khi nó đề cập đến tính toán nặng, khi bạn cần sử dụng nguồn CPU nguyên.C++ và C# tốc độ so sánh
Tôi luôn nghĩ rằng C++ nhanh hơn nhiều so với C# khi nói đến tính toán. Vì vậy, tôi đã làm một số xét nghiệm nhanh. Thử nghiệm đầu tiên tính số nguyên tố < một số nguyên n, phép thử thứ hai tính một số số pandigital. Ý tưởng cho thử nghiệm thứ hai xuất phát từ đây: Pandigital Numbers
C# Thủ tính toán:
using System;
using System.Diagnostics;
class Program
{
static int primes(int n)
{
uint i, j;
int countprimes = 0;
for (i = 1; i <= n; i++)
{
bool isprime = true;
for (j = 2; j <= Math.Sqrt(i); j++)
if ((i % j) == 0)
{
isprime = false;
break;
}
if (isprime) countprimes++;
}
return countprimes;
}
static void Main(string[] args)
{
int n = int.Parse(Console.ReadLine());
Stopwatch sw = new Stopwatch();
sw.Start();
int res = primes(n);
sw.Stop();
Console.WriteLine("I found {0} prime numbers between 0 and {1} in {2} msecs.", res, n, sw.ElapsedMilliseconds);
Console.ReadKey();
}
}
C++ biến thể:
#include <iostream>
#include <ctime>
#include <cmath>
int primes(unsigned long n) {
unsigned long i, j;
int countprimes = 0;
for(i = 1; i <= n; i++) {
int isprime = 1;
for(j = 2; j < sqrt((float)i); j++)
if(!(i%j)) {
isprime = 0;
break;
}
countprimes+= isprime;
}
return countprimes;
}
int main() {
int n, res;
cin>>n;
unsigned int start = clock();
res = primes(n);
int tprime = clock() - start;
cout<<"\nI found "<<res<<" prime numbers between 1 and "<<n<<" in "<<tprime<<" msecs.";
return 0;
}
Khi tôi chạy thử cố gắng tìm số nguyên tố < hơn 100.000, C# biến thể hoàn thành trong 0,409 giây và biến thể C++ trong 0,614 giây. Khi tôi chạy chúng với 1.000.000 C# đã hoàn thành trong 6.039 giây và C++ trong khoảng 12.987 giây.
kiểm tra Pandigital trong C#:
using System;
using System.Diagnostics;
class Program
{
static bool IsPandigital(int n)
{
int digits = 0; int count = 0; int tmp;
for (; n > 0; n /= 10, ++count)
{
if ((tmp = digits) == (digits |= 1 << (n - ((n/10) * 10) - 1)))
return false;
}
return digits == (1 << count) - 1;
}
static void Main()
{
int pans = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 1; i <= 123456789; i++)
{
if (IsPandigital(i))
{
pans++;
}
}
sw.Stop();
Console.WriteLine("{0}pcs, {1}ms", pans, sw.ElapsedMilliseconds);
Console.ReadKey();
}
}
kiểm tra Pandigital trong C++:
#include <iostream>
#include <ctime>
using namespace std;
int IsPandigital(int n)
{
int digits = 0; int count = 0; int tmp;
for (; n > 0; n /= 10, ++count)
{
if ((tmp = digits) == (digits |= 1 << (n - ((n/10) * 10) - 1)))
return 0;
}
return digits == (1 << count) - 1;
}
int main() {
int pans = 0;
unsigned int start = clock();
for (int i = 1; i <= 123456789; i++)
{
if (IsPandigital(i))
{
pans++;
}
}
int ptime = clock() - start;
cout<<"\nPans:"<<pans<<" time:"<<ptime;
return 0;
}
C# biến thể chạy trong 29,906 giây và C++ trong khoảng 36,298 giây.
Tôi không chạm vào bất kỳ công tắc trình biên dịch nào và cả hai chương trình C# và C++ đều được biên dịch với các tùy chọn gỡ lỗi. Trước khi tôi cố gắng chạy thử nghiệm, tôi đã lo lắng rằng C# sẽ tụt hậu tốt so với C++, nhưng bây giờ có vẻ như có một sự khác biệt khá lớn về tốc độ trong C# favor.
Ai đó có thể giải thích điều này? C# được trích xuất và C++ được biên dịch tự nhiên vì vậy bình thường C++ sẽ nhanh hơn một biến thể C#.
Cảm ơn câu trả lời!
Tôi đã xóa tất cả các kiểm tra cho cấu hình Phát hành.
Thử nghiệm đầu tiên (số nguyên tố)
C# (số < 100,0000): 0,189 giây C++ (số < 100,0000): 0,036 giây
C# (nummbers < 1.000.000): 5.300 giây C++ (nummbers < 1.000.000): 1,166 giây
thử nghiệm thứ hai (số Pandigital):
C#: 21. 224 giây C++: 4.104 giây
Vì vậy, mọi thứ đã thay đổi, giờ đây C++ nhanh hơn rất nhiều. Lỗi của tôi là tôi đã chạy thử nghiệm cho cấu hình Debug. Tôi có thể thấy một số cải thiện tốc độ nếu tôi chạy các tập tin thực thi C# thông qua ngen?
Lý do tôi cố gắng so sánh C# và C++ là vì tôi biết một số khái niệm cơ bản của cả hai và tôi muốn tìm hiểu một giao dịch API với GUI.Tôi nghĩ WPF rất tốt vì tôi đang nhắm đến desktop, tôi muốn xem liệu C# có thể cung cấp đủ tốc độ và hiệu suất khi sử dụng sức mạnh CPU tuyệt đối để tính toán các tính toán khác nhau (lưu trữ tệp, mật mã, codec, v.v ...) . Nhưng có vẻ như C# đáng buồn không thể theo kịp với C++ khi nói đến tốc độ.
Vì vậy, tôi giả định rằng tôi sẽ mãi mãi bị mắc kẹt với câu hỏi này Tough question on WPF, Win32, MFC và tôi sẽ tìm một API phù hợp mới hơn.
"Ai có thể giải thích điều này? C# được trích xuất và C++ được biên dịch tự nhiên nên bình thường C++ sẽ nhanh hơn biến thể C#". <- Không theo chế độ gỡ lỗi. –
"... Chương trình C++ được biên dịch với các tùy chọn gỡ lỗi". Vậy tại sao chúng ta lo lắng về hiệu suất? – GManNickG
'= 2; j <(i^(1/2)); j ++) 'Mã này sai. Bạn đang làm một chút - hoặc, không phải là một số mũ. –