मैंने हमेशा सोचा है कि यह सामान्य ज्ञान है std::vector
"एक सरणी के रूप में लागू किया जाता है," ब्ला ब्ला ब्ला। आज मैंने नीचे जाकर उसका परीक्षण किया, और ऐसा लगता है कि ऐसा नहीं है:
यहाँ कुछ परीक्षण के परिणाम हैं:
UseArray completed in 2.619 seconds
UseVector completed in 9.284 seconds
UseVectorPushBack completed in 14.669 seconds
The whole thing completed in 26.591 seconds
यह लगभग 3 - 4 बार धीमा है! वास्तव में " vector
कुछ नैनोसेकल्स के लिए धीमा हो सकता है" टिप्पणियों के लिए उचित नहीं है ।
और मेरे द्वारा उपयोग किया गया कोड:
#include <cstdlib>
#include <vector>
#include <iostream>
#include <string>
#include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time/microsec_time_clock.hpp>
class TestTimer
{
public:
TestTimer(const std::string & name) : name(name),
start(boost::date_time::microsec_clock<boost::posix_time::ptime>::local_time())
{
}
~TestTimer()
{
using namespace std;
using namespace boost;
posix_time::ptime now(date_time::microsec_clock<posix_time::ptime>::local_time());
posix_time::time_duration d = now - start;
cout << name << " completed in " << d.total_milliseconds() / 1000.0 <<
" seconds" << endl;
}
private:
std::string name;
boost::posix_time::ptime start;
};
struct Pixel
{
Pixel()
{
}
Pixel(unsigned char r, unsigned char g, unsigned char b) : r(r), g(g), b(b)
{
}
unsigned char r, g, b;
};
void UseVector()
{
TestTimer t("UseVector");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
std::vector<Pixel> pixels;
pixels.resize(dimension * dimension);
for(int i = 0; i < dimension * dimension; ++i)
{
pixels[i].r = 255;
pixels[i].g = 0;
pixels[i].b = 0;
}
}
}
void UseVectorPushBack()
{
TestTimer t("UseVectorPushBack");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
std::vector<Pixel> pixels;
pixels.reserve(dimension * dimension);
for(int i = 0; i < dimension * dimension; ++i)
pixels.push_back(Pixel(255, 0, 0));
}
}
void UseArray()
{
TestTimer t("UseArray");
for(int i = 0; i < 1000; ++i)
{
int dimension = 999;
Pixel * pixels = (Pixel *)malloc(sizeof(Pixel) * dimension * dimension);
for(int i = 0 ; i < dimension * dimension; ++i)
{
pixels[i].r = 255;
pixels[i].g = 0;
pixels[i].b = 0;
}
free(pixels);
}
}
int main()
{
TestTimer t1("The whole thing");
UseArray();
UseVector();
UseVectorPushBack();
return 0;
}
क्या मैं इसे गलत या कुछ कर रहा हूं? या मैंने सिर्फ इस प्रदर्शन मिथक का भंडाफोड़ किया है?
मैं Visual Studio 2005 में रिलीज़ मोड का उपयोग कर रहा हूँ ।
में विजुअल C ++ , #define _SECURE_SCL 0
कम कर देता है UseVector
आधे से (यह लाने नीचे 4 सेकंड के लिए)। यह वास्तव में बहुत बड़ा है, IMO।
vector
यह एक सामान्य प्रयोजन के लिए बदलने योग्य सरणी है। बधाई हो। सभी सामान्य प्रयोजन साधनों के साथ, यह विशेष परिस्थितियों में आना संभव है जहां यह उप-इष्टतम है। यही कारण है कि पारंपरिक ज्ञान एक के साथ शुरू करने के लिएvector
और विकल्प पर विचार करना है अगर neccessary।