আমি সবসময় ভেবেছি এটিই সাধারণ জ্ঞান যা 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;
}
আমি কি এটা ভুল করছি বা কিছু করছি? নাকি আমি এই পারফরম্যান্সের পৌরাণিক কাহিনী স্রেফ ছড়িয়েছি?
আমি ভিজ্যুয়াল স্টুডিও 2005 এ রিলিজ মোড ব্যবহার করছি ।
ইন ভিসুয়াল সি ++ , #define _SECURE_SCL 0
হ্রাস UseVector
অর্ধেক দ্বারা (এটি আনয়ন নিচে 4 সেকেন্ড)। এটি সত্যিই বিশাল, আইএমও।
vector
এটি একটি সাধারণ উদ্দেশ্যে পুনরায় আকার পরিবর্তনযোগ্য অ্যারে। অভিনন্দন। সমস্ত সাধারণ উদ্দেশ্যে সরঞ্জামগুলির মতো এটি বিশেষায়িত পরিস্থিতি সহ সম্ভব যেখানে এটি সাব-অনুকূল op যে কারণে প্রচলিত জ্ঞান হ'ল একটি দিয়ে শুরু করা vector
এবং প্রয়োজনীয় হলে বিকল্পগুলি বিবেচনা করা।