Nếu mã của bạn là segfaulting thì đó là vấn đề chính xác chứ không phải vấn đề về hiệu quả.
Để đạt được "u [i] = u [i] + v [i] với mọi i", tôi sẽ làm cơ bản những gì bạn đã làm:
assert(u.size() == v.size()); // will fail with your initialization code, since
// your "result" has size 0, not size 10.
// perhaps do u.resize(v.size());
for (size_t i = 0; i < u.size(); ++i) {
u[i] += v[i];
}
Nếu bạn thực sự quan tâm đến hoạt động của chương trình của bạn (nghĩa là, bạn đã viết một phiên bản cơ bản và chương trình của bạn bị chậm một số yêu cầu và bạn đã chứng minh rằng đây là mã mà phần lớn thời gian được sử dụng), sau đó bạn có thể thử:
- chuyển đổi trên nhiều tối ưu hóa trong trình biên dịch của bạn (thực ra, tôi thường làm điều này theo mặc định ngay cả khi không có vấn đề về hiệu năng),
- sử dụng vòng lặp thay vì chỉ mục (hiếm khi tạo ra sự khác biệt nhiều, nhưng thật dễ dàng để so sánh hai),
- bỏ vòng lặp một chút (có thể tạo ra sự chênh lệch tốc độ đáng giá, nhưng điều đó khá nhạy cảm với trường hợp cụ thể và nó khuyến khích các lỗi mã hóa).
- xem hướng dẫn SIMD dành riêng cho nền tảng thay vì C++. Sau đó, sử dụng trình biên dịch nhúng hoặc trình biên dịch nội tại cho các hướng dẫn đó.
Tuy nhiên, bạn không phải lo lắng về hiệu suất trước khi mã của bạn chính xác ;-). "Làm cho nó hoạt động, làm cho nó đúng, làm cho nó nhanh" là một phương châm hợp lý, mặc dù thường bạn không cần phải đi xa như bước 3.
std::valarray
thực sự có chính xác operator+=
bạn muốn. Trước khi bạn thay thế tất cả các vectơ của mình bằng các valaray, hãy lưu ý rằng không nhất thiết có nghĩa là nó "hiệu quả hơn" so với một vòng lặp đơn giản - Tôi không biết những người thực hiện nghiêm túc mất valarray
như thế nào. Bạn luôn có thể xem xét nguồn trong triển khai của mình.Tôi cũng không biết tại sao chức năng số học nhiều dữ liệu của valarray
không được định nghĩa là một phần của vector
, nhưng thường có một lý do.
Nguồn
2010-07-31 00:23:41
Bạn có đăng một số mã compilable? "Điều này mang lại cho tôi một segfault" không phải là đặc biệt hữu ích mà không nhìn thấy cách những vectơ được khởi tạo. Vấn đề rất có thể là một trong các vectơ dài hơn vectơ kia. Rất khó để biết mã của bạn ở đâu sai mà không thấy tất cả mã :-) –
http://www.boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/operations_overview.htm – Anycorn