ডিবাগ এবং রিলিজ বিল্ডগুলির মধ্যে পারফরম্যান্স পার্থক্য


280

আমাকে অবশ্যই স্বীকার করতে হবে যে সাধারণত আমি আমার প্রোগ্রামে ডিবাগ এবং রিলিজ কনফিগারেশনগুলির মধ্যে স্যুইচিং করতে বিরক্ত করি না এবং প্রোগ্রামগুলি গ্রাহকদের স্থানে স্থাপনের পরেও আমি সাধারণত ডিবাগ কনফিগারেশনের পক্ষে যেতে পছন্দ করেছিলাম ।

যতদুর আমি জানি, এই কনফিগারেশনের মধ্যে একমাত্র পার্থক্য আপনি পরিবর্তন করতে পারি না নিজে যে ডিবাগ আছে DEBUGধ্রুবক সংজ্ঞায়িত এবং রিলিজ আছে নিখুত কোড এর চেক।

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

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

  2. এমন কোনও ধরণের কোড রয়েছে যা ডিবাগ কনফিগারেশনের অধীনে জরিমানা চলতে পারে যা রিলিজ কনফিগারেশনের অধীনে ব্যর্থ হতে পারে বা আপনি কি নিশ্চিত যে ডিবগ কনফিগারেশনের অধীনে পরীক্ষিত এবং সূক্ষ্মভাবে কাজ করা কোডটি রিলিজ কনফিগারেশনের অধীনেও সূক্ষ্মভাবে কাজ করবে।


উত্তর:


511

সি # সংকলক নিজেই নির্গমনিত আইএলকে রিলিজ বিল্ডে কোনও বড় পরিবর্তন করে না। উল্লেখযোগ্য এটি হ'ল এটি আর এনওপি অপকোডগুলি বের করে না যা আপনাকে কোঁকড়া ধনুর্বন্ধনী উপর একটি ব্রেকপয়েন্ট সেট করতে দেয়। বড়টি হ'ল অপটিমাইজার যা জেআইটি সংকলকটিতে অন্তর্নির্মিত। আমি জানি এটি নিম্নলিখিত অপ্টিমাইজেশন করে:

  • ইনলাইনিং পদ্ধতি। পদ্ধতির কোড ইনজেকশন দ্বারা একটি পদ্ধতি কল প্রতিস্থাপন করা হয়। এটি একটি বড়, এটি সম্পত্তির অ্যাক্সেসরগুলি মূলত বিনামূল্যে করে।

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

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

  • লুপ আনরোলিং। ছোট দেহের সাথে লুপগুলি শরীরে 4 বার পর্যন্ত কোডটি পুনরাবৃত্তি করে এবং কম লুপ করে উন্নত হয়। শাখার ব্যয় হ্রাস করে এবং প্রসেসরের সুপার-স্ক্যালারের কার্যকরকরণ বিকল্পগুলি উন্নত করে।

  • ডেড কোড নির্মূলকরণ। যদি (মিথ্যা) like / ... / like এর মত বিবৃতি সম্পূর্ণরূপে নির্মূল হয়ে যায়। ধ্রুবক ভাঁজ এবং ইনলাইনিংয়ের কারণে এটি ঘটতে পারে। অন্যান্য ক্ষেত্রে হ'ল জেআইটি সংকলক নির্ধারণ করতে পারে যে কোডটির কোনও সম্ভাব্য পার্শ্ব-প্রতিক্রিয়া নেই। এই অপটিমাইজেশনটি হ'ল প্রোফাইলিং কোডটি এতটাই জটিল।

  • কোড উত্তোলন একটি লুপের ভিতরে কোড যা লুপ দ্বারা প্রভাবিত হয় না সেটিকে লুপের বাইরে সরিয়ে নেওয়া যায়। সি সংকলকটির অপ্টিমাইজারটি উত্তোলনের সুযোগগুলি খুঁজে পেতে আরও অনেক বেশি সময় ব্যয় করবে। তবে প্রয়োজনীয় ডেটা প্রবাহ বিশ্লেষণের কারণে এটি একটি ব্যয়বহুল অপ্টিমাইজেশন এবং জিটারটি সময় বহন করতে পারে না তাই কেবল সুস্পষ্ট কেস উত্তোলন করে। .NET প্রোগ্রামারদের আরও ভাল উত্স কোড লিখতে এবং নিজেরাই উত্তোলনের জন্য বাধ্য করা।

  • সাধারণ উপ-এক্সপ্রেশন বর্জন। x = y + 4; z = y + 4; z = x হয়; গন্তব্য [ix + 1] = src [ix + 1] এর মত বিবৃতিতে খুব সাধারণ; কোনও সহায়ক ভেরিয়েবলের প্রবর্তন না করে পাঠযোগ্যতার জন্য রচিত written পাঠ্যতার সাথে আপোস করার দরকার নেই।

  • অবিচ্ছিন্ন ভাঁজ x = 1 + 2; এক্স = 3 হয়; এই সাধারণ উদাহরণটি প্রথমটি সংকলক দ্বারা ধরা পড়ে, তবে জেআইটি সময়ে ঘটে যখন অন্যান্য অপ্টিমাইজেশন এটি সম্ভব করে তোলে।

  • কপি প্রচার। x = ক; y = x; y = a; এটি নিবন্ধকের বরাদ্দকারীকে আরও ভাল সিদ্ধান্ত নিতে সহায়তা করে। এটি x86 জিটারে একটি বড় ব্যাপার কারণ এটিতে কাজ করার জন্য খুব কম রেজিস্টার রয়েছে। এটি সঠিকভাবে নির্বাচন করা নিখুঁত গুরুত্বপূর্ণ।

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

আপনার প্রোগ্রামের সম্পাদনার সময় এই অপ্টিমাইজেশনের কার্যকর ফলাফল প্রায়শই অন্য কোথাও চলে এমন কোড দ্বারা প্রভাবিত হয়। একটি ফাইল পড়া, একটি dbase ক্যোয়ারী সম্পাদন, ইত্যাদি কাজ JIT অপ্টিমাইজার তৈরি সম্পূর্ণ অদৃশ্য। যদিও এতে কিছু মনে হয় না :)

জেআইটি অপ্টিমাইজারটি বেশ নির্ভরযোগ্য কোড, বেশিরভাগ কারণেই এটি কয়েক মিলিয়নবার পরীক্ষা দেওয়া হয়েছিল। আপনার প্রোগ্রামটির রিলিজ বিল্ড সংস্করণে সমস্যা হওয়া চরম বিরল। এটি তবে ঘটে। X64 এবং x86 উভয় জিটটারে স্ট্রাক্টগুলির সাথে সমস্যা ছিল। এক্স ৮86 জিটারটিতে ভাসমান পয়েন্টের ধারাবাহিকতায় সমস্যা রয়েছে, যখন ভাসমান পয়েন্ট গণনার মধ্যস্থতিকে এফপিইউ রেজিস্ট্রারে রাখা হয় স্মৃতিতে প্রবাহিত হওয়ার পরিবর্তে 80০-বিট নির্ভুলতায় রাখা হয়।


23
আমি মনে করি না যে সমস্ত সংগ্রহগুলি অ্যারে (গুলি) ব্যবহার LinkedList<T>করে : এটি প্রায়শই ব্যবহৃত হয় না যদিও doesn't
সুইভ

আমার মনে হয় সিএলআর এফপিইউকে 53-বিট যথার্থতা (64-বিট প্রশস্ত ডাবলসের সাথে মিলিয়ে) কনফিগার করে, তাই ফ্লোট 64 এর জন্য কোনও 80-বিট বর্ধিত ডাবল গণনা থাকা উচিত নয়। যাইহোক, ফ্লোট 32 গণনাগুলি এই 53-বিট নির্ভুলতায় গণনা করা যেতে পারে এবং কেবল মেমোরিতে সংরক্ষণ করা হলে তা কেটে দেওয়া হয়।
Govert

2
volatileশব্দ একটি স্ট্যাক ফ্রেম সঞ্চিত স্থানীয় ভেরিয়েবল প্রযোজ্য নয়। এমএসডিএন.মাইক্রোসফট.এইন.ইউএস / লিবারি / এক্স 13ttww7.aspx- তে ডকুমেন্টেশন থেকে : " ভোল্টাইল কীওয়ার্ডটি কেবল একটি শ্রেণি বা কাঠামোর ক্ষেত্রে প্রয়োগ করা যেতে পারে Local স্থানীয় ভেরিয়েবলগুলি অস্থির হিসাবে ঘোষণা করা যায় না।"
ক্রিস ভ্যান্ডারমোটেন

8
একটি নিচু সংশোধনী, আমি কি অনুমান সত্যিই মধ্যে পার্থক্য তোলে Debugএবং Releaseএই ব্যাপারে "অপ্টিমাইজ কোড" চেকবক্সটি যার জন্য উপর স্বাভাবিকভাবে হয় তৈরী করে Releaseকিন্তু বন্ধ Debug। এটি কেবল এটি নিশ্চিত করার জন্য যে পাঠকরা ভিজুয়াল স্টুডিওতে প্রোজেক্ট সম্পত্তি পৃষ্ঠাতে পাওয়া যায় তার চেয়েও অতিক্রম করে দুটি বিল্ড কনফিগারেশনগুলির মধ্যে "যাদু" রয়েছে, অদৃশ্য পার্থক্যগুলি মনে করতে শুরু করবেন না।
চিককডোরো

3
সম্ভবত এটি উল্লেখযোগ্য যে System.Diagnostics.Debug এ কার্যত কোনও পদ্ধতিই ডিবাগ বিল্ডে কিছু করতে পারে না। এছাড়াও ভেরিয়েবলগুলি চূড়ান্তভাবে চূড়ান্ত হয় না তা দেখতে ( স্ট্যাকওভারফ্লো . com / a / 7165380 / 20553 )।
মার্টিন ব্রাউন

23
  1. হ্যাঁ, পারফরম্যান্সে অনেক পার্থক্য রয়েছে এবং এগুলি আপনার কোডে সত্যই প্রয়োগ হয়। ডিবাগ খুব কম পারফরম্যান্স অপ্টিমাইজেশন এবং রিলিজ মোডকে খুব কম করে;

  2. DEBUGধ্রুবকের উপর নির্ভরশীল কেবল কোডগুলিই রিলিজ বিল্ডের সাথে আলাদাভাবে সম্পাদন করতে পারে। তদ্ব্যতীত, আপনার কোনও সমস্যা দেখা উচিত নয়।

DEBUGধ্রুবক কোডের একটি উদাহরণ যা ধ্রুবকটির উপর নির্ভর করে তা হল Debug.Assert()পদ্ধতি, যার বৈশিষ্ট্যটি [Conditional("DEBUG)"]সংজ্ঞায়িত করা হয়। এর অর্থ এটি DEBUGস্থির উপর নির্ভর করে এবং এটি রিলিজ বিল্ডের অন্তর্ভুক্ত নয়।


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

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

2
@ টেস্টালিনো - ঠিক আছে, আজকাল এটি বেশ কঠিন। প্রসেসরগুলি এত দ্রুত গতি পেয়েছে যে ব্যবহারকারী কোনও ক্রিয়াকলাপের কারণে প্রকৃতপক্ষে কোড সম্পাদন করার জন্য কোনও প্রক্রিয়াটির জন্য খুব কমই অপেক্ষা করে, তাই এটি সমস্ত আপেক্ষিক। তবে, যদি আপনি আসলে কিছু দীর্ঘ প্রক্রিয়া করেন তবে হ্যাঁ আপনি খেয়াল করবেন। নিম্নলিখিত কোড উদাঃ 40% ধীর রান অধীনে DEBUG: AppDomain.CurrentDomain.GetAssemblies().Sum(p => p.GetTypes().Sum(p1 => p1.GetProperties().Length))
পিটার ভ্যান জিনকেল

2
এছাড়াও, যদি আপনি চালু থাকেন asp.netএবং রিলিজের পরিবর্তে ডিবাগ ব্যবহার করেন তবে আপনার পৃষ্ঠায় কিছু স্ক্রিপ্ট যুক্ত হতে পারে যেমন: MicrosoftAjax.debug.jsএর প্রায় 7k লাইন রয়েছে।
BrunoLM

13

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

তবে, আপনার যদি অনেক গণনা-ভারী গণনা থাকে তবে আপনি পার্থক্য লক্ষ্য করতে পারেন (@ পিটার উল্লিখিত হিসাবে 40% এর বেশি হতে পারে, যদিও এটি গণনার প্রকৃতির উপর নির্ভর করবে)।

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


11
  • আমার অভিজ্ঞতাটি হ'ল মাঝারি আকারের বা বৃহত্তর অ্যাপ্লিকেশনগুলি একটি রিলিজ বিল্ডে লক্ষণীয়ভাবে বেশি প্রতিক্রিয়াশীল। আপনার অ্যাপ্লিকেশনটিতে এটি ব্যবহার করে দেখুন এবং এটি কেমন লাগে তা দেখুন।

  • রিলিজ বিল্ডগুলির সাথে আপনাকে দংশিত করতে পারে এমন একটি জিনিস হ'ল ডিবাগ বিল্ড কোডটি কখনও কখনও রেসের শর্ত এবং অন্যান্য থ্রেডিং-সম্পর্কিত বাগগুলি দমন করতে পারে। অপ্টিমাইজড কোডের ফলে নির্দেশ পুনরায় ক্রমান্বিত হতে পারে এবং দ্রুত সম্পাদন নির্দিষ্ট জাতিদের শর্তকে বাড়িয়ে তুলতে পারে।


9

আপনার কখনই একটি .NET ডিবাগ বিল্ড উত্পাদনে প্রকাশ করা উচিত নয়। এটিতে সম্পাদনা এবং চালিয়ে যাওয়া সমর্থন করার জন্য কুরুচিপূর্ণ কোড থাকতে পারে বা কে কী জানে। যতদূর আমি জানি, এটি কেবল ভিবিতে ঘটে না সি # (দ্রষ্টব্য: মূল পোস্টটি সি # ট্যাগ করা আছে) তবে এটি এখনও মীমাংসিত করার কারণ দেওয়া উচিত যা মাইক্রোসফ্ট মনে করে যে তারা একটি ডিবাগ বিল্ডের সাথে কী করার অনুমতি দিয়েছে। প্রকৃতপক্ষে। নেট 4.0 এর আগে, ভিবি কোড সম্পাদনা এবং চালিয়ে যাওয়ার সমর্থনে যে ইভেন্টগুলি সম্পাদন করে সেগুলির সাথে অবজেক্টের সংখ্যার সমানুপাতিক মেমরি ফাঁস করে। (যদিও এটি https://connect.microsoft.com/VisualStudio/feedback/details/481671/vb-classes-with-events-are-not-garbage-collected-with-debugging , প্রতি উত্পন্ন কোড প্রতি ঠিক করা হয়েছে বলে জানা গেছে দেখতে অদ্ভুত দেখাচ্ছে, WeakReferenceঅবজেক্ট তৈরি করা এবং এগুলিকে স্থির তালিকায় যুক্ত করার সময়একটি লক ধরে রাখা) আমি অবশ্যই উত্পাদন পরিবেশে এই জাতীয় কোনও ডিবাগিং সমর্থন চাই না!


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

5

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

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


অনুসরণ করতে, এখানে একটি নিবন্ধ যা একটি রিলিজ বাগের উদাহরণ দেয়: কোডেপ্রজেক্ট
রোলি

ডিবেগ সেটিংসের মাধ্যমে অ্যাপ্লিকেশনটি পরীক্ষা করা হয় এবং অনুমোদিত হয়, এমনকি যদি এটি ত্রুটিগুলি দমন করে, এমনকি যদি স্থাপনার সময় রিলিজ বিল্ডটি ব্যর্থ করে দেয় তবে এটির সমস্যা।
vইভিন্দ ব্রুথিন

4

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


1
আইও আবদ্ধ কোডের জন্য, একটি রিলিজ বিল্ড সহজেই ডিবাগের চেয়ে দ্রুততর হতে পারে না।
রিচার্ড

0
    **Debug Mode:**
    Developer use debug mode for debugging the web application on live/local server. Debug mode allow developers to break the execution of program using interrupt 3 and step through the code. Debug mode has below features:
   1) Less optimized code
   2) Some additional instructions are added to enable the developer to set a breakpoint on every source code line.
   3) More memory is used by the source code at runtime.
   4) Scripts & images downloaded by webresource.axd are not cached.
   5) It has big size, and runs slower.

    **Release Mode:**
    Developer use release mode for final deployment of source code on live server. Release mode dlls contain optimized code and it is for customers. Release mode has below features:
   1) More optimized code
   2) Some additional instructions are removed and developer cant set a breakpoint on every source code line.
   3) Less memory is used by the source code at runtime.
   4) Scripts & images downloaded by webresource.axd are cached.
   5) It has small size, and runs fast.

2
রিলিজ মোডের চেয়ে মনে হয় কখনও কখনও কোনও তালিকার প্রথম উপাদানগুলি সঠিকভাবে গণনা করা হয় না। এছাড়াও তালিকার মধ্যে কিছু উপাদান নকল করা হয়। :)
জিয়ান পাওলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.