Tôi đang cố triển khai một lớp điểm cố định trong C++, nhưng tôi gặp phải các vấn đề với hiệu năng. Tôi đã giảm bớt vấn đề với một trình bao bọc đơn giản của kiểu float và nó vẫn còn chậm. Câu hỏi của tôi là - tại sao trình biên dịch không thể tối ưu hóa nó hoàn toàn?Làm cách nào để tối ưu hóa lớp trình bao bọc kiểu số đơn giản trong C++?
Phiên bản 'nổi' nhanh hơn 50% so với 'Float'. Tại sao?!
(Tôi sử dụng Visual C++ 2008, tất cả các tùy chọn của trình biên dịch có thể được kiểm tra, Cấu hình phát hành của khóa học).
Xem mã bên dưới:
#include <cstdio>
#include <cstdlib>
#include "Clock.h" // just for measuring time
#define real Float // Option 1
//#define real float // Option 2
struct Float
{
private:
float value;
public:
Float(float value) : value(value) {}
operator float() { return value; }
Float& operator=(const Float& rhs)
{
value = rhs.value;
return *this;
}
Float operator+ (const Float& rhs) const
{
return Float(value + rhs.value);
}
Float operator- (const Float& rhs) const
{
return Float(value - rhs.value);
}
Float operator* (const Float& rhs) const
{
return Float(value * rhs.value);
}
bool operator< (const Float& rhs) const
{
return value < rhs.value;
}
};
struct Point
{
Point() : x(0), y(0) {}
Point(real x, real y) : x(x), y(y) {}
real x;
real y;
};
int main()
{
// Generate data
const int N = 30000;
Point points[N];
for (int i = 0; i < N; ++i)
{
points[i].x = (real)(640.0f * rand()/RAND_MAX);
points[i].y = (real)(640.0f * rand()/RAND_MAX);
}
real limit(20 * 20);
// Check how many pairs of points are closer than 20
Clock clk;
int count = 0;
for (int i = 0; i < N; ++i)
{
for (int j = i + 1; j < N; ++j)
{
real dx = points[i].x - points[j].x;
real dy = points[i].y - points[j].y;
real d2 = dx * dx + dy * dy;
if (d2 < limit)
{
count++;
}
}
}
double time = clk.time();
printf("%d\n", count);
printf("TIME: %lf\n", time);
return 0;
}
Bạn đã bật cờ tối ưu hóa tối đa chưa. Tôi đã thấy các phép thuật xảy ra khi bạn BẬT chúng. – iammilind
Tạo lắp ráp và kiểm tra các vị trí khác nhau ... –
Bạn có thể thử đánh dấu tất cả các phương thức một cách rõ ràng là 'nội tuyến' –