Tôi đang thực hiện một số công việc quan trọng về hiệu suất trong C ++ và chúng tôi hiện đang sử dụng các phép tính số nguyên cho các vấn đề vốn có dấu phẩy động vì "nó nhanh hơn". Điều này gây ra rất nhiều vấn đề khó chịu và thêm rất nhiều mã khó chịu.
Bây giờ, tôi nhớ đã đọc về cách các phép tính dấu phẩy động chậm đến mức vào khoảng 386 ngày, nơi mà tôi tin (IIRC) rằng có một bộ đồng xử lý tùy chọn. Nhưng chắc chắn ngày nay với các CPU phức tạp và mạnh mẽ hơn theo cấp số nhân thì không có gì khác biệt về "tốc độ" nếu thực hiện phép tính dấu phẩy động hoặc số nguyên? Đặc biệt là vì thời gian tính toán thực tế là rất nhỏ so với một cái gì đó như gây ra sự cố đường ống hoặc tìm nạp thứ gì đó từ bộ nhớ chính?
Tôi biết câu trả lời chính xác là điểm chuẩn trên phần cứng mục tiêu, cách tốt để kiểm tra điều này là gì? Tôi đã viết hai chương trình C ++ nhỏ và so sánh thời gian chạy của chúng với "thời gian" trên Linux, nhưng thời gian chạy thực tế quá thay đổi (không giúp tôi chạy trên máy chủ ảo). Tôi không phải dành cả ngày để chạy hàng trăm điểm chuẩn, vẽ biểu đồ, v.v., vậy tôi có thể làm gì để có được một bài kiểm tra hợp lý về tốc độ tương đối không? Bất kỳ ý tưởng hoặc suy nghĩ? Tôi có sai hoàn toàn không?
Các chương trình tôi đã sử dụng như sau, chúng không giống nhau bởi bất kỳ phương tiện nào:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Chương trình 2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += (float)( rand( ) % 365 );
}
std::cout << accum << std::endl;
return 0;
}
Cảm ơn trước!
Chỉnh sửa: Nền tảng tôi quan tâm là x86 hoặc x86-64 thông thường chạy trên máy tính để bàn Linux và Windows.
Chỉnh sửa 2 (dán từ một bình luận bên dưới): Chúng tôi hiện có một cơ sở mã mở rộng. Thực sự tôi đã đưa ra chống lại sự tổng quát hóa rằng chúng ta "không được sử dụng float vì phép tính số nguyên nhanh hơn" - và tôi đang tìm cách (nếu điều này thậm chí đúng) để bác bỏ giả thiết tổng quát này. Tôi nhận ra rằng sẽ không thể dự đoán chính xác kết quả đối với chúng tôi nếu không thực hiện tất cả công việc và lập hồ sơ sau đó.
Dù sao, cảm ơn vì tất cả những câu trả lời xuất sắc và sự giúp đỡ của bạn. Hãy thoải mái thêm bất cứ điều gì khác :).
float
được tăng tốc độ, nhưng thường double
thì không.
addl
thay thế bằngfadd
). Cách duy nhất để thực sự có được một phép đo tốt là lấy một phần cốt lõi của chương trình thực của bạn và lập hồ sơ các phiên bản khác nhau của nó. Thật không may, điều đó có thể khá khó khăn nếu không sử dụng rất nhiều nỗ lực. Có lẽ việc cho chúng tôi biết phần cứng mục tiêu và trình biên dịch của bạn sẽ giúp mọi người ít nhất cung cấp cho bạn trải nghiệm đã có từ trước, v.v. Về việc sử dụng số nguyên của bạn, tôi nghi ngờ bạn có thể tạo một loạifixed_point
lớp mẫu sẽ dễ dàng hơn rất nhiều.