এক 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
পদ্ধতি, এমন কিছু বিষয় যা বেশ দ্রুত darned এর বিস্তৃতি যদিও যেহেতু এটি সব ইনলাইন এর কোড-bloaty দিকে একটি বিট। আমি এখনও এটি ব্যবহার করব যদিও এটি পড়ার পক্ষে খুব ভাল।
আমার একই প্রশ্ন ছিল তবে সংক্ষিপ্ত সম্পর্কে vector<bool>
(আফিক মানক এটি বুলিয়ান উপাদানগুলির একটি ধারাবাহিক অ্যারের চেয়ে অভ্যন্তরীণভাবে আলাদাভাবে প্রয়োগ করতে দেয়)। অতএব আমি ফ্যাবিও ফ্রেসাসি দ্বারা সামান্য পরিবর্তিত পরীক্ষার পুনরাবৃত্তি করেছি। ফলাফলগুলি নিম্নরূপ (বার, সেকেন্ডে):
-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;
}
আমি উবুন্টু 17.10 এ জিসিসি 7.2.0 সংকলক ব্যবহার করেছি। সংকলনের জন্য কমান্ড লাইন:
g++ -std=c++11 -O0 main.cpp
g++ -std=c++11 -O3 main.cpp