मैं std::deque
का उपयोग कर रहा हूं। मुझे यकीन था कि push_back
के साथ एक insert
के साथ एक लूप को प्रतिस्थापित करने से प्रदर्शन में वृद्धि होगी। उदाहरण के लिए here भी इसकी अनुशंसा की जाती है।पुश_बैक डालने से तेज़ी से?
लेकिन अब मैं अब और नहीं तो यकीन नहीं है।
मैं परीक्षण कोड पर कुछ मानक दौड़े हैं।
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 संस्करण
#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 संस्करण
#include "queueInsert.h"
void insert(std::deque<int>& queue, int* arr, int n)
{
queue.insert(queue.end(), arr, arr + n);
}
मैं push_back
साथ 203
मिलीसेकेंड, लेकिन insert
साथ 218
मिलता है। push
के लिए 219
मिलों और insert
के लिए 266
:
6
को बदलने len
, और एक लाख के लिए पुनरावृत्तियों में वृद्धि, एक ही परिणाम रहता है। insert
के लिए 1437
के खिलाफ push
के लिए 1531
:
केवल len = 640
साथ push
बाहर खो करता है, और फिर भी बहुत कम है।
मैं Windows के तहत VisualStudio 2015 में रिलीज में संकलन कर रहा हूँ 10
मुझे यकीन है कि संकलक पुनरावृत्तियों की लगातार संख्या इनलाइन करने या छोरों fusing के रूप में अनुकूलन नहीं कर रहा है कर रहा हूँ, हर बार के रूप में मैं बदल कार्यान्वयन केवल queueInsert.cpp
पुन: संकलित किया गया है।
मैं रूपरेखा गलत कर रहा हूं? या क्या मुझे वास्तव में push_back
रखना चाहिए यदि तत्वों को डालने की मात्रा बड़ी होने की संभावना नहीं है? सामान्य डालने, सामने डालें, पीठ में सम्मिलित करें:
* मुझे यकीन है कि संकलक अनुकूलन नहीं कर रहा है * - चलिए असेंबली लिस्टिंग देखें। – PaulMcKenzie
मैंने मूल आलेख पढ़ा, – Slava
कभी नहीं, मेरा मतलब है वेक्टर तत्वों के अनुक्रम के रूप में, 'std :: vector' नहीं। मैंने अर्थ स्पष्ट करने के लिए सही किया है। –