টুপল এবং স্ট্রাক্ট সম্পর্কে আমাদের একই আলোচনা রয়েছে এবং আমি টুপল এবং স্ট্রাক্টের মধ্যে পারফরম্যান্সের মেয়াদে পার্থক্য সনাক্ত করতে আমার এক সহকর্মীর সাহায্যে কিছু সাধারণ বেঞ্চমার্ক লিখি। আমরা প্রথমে একটি ডিফল্ট কাঠামো এবং একটি টিপল দিয়ে শুরু করি।
struct StructData {
int X;
int Y;
double Cost;
std::string Label;
bool operator==(const StructData &rhs) {
return std::tie(X,Y,Cost, Label) == std::tie(rhs.X, rhs.Y, rhs.Cost, rhs.Label);
}
bool operator<(const StructData &rhs) {
return X < rhs.X || (X == rhs.X && (Y < rhs.Y || (Y == rhs.Y && (Cost < rhs.Cost || (Cost == rhs.Cost && Label < rhs.Label)))));
}
};
using TupleData = std::tuple<int, int, double, std::string>;
তারপরে আমরা আমাদের সহজ স্ট্রাক্ট এবং টিউপলের পারফরম্যান্সের তুলনা করার জন্য সেলোরো ব্যবহার করি। নীচে gcc-4.9.2 এবং ঝনঝন -০.০ ব্যবহার করে সংগৃহীত বেঞ্চমার্ক কোড এবং পারফরম্যান্স ফলাফল রয়েছে:
std::vector<StructData> test_struct_data(const size_t N) {
std::vector<StructData> data(N);
std::transform(data.begin(), data.end(), data.begin(), [N](auto item) {
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, N);
item.X = dis(gen);
item.Y = dis(gen);
item.Cost = item.X * item.Y;
item.Label = std::to_string(item.Cost);
return item;
});
return data;
}
std::vector<TupleData> test_tuple_data(const std::vector<StructData> &input) {
std::vector<TupleData> data(input.size());
std::transform(input.cbegin(), input.cend(), data.begin(),
[](auto item) { return std::tie(item.X, item.Y, item.Cost, item.Label); });
return data;
}
constexpr int NumberOfSamples = 10;
constexpr int NumberOfIterations = 5;
constexpr size_t N = 1000000;
auto const sdata = test_struct_data(N);
auto const tdata = test_tuple_data(sdata);
CELERO_MAIN
BASELINE(Sort, struct, NumberOfSamples, NumberOfIterations) {
std::vector<StructData> data(sdata.begin(), sdata.end());
std::sort(data.begin(), data.end());
}
BENCHMARK(Sort, tuple, NumberOfSamples, NumberOfIterations) {
std::vector<TupleData> data(tdata.begin(), tdata.end());
std::sort(data.begin(), data.end());
}
ঝনঝন -০.০.০ এর সাথে সংগৃহীত পারফরম্যান্স ফলাফল
Celero
Timer resolution: 0.001000 us
-----------------------------------------------------------------------------------------------------------------------------------------------
Group | Experiment | Prob. Space | Samples | Iterations | Baseline | us/Iteration | Iterations/sec |
-----------------------------------------------------------------------------------------------------------------------------------------------
Sort | struct | Null | 10 | 5 | 1.00000 | 196663.40000 | 5.08 |
Sort | tuple | Null | 10 | 5 | 0.92471 | 181857.20000 | 5.50 |
Complete.
এবং gcc-4.9.2 ব্যবহার করে কর্মক্ষমতা ফলাফল সংগ্রহ করা
Celero
Timer resolution: 0.001000 us
-----------------------------------------------------------------------------------------------------------------------------------------------
Group | Experiment | Prob. Space | Samples | Iterations | Baseline | us/Iteration | Iterations/sec |
-----------------------------------------------------------------------------------------------------------------------------------------------
Sort | struct | Null | 10 | 5 | 1.00000 | 219096.00000 | 4.56 |
Sort | tuple | Null | 10 | 5 | 0.91463 | 200391.80000 | 4.99 |
Complete.
উপরের ফলাফলগুলি থেকে আমরা পরিষ্কারভাবে দেখতে পাচ্ছি
আমরা সকলেই জানি যে প্রতিটি একক কাঠামোর সংজ্ঞার জন্য একটি == বা <বা> অপারেটর লেখা বেদনাদায়ক এবং বগী কাজ হবে। এসটিডি :: টাই ব্যবহার করে আমাদের কাস্টম তুলকটি প্রতিস্থাপন করুন এবং আমাদের বেনমার্কটি পুনরায় চালু করুন।
bool operator<(const StructData &rhs) {
return std::tie(X,Y,Cost, Label) < std::tie(rhs.X, rhs.Y, rhs.Cost, rhs.Label);
}
Celero
Timer resolution: 0.001000 us
-----------------------------------------------------------------------------------------------------------------------------------------------
Group | Experiment | Prob. Space | Samples | Iterations | Baseline | us/Iteration | Iterations/sec |
-----------------------------------------------------------------------------------------------------------------------------------------------
Sort | struct | Null | 10 | 5 | 1.00000 | 200508.20000 | 4.99 |
Sort | tuple | Null | 10 | 5 | 0.90033 | 180523.80000 | 5.54 |
Complete.
এখন আমরা দেখতে পাচ্ছি যে std :: টাই ব্যবহার করা আমাদের কোডটিকে আরও মার্জিত করে তোলে এবং ভুল করা শক্ত হয় তবে যাইহোক, আমরা প্রায় 1% পারফরম্যান্স ছেড়ে দেব। আমি এখনই স্ট্যান্ড :: টাইয়ের সমাধানের সাথে থাকব কারণ আমি কাস্টমাইজড তুলনাকারীর সাথে ভাসমান পয়েন্ট সংখ্যা তুলনা করার বিষয়ে একটি সতর্কতাও পেয়েছি।
এখনও অবধি আমাদের স্ট্রাক্ট কোডটি দ্রুত চালানোর জন্য আমাদের কোনও সমাধান হয়নি। অদলবদল ফাংশনটি একবার দেখে নেওয়া যাক এবং আমরা কোনও কার্য সম্পাদন করতে পারি কিনা তা দেখতে এটি আবার লিখুন:
struct StructData {
int X;
int Y;
double Cost;
std::string Label;
bool operator==(const StructData &rhs) {
return std::tie(X,Y,Cost, Label) == std::tie(rhs.X, rhs.Y, rhs.Cost, rhs.Label);
}
void swap(StructData & other)
{
std::swap(X, other.X);
std::swap(Y, other.Y);
std::swap(Cost, other.Cost);
std::swap(Label, other.Label);
}
bool operator<(const StructData &rhs) {
return std::tie(X,Y,Cost, Label) < std::tie(rhs.X, rhs.Y, rhs.Cost, rhs.Label);
}
};
ঝনঝন -০.০.০ ব্যবহার করে পারফরম্যান্স ফলাফল
Celero
Timer resolution: 0.001000 us
-----------------------------------------------------------------------------------------------------------------------------------------------
Group | Experiment | Prob. Space | Samples | Iterations | Baseline | us/Iteration | Iterations/sec |
-----------------------------------------------------------------------------------------------------------------------------------------------
Sort | struct | Null | 10 | 5 | 1.00000 | 176308.80000 | 5.67 |
Sort | tuple | Null | 10 | 5 | 1.02699 | 181067.60000 | 5.52 |
Complete.
এবং gcc-4.9.2 ব্যবহার করে কর্মক্ষমতা ফলাফল সংগ্রহ করা
Celero
Timer resolution: 0.001000 us
-----------------------------------------------------------------------------------------------------------------------------------------------
Group | Experiment | Prob. Space | Samples | Iterations | Baseline | us/Iteration | Iterations/sec |
-----------------------------------------------------------------------------------------------------------------------------------------------
Sort | struct | Null | 10 | 5 | 1.00000 | 198844.80000 | 5.03 |
Sort | tuple | Null | 10 | 5 | 1.00601 | 200039.80000 | 5.00 |
Complete.
এখন আমাদের স্ট্রাক্টটি এখন টিউপলের তুলনায় কিছুটা দ্রুত (প্রায় 3% ঝনঝন করে এবং জিসিসি সহ 1% এর কম) তবে যাইহোক, আমাদের সমস্ত স্ট্রাকের জন্য আমাদের কাস্টমাইজড অদলবদল ফাংশনটি লেখার দরকার নেই।
tuple
বাস্তবায়ন সংজ্ঞায়িত হয়, সুতরাং এটি আপনার বাস্তবায়নের উপর নির্ভর করে। ব্যক্তিগতভাবে, আমি এটি বিশ্বাস করব না ।