Tôi đang sử dụng std::deque
. Tôi chắc chắn rằng thay thế một vòng lặp với một push_back
với một insert
duy nhất sẽ mang lại sự gia tăng hiệu suất. Nó cũng được đề nghị, ví dụ here.Push_back nhanh hơn chèn?
Nhưng giờ tôi không còn chắc chắn nữa.
Tôi đã chạy một số điểm chuẩn trên mã thử nghiệm.
main.cpp:
#include"queueInsert.h"
#include<Windows.h>
std::deque<int> queue;
constexpr size_t len = 64;
int arr[len];
int main()
{
DWORD startTime = GetTickCount();
for (int i = 0; i < 100000; ++i)
{
insert(queue, arr, len);
}
DWORD endTime = GetTickCount();
return endTime - startTime;
}
queueInsert.h:
#include<deque>
void insert(std::deque<int>&, int* arr, int n);
queueInsert.cpp -push phiên bản
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
for (int i = 0; i < n; ++i)
{
queue.push_back(arr[i]);
}
}
queueInsert.cpp -insert phiên bản
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
queue.insert(queue.end(), arr, arr + n);
}
Tôi nhận được 203
mili giây với push_back
, nhưng 218
với insert
.
Thay đổi len
-6
, và tăng lặp để mốt triệu, giữ cho kết quả tương tự: 219
nhà máy cho push
và 266
cho insert
.
Chỉ với len = 640
không push
bị thua thiệt, và thậm chí sau đó bởi rất ít: 1531
cho push
chống 1437
cho insert
.
Tôi đang biên soạn trong phiên bản lần trong VisualStudio 2015 trong môi trường Windows 10
tôi chắc chắn rằng trình biên dịch không làm tối ưu hóa như nội tuyến số liên tục lặp đi lặp lại hoặc pha trộn các vòng, như mỗi khi tôi thay đổi chỉ thực hiện queueInsert.cpp
được biên dịch lại.
Tôi đang làm sai địa chỉ? Hoặc tôi có nên giữ push_back
nếu số lượng các yếu tố được chèn vào không có khả năng lớn không?
* Tôi chắc chắn trình biên dịch không thực hiện tối ưu hóa * - Hãy xem danh sách lắp ráp. – PaulMcKenzie
Tôi đọc bài báo gốc, không bao giờ là – Slava
Tôi ngụ ý vectơ là chuỗi các phần tử chứ không phải 'std :: vector'. Tôi đã sửa chữa để làm cho ý nghĩa rõ ràng hơn. –