std::vector<int>
0 से प्रत्येक मान को रीसेट करने और वैक्टर को प्रारंभिक आकार में रखने का सबसे तेज़ तरीका क्या है ?
[] ऑपरेटर के साथ लूप के लिए?
std::vector<int>
0 से प्रत्येक मान को रीसेट करने और वैक्टर को प्रारंभिक आकार में रखने का सबसे तेज़ तरीका क्या है ?
[] ऑपरेटर के साथ लूप के लिए?
जवाबों:
std::fill(v.begin(), v.end(), 0);
v = std::vector<int>(vec_size,0)
) fill
मेरी मशीन पर थोड़ा तेज लगता है
assign
।
हमेशा की तरह जब आप सबसे तेज़ के बारे में पूछते हैं: माप! उपरोक्त विधियों का उपयोग करना (एक मैक पर क्लैंग का उपयोग करके):
Method | executable size | Time Taken (in sec) |
| -O0 | -O3 | -O0 | -O3 |
------------|---------|---------|-----------|----------|
1. memset | 17 kB | 8.6 kB | 0.125 | 0.124 |
2. fill | 19 kB | 8.6 kB | 13.4 | 0.124 |
3. manual | 19 kB | 8.6 kB | 14.5 | 0.124 |
4. assign | 24 kB | 9.0 kB | 1.9 | 0.591 |
10000 ints के वेक्टर पर 100000 पुनरावृत्तियों का उपयोग करना।
संपादित करें: यदि इस संख्या को बदलने से परिणामी समय बदल जाता है तो आपको कुछ विश्वास हो सकता है (अंतिम विधानसभा कोड का निरीक्षण करने के लिए उतना अच्छा नहीं) कि कृत्रिम बेंचमार्क को पूरी तरह से अनुकूलित नहीं किया गया है। निश्चित रूप से वास्तविक परिस्थितियों में प्रदर्शन को गड़बड़ाना सबसे अच्छा है। अंत संपादित करें
उपयोग किए गए कोड के संदर्भ के लिए:
#include <vector>
#define TEST_METHOD 1
const size_t TEST_ITERATIONS = 100000;
const size_t TEST_ARRAY_SIZE = 10000;
int main(int argc, char** argv) {
std::vector<int> v(TEST_ARRAY_SIZE, 0);
for(size_t i = 0; i < TEST_ITERATIONS; ++i) {
#if TEST_METHOD == 1
memset(&v[0], 0, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), 0);
#elif TEST_METHOD == 3
for (std::vector<int>::iterator it=v.begin(), end=v.end(); it!=end; ++it) {
*it = 0;
}
#elif TEST_METHOD == 4
v.assign(v.size(),0);
#endif
}
return EXIT_SUCCESS;
}
निष्कर्ष: उपयोग std::fill
(क्योंकि, जैसा कि दूसरों ने कहा है कि इसका सबसे मुहावरा है)!
assign
, धीमी है छोटी क्षमताओं के अलावा पर है libc++
। CODE कोलीरू / पेस्ट
fill
। यह इस परीक्षण में परिमाण धीमी करने के दो आदेश हैं ।
कैसे assign
सदस्य समारोह के बारे में ?
some_vector.assign(some_vector.size(), 0);
यदि यह केवल पूर्णांक का वेक्टर है, तो मैं पहली बार कोशिश करूँगा:
memset(&my_vector[0], 0, my_vector.size() * sizeof my_vector[0]);
यह बहुत सी ++ नहीं है, इसलिए मुझे यकीन है कि कोई ऐसा करने का उचित तरीका प्रदान करेगा। :)
::std::fill
विधि, कुछ है कि बहुत तेजी से रफ़ू है करने के लिए फैलता है, हालांकि, क्योंकि यह सब इनलाइन है कोड-bloaty पक्ष पर एक सा। मैं अभी भी इसका उपयोग करूँगा, क्योंकि यह पढ़ने के लिए बहुत अच्छा है।
मेरे पास एक ही सवाल था, लेकिन इसके बारे में कम vector<bool>
(afaik मानक इसे आंतरिक रूप से केवल बूलियन तत्वों के एक निरंतर सरणी की तुलना में अलग तरीके से लागू करने की अनुमति देता है)। इसलिए मैंने फैबियो फ्रैकासी द्वारा थोड़ा संशोधित परीक्षण दोहराया। परिणाम इस प्रकार हैं (समय, सेकंड में):
-O0 -O3
-------- --------
memset 0.666 1.045
fill 19.357 1.066
iterator 67.368 1.043
assign 17.975 0.530
for i 22.610 1.004
तो जाहिर है इन आकारों के लिए, vector<bool>::assign()
तेज है। परीक्षणों के लिए उपयोग किया जाने वाला कोड:
#include <vector>
#include <cstring>
#include <cstdlib>
#define TEST_METHOD 5
const size_t TEST_ITERATIONS = 34359738;
const size_t TEST_ARRAY_SIZE = 200;
using namespace std;
int main(int argc, char** argv) {
std::vector<int> v(TEST_ARRAY_SIZE, 0);
for(size_t i = 0; i < TEST_ITERATIONS; ++i) {
#if TEST_METHOD == 1
memset(&v[0], false, v.size() * sizeof v[0]);
#elif TEST_METHOD == 2
std::fill(v.begin(), v.end(), false);
#elif TEST_METHOD == 3
for (std::vector<int>::iterator it=v.begin(), end=v.end(); it!=end; ++it) {
*it = 0;
}
#elif TEST_METHOD == 4
v.assign(v.size(),false);
#elif TEST_METHOD == 5
for (size_t i = 0; i < TEST_ARRAY_SIZE; i++) {
v[i] = false;
}
#endif
}
return EXIT_SUCCESS;
}
मैंने Ubuntu 17.10 पर GCC 7.2.0 संकलक का उपयोग किया। संकलन के लिए कमांड लाइन:
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp