কম্পাইলাররা কি অন্যান্য ধরণের লুপের তুলনায় লুপগুলি করার জন্য আরও ভাল কোড তৈরি করে?


89

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

https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225

সর্বাধিক (বা কোনও) সংকলক আরও ভাল (যেমন আরও দক্ষ) কোড উত্পন্ন করবে এমন কোনও প্রমাণ আছে কি?

আপডেট: মূল লেখকদের একজন মার্ক অ্যাডলার মন্তব্যগুলিতে কিছুটা প্রসঙ্গ দিয়েছেন


7
যাইহোক, পরিষ্কার করার জন্য, এটি ক্রোমিয়ামের অংশ নয়। আপনি যেমন ইউআরএল থেকে অনুমান করতে পারেন, এটি একটি "তৃতীয় পক্ষের" প্রকল্প এবং আপনি যদি আরও ঘনিষ্ঠভাবে তাকান তবে আপনি বুঝতে পারবেন যে এই কোডটি ZLib, একটি বহুল ব্যবহৃত, সাধারণ-উদ্দেশ্য সংক্ষেপে পাঠাগার থেকে এসেছে from

4
The funny "do {}" generates better code--- এর চেয়ে ভাল কি? () বা বিরক্তিকর চেয়ে মজাদার ছাড়াও নিয়মিত {} করেন?
এন। 'সর্বনাম' মি।

@ এইচ 2 সি 3 স্পষ্টির জন্য আপনাকে ধন্যবাদ, আমি উত্স সম্পর্কে আরও সুনির্দিষ্ট হওয়ার জন্য প্রশ্নটি সম্পাদনা করেছি।
ডেনিস

42
এই মন্তব্যটি 18 বছর আগে বোরল্যান্ড এবং সান সি সংকলকগুলির যুগে রচিত হয়েছিল। সংকলকগুলির সাথে আজ কোনও প্রাসঙ্গিকতা খাঁটি দুর্ঘটনাজনক হবে। মনে রাখবেন যে এই নির্দিষ্ট ব্যবহারের doবিপরীতে, কেবলমাত্র whileশর্তাধীন শাখা এড়ানো যায় না।
মার্ক অ্যাডলার

উত্তর:


108

সবার আগে:

একটি do-whileলুপ একটি হিসাবে একই নয় while-loop বা for-loop।

  • whileএবং forলুপগুলি লুপের বডিটি চালাতে পারে না।
  • একটি do-whileলুপ সর্বদা কমপক্ষে একবার লুপের বডি চালায় - এটি প্রাথমিক অবস্থার চেকটি এড়িয়ে যায় sk

সুতরাং এটি যৌক্তিক পার্থক্য। এটি বলেছে, প্রত্যেকেই এটিকে কঠোরভাবে অনুসরণ করে না। এটা তোলে জন্য বেশ প্রচলিত whileবা forলুপ এমনকি যখন এটা যে এটা সবসময় লুপ অন্তত একবার হবে নিশ্চিত করা হয় ব্যবহৃত হবে। (বিশেষত ভাষাগুলি লুপযুক্ত ভাষায় )

সুতরাং আপেল এবং কমলার তুলনা এড়ানোর জন্য, আমি ধরে নিই যে লুপটি সর্বদা কমপক্ষে একবার চালানো হবে। তদ্ব্যতীত, আমি forআবার লুপগুলি উল্লেখ করব না যেহেতু তারা whileলুপ কাউন্টারটির জন্য মূলত কিছুটা সিনট্যাক্স চিনির সাথে লুপ হয়।

সুতরাং আমি প্রশ্নের উত্তর দেব:

যদি কোনও whileলুপ অন্তত একবার লুপের গ্যারান্টিযুক্ত হয় তবে এর do-whileপরিবর্তে লুপ ব্যবহার করে কোনও কার্যকারিতা পাওয়া যায় ?


একটি do-whileপ্রথম শর্ত চেক এড়িয়ে যায়। সুতরাং মূল্যায়ন করার জন্য একটি কম শাখা এবং একটি কম শর্ত রয়েছে।

যদি শর্তটি পরীক্ষা করা ব্যয়বহুল হয় এবং আপনি জানেন যে আপনাকে অন্তত একবার লুপ দেওয়ার নিশ্চয়তা দেওয়া হয়েছে তবে do-whileলুপটি দ্রুততর হতে পারে।

এবং যদিও এটি সর্বোত্তমভাবে একটি মাইক্রো-অপ্টিমাইজেশন হিসাবে বিবেচিত হয়, এটি কম্পাইলার সর্বদা করতে পারে না: বিশেষত যখন সংকলক প্রমাণ করতে অক্ষম হয় যে লুপটি সর্বদা একবার অন্তত একবার প্রবেশ করবে।


অন্য কথায়, একটি সময় লুপ:

কার্যকরভাবে এই হিসাবে একই:

আপনি যদি জানেন যে আপনি সর্বদা অন্তত একবার লুপ করবেন, যদি-বিবৃতিটি বহিরাগত হয়।


একইভাবে সমাবেশ স্তরটিতে, বিভিন্ন লুপগুলি এইভাবে সংকলন করে:

করণীয় লুপ:

যখন লুপ:

নোট করুন যে শর্তটি নকল হয়ে গেছে। একটি বিকল্প পদ্ধতি হ'ল:

... যা অতিরিক্ত জাম্পের জন্য সদৃশ কোড দূরে ব্যবসা করে।

যেভাবেই হোক, এটি এখনও সাধারণ do-whileলুপের চেয়ে খারাপ worse

এটি বলেছিল, সংকলকরা যা চায় তা করতে পারে। এবং যদি তারা প্রমাণ করতে পারে যে লুপটি সর্বদা একবার প্রবেশ করে, তবে এটি আপনার পক্ষে কাজটি করেছে।


প্রশ্নগুলিতে নির্দিষ্ট উদাহরণের জন্য বিষয়গুলি কিছুটা অদ্ভুত কারণ এটির খালি লুপের দেহ রয়েছে। যেহেতু কোন শরীর, সেখানে মধ্যে কোনো যৌক্তিক পার্থক্য whileএবং do-while

FWIW, আমি ভিজ্যুয়াল স্টুডিও 2012 এ এটি পরীক্ষা করেছি:

  • খালি শরীর সঙ্গে, এটা আসলে একই কোড জেনারেট করে whileএবং do-while। সুতরাং সেই অংশটি সম্ভবত পুরানো দিনের অবশিষ্টাংশ যখন সংকলকরা এত দুর্দান্ত ছিল না।

  • তবে খালি খালি শরীরের সাথে, ভিএস ২০১২ শর্তের কোডটির সদৃশতা এড়াতে পরিচালনা করে, তবে এখনও অতিরিক্ত শর্তযুক্ত জাম্প উত্পন্ন করে।

সুতরাং এটি বিদ্রূপজনক যে প্রশ্নটিতে উদাহরণটি হাইলাইট করে যে কেন do-whileসাধারণ ক্ষেত্রে একটি লুপ দ্রুত হতে পারে, উদাহরণটি নিজেই আধুনিক সংকলকটিতে কোনও লাভ দেয় বলে মনে হয় না।

মন্তব্যটি কত পুরনো ছিল তা বিবেচনা করে, আমরা কেবল এটি অনুমান করতে পারি যে এটি কেন গুরুত্বপূর্ণ। এটি খুব সম্ভব যে সেই সময়কার সংকলকরা শরীরে শূন্য ছিল তা বুঝতে সক্ষম নন। (বা যদি তারা করেন তবে তারা তথ্যটি ব্যবহার করেননি।)


12
তাহলে শর্তটি কি একবারে আরও একবারের মতো দুর্দান্ত সুবিধাটি পরীক্ষা করে দেখা হচ্ছে? আমি অত্যন্ত সন্দেহ। লুপটি 100 বার চালান এবং এটি সম্পূর্ণ তুচ্ছ হয়ে যায়।

7
@ H2CO3 তবে লুপটি কেবল একবার বা দু'বার সঞ্চালিত হলে কী হবে? এবং সদৃশ শর্ত কোড থেকে কোড-আকার বাড়ানো সম্পর্কে কী?
রহস্যময়

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

30
@ H2CO3 "যদি কোনও লুপ কেবল একবার বা দু'বার চালিত হয় তবে সেই লুপটি অপ্টিমাইজ করার মতো নয়" - আমি আলাদা করতে অনুরোধ করছি। এটি অন্য লুপের ভিতরে থাকতে পারে। আমার নিজের প্রচুর অপটিমাইজড এইচপিসি কোডটি এই জাতীয়। এবং হ্যাঁ-করার সময় একটি পার্থক্য করে।
রহস্যময়

29
@ H2CO3 আমি কোথায় বলেছি যে আমি এটি উত্সাহিত করছি? প্রশ্নটি জিজ্ঞাসা করে একটি do-whileলুপটি কিছুক্ষণের চেয়ে দ্রুত। এবং আমি প্রশ্নের উত্তর দিয়েছি এটি দ্রুত হতে পারে। কতটা করে বললাম না। আমি সার্থক কিনা তা বলিনি। আমি কাউকে ডু-ওয়েল লুপগুলিতে রূপান্তর শুরু করার পরামর্শ দিইনি। তবে কেবল অস্বীকার করা যে অপ্টিমাইজেশনের সম্ভাবনা রয়েছে, এমনকি যদি এটি একটি ছোটও হয় তবে আমার মতে যারা যত্ন নেন এবং এই বিষয়গুলিতে আগ্রহী তাদের প্রতি বিরক্তি।
রহস্যময়

24

সর্বাধিক (বা কোনও) সংকলক আরও ভাল (যেমন আরও দক্ষ) কোড উত্পন্ন করবে এমন কোনও প্রমাণ আছে কি?

না অনেক, যদি না আপনি তাকান প্রকৃত একটি সমাবেশ উত্পন্ন প্রকৃত, নির্দিষ্ট কম্পাইলার একটি উপর নির্দিষ্ট প্ল্যাটফর্ম কিছু নির্দিষ্ট অপ্টিমাইজেশান সেটিংস।

প্রায় সম্ভবত দশক আগে এটি উদ্বেগজনক ছিল (যখন জেডলিব লিখিত হয়েছিল) তবে আজকাল অবশ্যই তা নয়, যদি না আপনি সত্যিকারের প্রোফাইল দ্বারা সন্ধান করেন যে এটি আপনার কোড থেকে একটি বাধা মুছে ফেলে।


9
ভাল কথা - premature optimizationকথাটি এখানে মনে আসে mind
জেমস স্নেল

পছন্দ করেছেন এবং এটিই শীর্ষ রেট করা উত্তর সমর্থন করে / উত্সাহ দেয়।

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

16

সংক্ষেপে (tl; dr):

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


বিশদ:

মূল লেখক এই do {} whileউন্নততর কোডের উত্পাদন সম্পর্কে তাঁর মন্তব্য দ্বারা কী বোঝাতে চেয়েছিলেন তা বলা শক্ত , তবে আমি এখানে যে উত্থাপিত হয়েছিল তার চেয়ে অন্য দিকে অনুমান করতে চাই - আমরা বিশ্বাস করি যে do {} whileএবং while {}লুপগুলির মধ্যে পার্থক্যটি বেশ পাতলা (একটি কম শাখা হিসাবে রহস্যবাদী বলেছেন), তবে এই কোডটিতে আরও কিছু "মজাদার" রয়েছে এবং এটি সমস্ত কাজ এই উন্মাদ অবস্থায় ফেলেছে এবং অভ্যন্তরীণ অংশটি খালি রাখছে ( do {})।

আমি gcc 4.8.1 (-O3) এ নিম্নলিখিত কোডটি চেষ্টা করেছি এবং এটি একটি আকর্ষণীয় পার্থক্য দেয় -

সংকলনের পরে -

সুতরাং প্রথম লুপটি 7 টি নির্দেশনা করে যখন দ্বিতীয়টি 6 টি করে, যদিও তাদের একই কাজ করার কথা রয়েছে। এখন, আমি সত্যিই বলতে পারি না এর পিছনে কিছু সংকলক স্মার্টনেস আছে কিনা, সম্ভবত তা নয় এবং এটি কেবল কাকতালীয় তবে আমি এই প্রকল্পটি যে অন্যান্য সংকলক বিকল্পগুলি ব্যবহার করতে পারে তার সাথে কীভাবে এটি ইন্টারেক্ট করে তা আমি পরীক্ষা করে দেখিনি।


অন্যদিকে ঝাঁকুনি 3.3 (-O3) এ, উভয় লুপ এই 5 টি নির্দেশাবলী কোড উত্পন্ন করে:

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


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

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


দেখে মনে হচ্ছে এটি কোনও নিবন্ধভুক্তি সংরক্ষণ করে। mov %rcx,%rsi:) আমি দেখতে পারি যে পুনরায় সাজানো কোড এটি কীভাবে করতে পারে।
রহস্যময়

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

দেখে মনে হচ্ছে না যে এএমডি বুলডোজার এবং ইন্টেল আইভী ব্রিজ পর্যন্ত মুভি নামকরণ কার্যকর করা হয়েছিল। এটা অবাক!
রহস্যময়

@ মিস্টিয়াল, নোট করুন যে এগুলি মোটামুটি প্রথম প্রসেসর যা কোনও দৈহিক নিবন্ধ ফাইল প্রয়োগ করে। পুরানো আউট-অফ-অর্ডার ডিজাইনগুলি কেবলমাত্র রর্ডার বাফারে রেজিস্টার রাখবে, যেখানে আপনি এটি করতে পারবেন না।
লিওর

4
দেখে মনে হচ্ছে আপনি মূল কোডটিতে মন্তব্যটি বেশিরভাগের চেয়ে আলাদাভাবে ব্যাখ্যা করেছেন এবং তা বোঝা যায়। মন্তব্যে বলা হয়েছে "মজার কাজ {} .." তবে এটি অ-মজার সংস্করণটির সাথে তুলনা করে বলে দেয় না। বেশিরভাগ লোকেরা করণীয় এবং করণের মধ্যে পার্থক্য জানেন, সুতরাং আমার অনুমান যে "মজার কাজ {}" তার ক্ষেত্রে প্রযোজ্য নয়, তবে লুপ-অনারোলিং এবং / অথবা অতিরিক্ত অ্যাসাইনমেন্টের অভাবে, যেমন আপনি দেখিয়েছেন এখানে.
আবেল

10

একটি whileলুপ প্রায়শই do-whileশর্তে প্রাথমিক শাখা সহ একটি লুপ হিসাবে সংকলিত হয় , অর্থাৎ

যদিও do-whileপ্রাথমিক শাখা ছাড়াই একটি লুপের সংকলন সমান। আপনি এটি থেকে দেখতে পাচ্ছেন যে while()প্রাথমিক শাখার ব্যয়টি অন্তর্নিহিতভাবে কম দক্ষ, যা কেবল একবার দেওয়া হয়। [বাস্তবায়নের নিখুঁত পদ্ধতির সাথে তুলনা করুন while,যার জন্য পুনরুক্তি প্রতি শর্তসাপেক্ষ শাখা এবং শর্তহীন শাখা উভয়ই প্রয়োজন]]

এটি বলার পরে, তারা আসলে তুলনামূলক বিকল্প নয়। এটি একটি whileলুপকে একটি লুপে রূপান্তরিত করা do-whileএবং তদ্বিপরীত হতে পারে painful তারা বিভিন্ন কাজ করে। এবং এক্ষেত্রে বেশ কয়েকটি পদ্ধতি কল সম্পূর্ণরূপে প্রাধান্য পাবে যা সংকলক তার whileবিপরীতে যা করেছেdo-while.


7

মন্তব্যটি কন্ট্রোল স্টেটমেন্ট বাছাইয়ের বিষয়ে নয় (যখন বনাম করুন) এটি আনরোলিংয়ের লুপ সম্পর্কে !!!

আপনি দেখতে পাচ্ছেন, এটি একটি স্ট্রিং তুলনা ফাংশন (স্ট্রিং উপাদানগুলি সম্ভবত 2 বাইট দীর্ঘ), যা শর্টকাট এবং এক্সপ্রেশনটিতে চারটির পরিবর্তে একক তুলনা দিয়ে লেখা যেতে পারে।

এই পরবর্তী বাস্তবায়নটি দ্রুততর জন্য নিশ্চিত, কারণ এটি প্রতি চারটি উপাদানটির তুলনার পরে স্ট্রিং-এর শর্তের একক চেক করে, যেখানে স্ট্যান্ডার্ড কোডিং তুলনা অনুযায়ী একটি চেক জড়িত। অন্যভাবে বলেছে, 4 উপাদান প্রতি 5 টি পরীক্ষা বনাম 4 উপাদান হিসাবে 8 টি পরীক্ষা।

যাইহোক, স্ট্রিংয়ের দৈর্ঘ্য চারটির একাধিক বা একটি সেন্ডিনেল উপাদান রয়েছে (তবে দুটি স্ট্রিং strendসীমান্তের পার্থক্যের পার্থক্যের গ্যারান্টিযুক্ত ) কেবল তখনই এটি কাজ করবে । বেশ ঝুঁকিপূর্ণ!


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

@ ডেনিস: বিভিন্ন সংকলকের উত্পন্ন কোডটি অনুকূল করার বিভিন্ন উপায় রয়েছে। কেউ কেউ নিজেরাই লুপ-আনرولোলিং করতে পারে (কিছু প্রসারিত করতে) বা অ্যাসাইনমেন্টগুলি অপসারণ করতে পারে। এখানে কোডার কমপ্লিটারটিকে লুপ-আনرولলিংয়ে বাধ্য করে, কম অপ্টিমাইজ করা সংকলকগুলি এখনও ভাল সঞ্চালন করে। আমি মনে করি ইয়ভেস তার অনুমান সম্পর্কে ঠিক সঠিক, তবে মূল কোডারটি কাছাকাছি না থাকলে এটি "মজার" মন্তব্যের পিছনে আসল চিন্তাভাবনাটি কী ছিল তা রহস্যের কিছুটা রয়ে গেছে।
আবেল

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

0

বনাম করার সময় দক্ষতার এই আলোচনা এই ক্ষেত্রে সম্পূর্ণ অর্থহীন, কারণ কোনও শরীর নেই।

এবং

একেবারে সমতুল্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.