Tôi sắp viết một mô phỏng tổng hợp khuếch tán giới hạn mạng (DLA) và tôi tự hỏi có nên sử dụng C hoặc C++ hay không.C so với C++ để mô phỏng số (hiệu suất)
C++ sẽ rất hay vì lý do thiết kế nhưng tôi tự hỏi liệu C có hoạt động tốt hơn không. Tất nhiên tôi biết về hiệu suất thuật toán và đã chọn thuật toán tốt nhất có thể. Vì vậy, tôi không nói về việc cải thiện O (n^2) thành O (log n) hoặc tương tự. Tôi đang cố gắng giảm các hằng số của mình để nói.
Nếu bạn không biết DLA, về cơ bản nó sẽ có một chuỗi đôi (kích thước từ 10^3 đến 10^6) và trong vòng lặp chọn ngẫu nhiên tăng gấp đôi để so sánh (lớn hơn/ít hơn) với phần lớn mảng.
Vì vậy, sự khác biệt hiệu suất mà sẽ có vấn đề của việc này là truy cập dữ liệu và chức năng gọi số:
- truy cập dữ liệu: C struct vs lớp C++ với các thành viên dữ liệu công cộng vs ++ lớp C với các thành viên dữ liệu cá nhân và bộ truy xuất.
- Chức năng gọi: C chức năng so với chức năng thành viên C++.
Tôi có quyền kết luận rằng cách cuối cùng để đánh giá điều này là xem mã lắp ráp (ví dụ: so sánh số lượng di chuyển/tải, nhảy và cuộc gọi)? Điều này tất nhiên là phụ thuộc vào trình biên dịch (ví dụ: bạn có thể so sánh trình biên dịch C khủng khiếp với trình biên dịch C++ tốt). Tôi đang sử dụng trình biên dịch Gnu (gcc và g ++).
Tôi đã phát hiện ra rằng việc lắp ráp sản xuất bởi gcc và g ++ là gần như giống hệt nhau về mặt số lượng nhảy (không có), di chuyển/tải và kêu gọi hai chương trình sau:
chương trình C
#include <stdlib.h>
typedef struct
{
double x;
} particle;
double square(double a)
{
return a*a;
}
int main()
{
particle* particles = malloc(10*sizeof(particle));
double res;
particles[0].x = 60.42;
res = square(particles[0].x);
return 0;
}
C++ chương trình
class particle
{
public:
double x;
public:
double square()
{
return x*x;
}
};
int main()
{
particle* particles = new particle[10];
double res;
particles[0].x = 60.42;
res = particles[0].square();
return 0;
}
Nếu tôi sử dụng tôi tin dữ liệu mber trong chương trình C++ tôi dĩ nhiên nhận được một cuộc gọi khác trong assembly khi tôi gọi các hạt [0] .setx (60.42).
Điều này có nghĩa là tôi cũng có thể chọn C++ là C vì chúng sản xuất gần như cùng một mã assembly? Tôi có nên tránh dữ liệu thành viên riêng tư vì nó cho biết thêm các cuộc gọi chức năng bổ sung (ví dụ: cuộc gọi trong lắp ráp có đắt không)?
C++ giống như và có thể hoạt động hiệu quả hơn C. Bạn gọi g ++ như thế nào? Tôi rất ngạc nhiên khi nó không nằm trong phương thức 'square()' nếu chúng ở trên – Collin
Không có điểm nào tạo ra phương thức 'setx' nếu điều duy nhất nó làm là thiết lập x thành bất cứ thứ gì được truyền vào trong bạn cũng có thể làm dữ liệu công khai. Cũng sử dụng C++ không có nghĩa là bạn không thể sử dụng cấu trúc chỉ với các thành viên. –
Nếu thuật toán của bạn phụ thuộc vào mảng lớn các số, bạn có thể muốn tránh sử dụng các lớp có biến thành viên như trong ví dụ của bạn vì cách lớp được đặt trong bộ nhớ. Bạn có thể thấy hiệu suất tốt hơn với phân bổ tăng gấp đôi liên tục lớn thay vì phân bổ liên tục các lớp với dữ liệu thành viên hỗn hợp. – PureW