জিসিসি স্টাড :: আনর্ডার্ড_ম্যাপ বাস্তবায়ন কি ধীর? যদি তাই হয় - কেন?


101

আমরা সি ++ এ একটি উচ্চ কার্যকারিতা সমালোচনামূলক সফ্টওয়্যার তৈরি করছি। সেখানে আমাদের একসাথে হ্যাশ মানচিত্র প্রয়োজন এবং এটি প্রয়োগ করা হয়েছে। সুতরাং আমরা এটি নির্ধারণের জন্য একটি বেঞ্চমার্ক লিখেছিলাম, আমাদের সমবর্তী হ্যাশ মানচিত্রের তুলনায় কত ধীর std::unordered_map

তবে, std::unordered_mapঅবিশ্বাস্যরূপে ধীর বলে মনে হচ্ছে ... সুতরাং এটি আমাদের মাইক্রো-বেঞ্চমার্ক (সমবর্তী মানচিত্রের জন্য আমরা লকটি অপ্টিমাইজড না হয়ে যায় তা নিশ্চিত করার জন্য একটি নতুন থ্রেড তৈরি করেছি এবং মনে রাখবেন যে আমি কখনই 0 টি প্রবেশ করিনি কারণ আমি এর সাথে বেঞ্চমার্কও রেখেছি google::dense_hash_map, যার একটি নাল মান প্রয়োজন):

boost::random::mt19937 rng;
boost::random::uniform_int_distribution<> dist(std::numeric_limits<uint64_t>::min(), std::numeric_limits<uint64_t>::max());
std::vector<uint64_t> vec(SIZE);
for (int i = 0; i < SIZE; ++i) {
    uint64_t val = 0;
    while (val == 0) {
        val = dist(rng);
    }
    vec[i] = val;
}
std::unordered_map<int, long double> map;
auto begin = std::chrono::high_resolution_clock::now();
for (int i = 0; i < SIZE; ++i) {
    map[vec[i]] = 0.0;
}
auto end = std::chrono::high_resolution_clock::now();
auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
std::cout << "inserts: " << elapsed.count() << std::endl;
std::random_shuffle(vec.begin(), vec.end());
begin = std::chrono::high_resolution_clock::now();
long double val;
for (int i = 0; i < SIZE; ++i) {
    val = map[vec[i]];
}
end = std::chrono::high_resolution_clock::now();
elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
std::cout << "get: " << elapsed.count() << std::endl;

(সম্পাদনা: পুরো উত্স কোডটি এখানে পাওয়া যাবে: http://pastebin.com/vPqf7eya )

এর জন্য ফলাফল std::unordered_map:

inserts: 35126
get    : 2959

এর জন্য google::dense_map:

inserts: 3653
get    : 816

আমাদের হ্যান্ড ব্যাকড সমবর্তী মানচিত্রের জন্য (যা লক করে, যদিও বেনমার্কটি একক থ্রেডযুক্ত - তবে একটি পৃথক স্প্যান থ্রেডে):

inserts: 5213
get    : 2594

আমি যদি পাইথ্রেড সমর্থন ছাড়াই বেঞ্চমার্ক প্রোগ্রামটি সংকলন করি এবং মূল থ্রেডে সমস্ত কিছু চালিত করি তবে আমি আমাদের হাতের ব্যাকড সমবর্তী মানচিত্রের জন্য নিম্নলিখিত ফলাফলগুলি পেয়েছি:

inserts: 4441
get    : 1180

আমি নিম্নলিখিত কমান্ডটি দিয়ে সংকলন করছি:

g++-4.7 -O3 -DNDEBUG -I/tmp/benchmap/sparsehash-2.0.2/src/ -std=c++11 -pthread main.cc

সুতরাং বিশেষত সন্নিবেশগুলি std::unordered_mapঅত্যন্ত ব্যয়বহুল বলে মনে হয় - 35 সেকেন্ড বনাম অন্যান্য মানচিত্রের জন্য 3-5 সেকেন্ড। এছাড়াও দেখার সময়টি বেশ বেশি বলে মনে হচ্ছে।

আমার প্রশ্ন: এটা কেন? স্ট্যাকওভারফ্লোতে আমি আর একটি প্রশ্ন পড়েছি যেখানে কেউ জিজ্ঞাসা করে, কেন std::tr1::unordered_mapতার নিজের প্রয়োগের চেয়ে ধীর। সেখানে সর্বাধিক রেট দেওয়া উত্তর বলেছে যে std::tr1::unordered_mapআরও জটিল ইন্টারফেস প্রয়োগ করা দরকার। তবে আমি এই যুক্তিটি দেখতে পাচ্ছি না: আমরা আমাদের সমকালীন_ম্যাপে বালতি পদ্ধতির ব্যবহার করি, std::unordered_mapএকটি বালতি-পদ্ধতিরও ব্যবহার করি ( google::dense_hash_mapনা, তবে std::unordered_mapআমাদের হাতের ব্যাকড কনক্যুরেন্সী-নিরাপদ সংস্করণের চেয়ে কমপক্ষে দ্রুত হওয়া উচিত?)) তা ছাড়া আমি ইন্টারফেসে এমন কিছু দেখতে পাচ্ছি না যা এমন বৈশিষ্ট্যকে বাধ্য করে যা হ্যাশ মানচিত্রটিকে খারাপভাবে সম্পাদন করে ...

সুতরাং আমার প্রশ্ন: এটা std::unordered_mapকি খুব ধীর বলে মনে হচ্ছে সত্য ? যদি না: ভুল কী? যদি হ্যাঁ: এর কারণ কী।

এবং আমার মূল প্রশ্ন: কেন std::unordered_mapএত ভয়াবহ ব্যয়বহুল হিসাবে মান সন্নিবেশ করা হচ্ছে (শুরুতে আমরা পর্যাপ্ত জায়গা সংরক্ষণ করলেও এটি আরও ভাল পারফর্ম করে না - তাই পুনরায় ভাগ করা সমস্যা বলে মনে হচ্ছে না)?

সম্পাদনা:

প্রথমত: হ্যাঁ উপস্থাপিত বেঞ্চমার্কটি ত্রুটিবিহীন নয় - এটি কারণ এটির সাথে আমরা প্রচুর পরিমাণে খেলেছি এবং এটি কেবল একটি হ্যাক (উদাহরণস্বরূপ uint64ints উত্পন্ন করার বিতরণটি বাস্তবে ভাল ধারণা হবে না, 0 লুপে বাদ দিন) এটি একধরণের বোকা ইত্যাদি ...)।

এই মুহুর্তে বেশিরভাগ মন্তব্য ব্যাখ্যা করে, আমি এর জন্য পর্যাপ্ত স্থানটি পূর্বনির্ধারণ করে আনর্ডার্ড_ম্যাপটি আরও দ্রুত করতে পারি। আমাদের প্রয়োগে এটি কেবল সম্ভব নয়: আমরা একটি ডেটাবেস পরিচালনা ব্যবস্থা তৈরি করছি এবং লেনদেনের সময় কিছু তথ্য সংরক্ষণের জন্য একটি হ্যাশ মানচিত্রের প্রয়োজন (উদাহরণস্বরূপ লকিং তথ্য)। সুতরাং এই মানচিত্রটি 1 (ব্যবহারকারী কেবল একটি সন্নিবেশ করায় এবং প্রতিশ্রুতি দেয়) থেকে কয়েক বিলিয়ন এন্ট্রি পর্যন্ত (যদি পুরো টেবিল স্ক্যানগুলি ঘটে থাকে) হতে পারে। এখানে পর্যাপ্ত জায়গাটি বানাতে অসম্ভব (এবং শুরুতে প্রচুর পরিমাণ বরাদ্দ দেওয়া খুব বেশি স্মৃতি গ্রহন করবে)।

তদুপরি, আমি ক্ষমাপ্রার্থী, আমি আমার প্রশ্নটি যথেষ্ট পরিষ্কারভাবে প্রকাশ করি নি: আনর্ডার্ড_ম্যাপটি দ্রুত তৈরি করতে আমি সত্যিই আগ্রহী নই (গুগলসের ঘন হ্যাশ মানচিত্রটি আমাদের পক্ষে ভাল কাজ করে), আমি সত্যিই বুঝতে পারি না যে এই বিশাল পারফরম্যান্সের পার্থক্যগুলি কোথা থেকে এসেছে? । এটি কেবল পূর্বনির্ধারণ হতে পারে না (এমনকি পর্যাপ্ত পূর্বরূপযুক্ত মেমরি থাকা সত্ত্বেও, ঘন মানচিত্রটি আনর্ডার্ড_ম্যাপের চেয়ে দ্রুততর আকারের ক্রম, আমাদের হাতের ব্যাকযুক্ত সমবর্তী মানচিত্র size৪ আকারের অ্যারে দিয়ে শুরু হয় - সুতরাং অর্ডারড_ম্যাপের চেয়ে ছোট একটি)।

তাহলে এই খারাপ পারফরম্যান্সের কারণ কী std::unordered_map? বা অন্যভাবে জিজ্ঞাসা করা হয়েছে: কেউ std::unordered_mapইন্টারফেসের একটি বাস্তবায়ন লিখতে পারেন যা স্ট্যান্ডার্ড কনফর্ম এবং প্রায় (প্রায়) গুগলসের ঘন হ্যাশ মানচিত্রের তত দ্রুত? বা স্ট্যান্ডার্ডে এমন কিছু আছে যা প্রয়োগকারীকে কার্যকর করার জন্য এটি একটি অদক্ষ উপায় চয়ন করে?

সম্পাদনা 2:

প্রোফাইলিংয়ের মাধ্যমে আমি দেখতে পাচ্ছি যে পূর্ণসংখ্যার বিভাজনের জন্য প্রচুর সময় ব্যবহৃত হয়। std::unordered_mapঅ্যারের আকারের জন্য মৌলিক সংখ্যাগুলি ব্যবহার করে, অন্য বাস্তবায়নগুলি দুটির শক্তি ব্যবহার করে। std::unordered_mapমৌলিক সংখ্যা কেন ব্যবহার করে ? হ্যাশ খারাপ হলে আরও ভাল পারফর্ম করতে হবে? ভাল hashes জন্য এটি imho কোন পার্থক্য নেই।

সম্পাদনা 3:

এটির জন্য নম্বরগুলি std::map:

inserts: 16462
get    : 16978

Sooooooo: কেন একটি intoোকানো std::mapচেয়ে দ্রুত মধ্যে সন্নিবেশ করা হয় std::unordered_map... মানে ওয়াট? std::mapআরও খারাপ লোকেশন (ট্রি বনাম অ্যারে) রয়েছে, আরও বরাদ্দ করা দরকার (প্রতি সংঘর্ষের জন্য প্রতি সন্নিবেশ বনাম + প্রতিটি সংঘর্ষের জন্য প্লাস ~ 1) এবং, সবচেয়ে গুরুত্বপূর্ণ: আরেকটি অ্যালগোরিদমিক জটিলতা রয়েছে (ও (লগন) বনাম ও (1))!


4
স্টাডিতে থাকা বেশিরভাগ পাত্রে তাদের অনুমানের সাথে খুব রক্ষণশীল, আমার যে বালতি গণনা আপনি ব্যবহার করছেন (কনস্ট্রাক্টরে উল্লিখিত) তা একবার দেখতে পেয়েছি এবং এটি আপনার জন্য আরও ভাল অনুমানে বাড়িয়েছে SIZE
ইলিশার

আপনি কি ইন্টেল টিবিবি থেকে একযোগে_হ্যাশ_ম্যাপ চেষ্টা করেছেন? থ্রেডিং
বিল্ডিংব্লকস.আর

4
@ ম্যাড সায়েন্টিস্ট আমরা টিবিবি বিবেচনা করেছি। সমস্যাটি লাইসেন্সিংয়ের: এটি একটি গবেষণা প্রকল্প এবং আমরা কীভাবে এটি প্রকাশ করব তা এখনও নিশ্চিত নই (সবচেয়ে স্পষ্টভাবে ওপেন সোর্স - তবে আমরা যদি বাণিজ্যিক পণ্যটিতে ব্যবহারের অনুমতি দিতে চাই তবে জিপিএলভি 2 খুব সীমাবদ্ধ)। এছাড়াও এটি অন্য একটি নির্ভরতা। তবে হতে পারে আমরা এটি পরবর্তী সময়ে ব্যবহার করব, এখন পর্যন্ত আমরা এটিকে ছাড়া ভালভাবে বেঁচে থাকতে পারি।
মার্কাস পিলম্যান

4
এটি কোনও প্রোফাইকারের অধীনে ভালগ্রাইন্ডের অধীনে চালানো অন্তর্দৃষ্টিপূর্ণ হতে পারে।
ম্যাক্সিম এগারুশকিন

4
হ্যাশ টেবিলের লোকাল গাছের স্থানীয়তার চেয়ে কিছুটা ভাল, এই হ্যাশ ফাংশনটি আপনাকে নিকটবর্তী সময়ে খুব কমই কাছের আইটেম অ্যাক্সেস নিশ্চিত করে। আপনার কেবলমাত্র সুবিধাটি হ'ল হ্যাশটেবল অ্যারে হ'ল একটি স্বতন্ত্র ব্লক। এটি কোনও গাছের ক্ষেত্রেই সত্য হতে পারে, যদি গাদাটি খণ্ডিত না হয় এবং আপনি গাছটি একবারে তৈরি করেন। আকারটি একবার ক্যাশের চেয়ে বড় হয়ে গেলে, পারফরম্যান্সে কোনও পার্থক্য থাকলে লোকালয়ে পার্থক্য সামান্যই তৈরি করে।
স্টিভ 314

উত্তর:


87

আমি কারণটি খুঁজে পেয়েছি: এটি জিসিসি -৪.7 এর একটি সমস্যা !!

জিসিসি-৪.7 সহ

inserts: 37728
get    : 2985

জিসিসি -৪.6 সহ

inserts: 2531
get    : 1565

সুতরাং std::unordered_mapgcc-4.7 এ ভাঙ্গা হয়েছে (বা আমার ইনস্টলেশন, যা উবুন্টুতে gcc-4.7.0 এর একটি ইনস্টলেশন - এবং অন্য একটি ইনস্টলেশন যা ডিবিয়ান পরীক্ষায় জিসিসি 4.7.1 হয়)।

আমি একটি ত্রুটি প্রতিবেদন জমা দেব .. std::unordered_mapততক্ষণে : জিসিসি 4.7 ব্যবহার করবেন না !


৪.6 থেকে ব-দ্বীপে এমন কিছু আছে যা এর কারণ হতে পারে?
ক্যানলাস চিহ্নিত করুন

30
মেলিং তালিকায় ইতিমধ্যে একটি প্রতিবেদন রয়েছে। আলোচনাটি "ফিক্সগুলি" max_load_factorপরিচালনা করার দিকে ইঙ্গিত করছে বলে মনে হচ্ছে , যার ফলে পারফরম্যান্সে পার্থক্য দেখা দিয়েছে।
jxh

এই বাগের জন্য খারাপ সময়! আনর্ডার্ড_ম্যাপের সাথে আমি খুব খারাপ পারফরম্যান্স পাচ্ছিলাম তবে আমি আনন্দিত যে এটি রিপোর্ট করা হয়েছে এবং "স্থির" হয়েছে।
বো লু

+1 - কী স্তন্যপান BBBBBUG .. আমি অবাক হই gcc-4.8.2 দিয়ে কি হয়
ikh

4
এই বাগ সম্পর্কে কোনও আপডেট আছে? এটি এখনও জিসিসির পরবর্তী সংস্করণগুলির জন্য বিদ্যমান (5+)?
rph

21

আমি অনুমান করছি যে আপনি unordered_mapইলিশার পরামর্শ মতো আপনার আকারটি সঠিকভাবে মাপেননি। চেইনগুলি যখন দীর্ঘায়িত হয় unordered_mapতখন জি ++ বাস্তবায়ন স্বয়ংক্রিয়ভাবে একটি বৃহত্তর হ্যাশ টেবিলটিতে পুনঃস্থাপন করা হবে এবং এটি কার্য সম্পাদনের ক্ষেত্রে একটি বড় টান হবে। আমি যদি সঠিকভাবে মনে রাখি তবে unordered_mapডিফল্ট (এর চেয়ে ক্ষুদ্রতম প্রাইম বড়) 100

chronoআমার সিস্টেমে ছিল না , তাই আমি সময় কাটিয়েছি times()

template <typename TEST>
void time_test (TEST t, const char *m) {
    struct tms start;
    struct tms finish;
    long ticks_per_second;

    times(&start);
    t();
    times(&finish);
    ticks_per_second = sysconf(_SC_CLK_TCK);
    std::cout << "elapsed: "
              << ((finish.tms_utime - start.tms_utime
                   + finish.tms_stime - start.tms_stime)
                  / (1.0 * ticks_per_second))
              << " " << m << std::endl;
}

আমি একটি ব্যবহৃত SIZEএর 10000000, এবং আমার সংস্করণের জন্য কিছু একটু পরিবর্তন করতে হয়েছিল boost। আরও মনে রাখবেন, আমি ম্যাচ করার জন্য হ্যাশ টেবিলটি প্রাক-আকারযুক্ত করেছি SIZE/DEPTH, যেখানে DEPTHহ্যাশের সংঘর্ষের কারণে বালতি চেইনের দৈর্ঘ্যের একটি অনুমান।

সম্পাদনা: হাওয়ার্ড মন্তব্য আমার কাছে তুলে ধরে যে জন্য সর্বোচ্চ লোড ফ্যাক্টর unordered_mapহয় 1। সুতরাং, DEPTHকোডটি কতবার পুনরায় ভাগ করবে নিয়ন্ত্রণগুলি।

#define SIZE 10000000
#define DEPTH 3
std::vector<uint64_t> vec(SIZE);
boost::mt19937 rng;
boost::uniform_int<uint64_t> dist(std::numeric_limits<uint64_t>::min(),
                                  std::numeric_limits<uint64_t>::max());
std::unordered_map<int, long double> map(SIZE/DEPTH);

void
test_insert () {
    for (int i = 0; i < SIZE; ++i) {
        map[vec[i]] = 0.0;
    }
}

void
test_get () {
    long double val;
    for (int i = 0; i < SIZE; ++i) {
        val = map[vec[i]];
    }
}

int main () {
    for (int i = 0; i < SIZE; ++i) {
        uint64_t val = 0;
        while (val == 0) {
            val = dist(rng);
        }
        vec[i] = val;
    }
    time_test(test_insert, "inserts");
    std::random_shuffle(vec.begin(), vec.end());
    time_test(test_insert, "get");
}

সম্পাদনা করুন:

আমি কোডটি পরিবর্তন করেছি যাতে আমি DEPTHআরও সহজেই পরিবর্তন করতে পারি ।

#ifndef DEPTH
#define DEPTH 10000000
#endif

সুতরাং, ডিফল্টরূপে, হ্যাশ টেবিলের জন্য সবচেয়ে খারাপ আকার চয়ন করা হয়।

elapsed: 7.12 inserts, elapsed: 2.32 get, -DDEPTH=10000000
elapsed: 6.99 inserts, elapsed: 2.58 get, -DDEPTH=1000000
elapsed: 8.94 inserts, elapsed: 2.18 get, -DDEPTH=100000
elapsed: 5.23 inserts, elapsed: 2.41 get, -DDEPTH=10000
elapsed: 5.35 inserts, elapsed: 2.55 get, -DDEPTH=1000
elapsed: 6.29 inserts, elapsed: 2.05 get, -DDEPTH=100
elapsed: 6.76 inserts, elapsed: 2.03 get, -DDEPTH=10
elapsed: 2.86 inserts, elapsed: 2.29 get, -DDEPTH=1

আমার উপসংহারটি হল যে কোনও অনন্য সন্নিবেশের সম্পূর্ণ প্রত্যাশিত সংখ্যার সমান করে তুলতে অন্য কোনও প্রাথমিক হ্যাশ টেবিলের আকারের জন্য তাত্পর্যপূর্ণ পারফরম্যান্সের পার্থক্য নেই। এছাড়াও, আপনি যে পরিমাপের পারফরম্যান্স পার্থক্যটি পর্যবেক্ষণ করছেন তার ক্রমটি আমি দেখতে পাচ্ছি না।


6
std::unordered_mapডিফল্ট সর্বাধিক লোড ফ্যাক্টর 1 রয়েছে। সুতরাং বালতিগুলির প্রাথমিক সংখ্যা বাদে আপনার ডিপটিএটি উপেক্ষা করা হবে। ইচ্ছা করলেই পারেন map.max_load_factor(DEPTH)
হাওয়ার্ড হিন্যান্ট

@ হাওয়ার্ডহিন্যান্ট: এই তথ্যের জন্য ধন্যবাদ। সুতরাং DEPTHএটিকে অগ্রাহ্য করা হয়েছে, তবে এটি এখনও নিয়ন্ত্রণ করে যে কত বেশি বার মানচিত্রটি বৃহত্তর মানচিত্রে পুনঃসংশ্লিষ্ট হবে। উত্তর আপডেট করা হয়েছে, এবং আবার ধন্যবাদ
jxh

@ ব্যবহারকারীর315052 হ্যাঁ আমি জানি আমি শুরুতে এটিকে বোঝার আকার দিয়ে এটি আরও ভাল করতে পারি - তবে আমি আমাদের সফ্টওয়্যারটিতে এটি করতে পারি না (এটি একটি গবেষণা প্রকল্প - একটি ডিবিএমএস) এবং সেখানে আমি কতটা willোকাতে পারি তা জানতে পারি না - এটি 0 থেকে 1 বিলিয়ন ...) এর মধ্যে পরিবর্তিত হতে পারে। তবে প্রিলিক্লিকেশন দিয়েও এটি আমাদের মানচিত্রের চেয়ে ধীর এবং গগলসের ঘন_ম্যাপের চেয়ে ধীর - আমি এখনও ভাবছি যে এটি কি এটি বড় পার্থক্য রাখে।
মার্কাস পিলম্যান

@ মারকাসপিলম্যান: আমার ফলাফলগুলি আপনার সাথে কীভাবে তুলনা করা যায় তা আমি জানি না, কারণ আপনি কখনই সরবরাহ করেননি যে আপনি কত বড় SIZEকাজ করছেন। আমি বলতে পারি সেটটি unordered_mapদ্বিগুণ দ্রুত এবং যথাযথভাবে পূর্বনির্ধারিত। DEPTH1
jxh

4
@ মারকাসপিলম্যান: আমার সময়গুলি ইতিমধ্যে কয়েক সেকেন্ডের মধ্যে। আমি ভেবেছিলাম আপনার সময়গুলি মিলি সেকেন্ডে ছিল। যদি DEPTHসেট সহ সন্নিবেশগুলি সেকেন্ডের 1চেয়ে কম সময় নিচ্ছে 3, তবে এটি কীভাবে প্রস্থের ক্রমকে ধীর করবে?
jxh

3

আমি আপনার কোডটি একটি 64 বিট / এএমডি / 4 কোর (2.1GHz) কম্পিউটার ব্যবহার করে চালিয়েছি এবং এটি আমাকে নিম্নলিখিত ফলাফল দিয়েছে:

MinGW-W64 4.9.2:

Std :: unordered_map ব্যবহার :

inserts: 9280 
get: 3302

স্ট্যান্ড :: মানচিত্র ব্যবহার করে :

inserts: 23946
get: 24824

ভিসি 2015 আমার জানা সমস্ত অপটিমাইজেশন পতাকা সহ:

Std :: unordered_map ব্যবহার :

inserts: 7289
get: 1908

স্ট্যান্ড :: মানচিত্র ব্যবহার করে :

inserts: 19222 
get: 19711

আমি জিসিসি ব্যবহার করে কোডটি পরীক্ষা করে দেখিনি তবে আমি মনে করি এটি ভিসির পারফরম্যান্সের সাথে তুলনামূলক হতে পারে, তাই যদি এটি সত্য হয় তবে জিসিসি ৪.৯ স্ট্যান্ডার্ড :: আনর্ডার্ড_ম্যাপটি এটি এখনও ভাঙ্গা।

[সম্পাদনা]

সুতরাং হ্যাঁ, কেউ মন্তব্যে যেমন বলেছিলেন, জিসিসি 4.9.x এর পারফরম্যান্স ভিসি পারফরম্যান্সের সাথে তুলনামূলক হবে তা ভাবার কোনও কারণ নেই। যখন আমার পরিবর্তন হবে আমি জিসিসিতে কোডটি পরীক্ষা করব।

আমার উত্তরটি কেবলমাত্র অন্য উত্তরের জন্য এক ধরণের জ্ঞান ভিত্তি প্রতিষ্ঠা করা।


"আমি জিসিসি ব্যবহার করে কোডটি পরীক্ষা করি নি তবে আমার ধারণা এটি ভিসির পারফরম্যান্সের সাথে তুলনীয় হতে পারে।" মূল পোস্টে পাওয়া কোনওটির সাথে তুলনীয় কোনও মানদণ্ড ছাড়াই সম্পূর্ণ ভিত্তিহীন দাবি। এই "উত্তর" কোনও অর্থে প্রশ্নের উত্তর দেয় না, "কেন" প্রশ্নের উত্তর একা ছেড়ে দেওয়া যাক।
4ae1e1

4
"আমি জিসিসি ব্যবহার করে কোডটি পরীক্ষা করে দেখিনি" ... আপনি কীভাবে মিনজিডাব্লু অর্জন এবং ব্যবহার সম্পর্কে পরিচালনা করেছেন তা সম্পর্কে এত অল্প কিছু জানার পরে? মিনজিডাব্লু মূলত জিসিসির একটি ঘনিষ্ঠভাবে ট্র্যাকিং বন্দর।
আন্ডারস্কোর_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.