হাই স্কুলে আমার প্রথম প্রোগ্রামিং ক্লাস থেকেই, আমি শুনেছি যে স্ট্রিং অপারেশনগুলি ধীরে ধীরে - অর্থাত্ ব্যয়বহুল - পৌরাণিক "গড় অপারেশন" এর চেয়ে বেশি। কেন তাদের এত ধীর করে তোলে? (এই প্রশ্নটি ইচ্ছাকৃতভাবে বিস্তৃত হয়েছে))
হাই স্কুলে আমার প্রথম প্রোগ্রামিং ক্লাস থেকেই, আমি শুনেছি যে স্ট্রিং অপারেশনগুলি ধীরে ধীরে - অর্থাত্ ব্যয়বহুল - পৌরাণিক "গড় অপারেশন" এর চেয়ে বেশি। কেন তাদের এত ধীর করে তোলে? (এই প্রশ্নটি ইচ্ছাকৃতভাবে বিস্তৃত হয়েছে))
উত্তর:
"গড় অপারেশন" আদিমদের উপর সঞ্চালিত হয়। এমনকি যে ভাষাগুলিতে স্ট্রিংগুলিকে আদিম হিসাবে বিবেচনা করা হয়, সেগুলি এখনও হুডের নীচে অ্যারে হয় এবং পুরো স্ট্রিংয়ের সাথে জড়িত যে কোনও কিছু করতে O (N) সময় লাগে, যেখানে N স্ট্রিংয়ের দৈর্ঘ্য।
উদাহরণস্বরূপ, দুটি সংখ্যা যুক্ত করতে সাধারণত 2-4 এএসএম নির্দেশিকা লাগে। দুটি স্ট্রিং কনটেকটিং ("যুক্ত") এর জন্য একটি নতুন মেমরি বরাদ্দ প্রয়োজন এবং একটি বা দুটি স্ট্রিং অনুলিপি রয়েছে, পুরো স্ট্রিং জড়িত।
কিছু ভাষার কারণ এটি আরও খারাপ করতে পারে। সিতে, উদাহরণস্বরূপ, একটি স্ট্রিং কেবলমাত্র নাল-সমাপ্ত অক্ষরের অক্ষরের পয়েন্টার। এর অর্থ হল আপনি কতক্ষণ এটি জানেন না, তাই দ্রুত পদক্ষেপের ক্রিয়াকলাপগুলির সাথে স্ট্রিং-অনুলিপি লুপটি অনুকূলকরণের উপায় নেই; আপনাকে একবারে একটি অক্ষর অনুলিপি করতে হবে যাতে আপনি নাল টার্মিনেটরের জন্য প্রতিটি বাইট পরীক্ষা করতে পারেন।
char*
নয়, একটি প্রত্যাশা করে strbuf
এবং আপনি আবার স্কোয়ারে ফিরে যাবেন There সেখানে আপনি কেবলমাত্র অনেক কিছুই রয়েছেন যখন কোনও খারাপ ডিজাইন ভাষায় বেক করা হয় তখন তা করতে পারে।
buf
পয়েন্টার আছে। আমি কখনই বোঝাতে চাইনি যে এটি উপলব্ধ নয়; বরং এটি প্রয়োজনীয়। স্ট্যান্ডার্ড লাইব্রেরি হিসাবে মৌলিক হিসাবে আপনার অপ্টিমাইজড-কিন্তু-নন-স্ট্যান্ডার্ড স্ট্রিং টাইপ সম্পর্কে জানে না এমন কোনও কোড এখনও ধীর, অনিরাপদে ফিরে যেতে হবে char*
। আপনি চাইলে সেই FUD কল করতে পারেন, তবে এটি সত্য হয় না।
এটি একটি পুরানো থ্রেড এবং আমার মনে হয় যে অন্যান্য উত্তরগুলি দুর্দান্ত, তবে কিছু উপেক্ষা করুন, সুতরাং এখানে আমার (দেরিতে) 2 সেন্ট রয়েছে।
স্ট্রিংগুলির সমস্যাটি হ'ল তারা বেশিরভাগ ভাষায় দ্বিতীয় শ্রেণির নাগরিক এবং প্রকৃতপক্ষে বেশিরভাগ সময়ই ভাষাটি নির্দিষ্টকরণের কোনও অংশই হয় না: এগুলি একটি লাইব্রেরি-বাস্তবায়িত নির্মাণ যা কিছু অংশে মাঝে মাঝে সিনট্যাকটিক চিনির প্রলেপ দিয়ে থাকে তাদের ব্যবহার করতে ব্যথা কম করতে।
এর প্রত্যক্ষ পরিণতি হ'ল ভাষা তাদের জটিলতার একটি খুব বড় অংশকে আপনার দৃষ্টিকোণ থেকে দূরে রাখে এবং আপনি স্নেহাত্মক পার্শ্ব-প্রতিক্রিয়াগুলির জন্য অর্থ প্রদান করেন কারণ আপনি তাদেরকে নিম্ন-স্তরের পারমাণবিক সত্তার মতো বিবেচনা করার অভ্যাসে পরিণত হন, ঠিক তেমনই like অন্যান্য আদিম ধরণের (যেমন শীর্ষ ভোটের উত্তর এবং অন্যরা ব্যাখ্যা করেছেন)।
এই অন্তর্নিহিত "জটিলতা" এর অন্যতম উপাদান হ'ল বেশিরভাগ স্ট্রিং বাস্তবায়নগুলি স্ট্রিংকে উপস্থাপন করতে কিছুটা স্বচ্ছ মেমরির স্থান সহ একটি সাধারণ ডেটা-কাঠামো ব্যবহার করে: আপনার ভাল ওল 'অ্যারে।
এটি পুরোপুরি স্ট্রিংয়ের অ্যাক্সেস দ্রুত হতে চাইলে এটি আপনাকে বোঝায় good আপনি যখন এই স্ট্রিংটি পরিচালনা করতে চান তবে এটি সম্ভাব্য ভয়ঙ্কর ব্যয়গুলি বোঝায়। মধ্যম শক্তি মধ্যে একটি উপাদান অ্যাক্সেস ফাস্ট যদি আপনি জানেন কি সূচক তোমার পরে আছে, কিন্তু হয় খুঁজছেন একটি উপাদান একটি শর্ত উপর ভিত্তি করে নয়।
এমনকি স্ট্রিংয়ের আকারটি ফিরিয়ে দেওয়া ব্যয়বহুল হতে পারে, যদি আপনার ভাষা স্ট্রিংয়ের দৈর্ঘ্যকে ক্যাশে না করে এবং অক্ষর গণনা করার জন্য এটির মধ্য দিয়ে চলতে হয়।
অনুরূপ কারণে, যোগ আপনার স্ট্রিং উপাদান ব্যয়বহুল প্রমাণ আপনার কাছে সবচেয়ে সম্ভবত প্রয়োজন এই অপারেশন সঞ্চালনের জন্য কিছু স্মৃতি পুনরায় বরাদ্দ করব যেমন হবে।
সুতরাং, বিভিন্ন ভাষা এই ইস্যুগুলিতে বিভিন্ন পন্থা গ্রহণ করে। উদাহরণস্বরূপ, জাভা কিছু বৈধ কারণে (ক্যাসিংয়ের দৈর্ঘ্য, থ্রেড-সুরক্ষা) এবং তার পরিবর্তনীয় অংশগুলির (স্ট্রিংবফার এবং স্ট্রিংবিল্ডার) জন্য বরাদ্দকরণের প্রয়োজন হবে না, আকারের বরাদ্দ পছন্দ করবে তার স্ট্রিংগুলি পরিবর্তনযোগ্য করার স্বাধীনতা গ্রহণ করেছে প্রতিবার, তবে সেরা কেস দৃশ্যের জন্য আশা করি। এটি সাধারণত ভালভাবে কাজ করে, তবে ডাউন-সাইডটি কখনও কখনও মেমরির প্রভাবগুলির জন্য অর্থ প্রদান করে।
এছাড়াও, আবার এটি আপনার ভাষার সিনট্যাকটিক চিনির প্রলেপটি খোলার জন্য আপনার কাছ থেকে লুকিয়ে রাখার কারণে ঘটে, আপনি প্রায়শই এটি ইউনিকোড সমর্থনের শর্ত মনে করেন না (বিশেষত যতক্ষণ আপনার সত্যিকার প্রয়োজন নেই) এবং যে প্রাচীর আঘাত। এবং কিছু ভাষাগুলি, এগিয়ে যাওয়ার চিন্তাভাবনা করে, সাধারণ 8-বিট চর প্রিমিটিভগুলির অন্তর্নিহিত অ্যারেগুলির সাথে স্ট্রিংগুলি প্রয়োগ করে না। তারা আপনার জন্য ইউটিএফ -8 বা ইউটিএফ -16 বা আপনার কী-কী সমর্থন করে তা বেকড করেছে এবং এর পরিণতি হ'ল মেমরির প্রচুর পরিমাণে ব্যয় হয়, যা প্রায়শই প্রয়োজন হয় না এবং মেমরি বরাদ্দ করার জন্য বৃহত্তর প্রক্রিয়াকরণের সময়, স্ট্রিংগুলি প্রক্রিয়া করে, এবং কোড পয়েন্টগুলি ম্যানিপুলেট করার সাথে যুক্ত সমস্ত যুক্তি বাস্তবায়ন করুন।
এই সমস্তগুলির ফলাফল, আপনি যখন সিউডো-কোডের সমতুল্য কিছু করেন:
hello = "hello,"
world = " world!"
str = hello + world
এটি নাও হতে পারে - ভাষা বিকাশকারীরা সর্বোত্তম প্রচেষ্টা সত্ত্বেও আপনি বাদে যেমন ব্যবহার করতে চান - এটি একটি সহজ:
a = 1;
b = 2;
shouldBeThree = a + b
ফলোআপ হিসাবে, আপনি পড়তে চাইতে পারেন:
তাত্ত্বিক র্যান্ডম-অ্যাক্সেস স্টোরড-প্রোগ্রাম মেশিনের একক ক্রিয়াকলাপটি সম্ভবত "গড় অপারেশন" শর্টহ্যান্ড । এটি বিভিন্ন তত অ্যালগরিদমের চলমান সময় বিশ্লেষণ করতে ব্যবহার করার প্রথাগত এটি তাত্ত্বিক মেশিন।
জেনেরিক অপারেশনগুলি সাধারণত লোড, অ্যাড, বিয়োগ, সঞ্চয়, শাখা হিসাবে নেওয়া হয়। হতে পারে পড়ুন, মুদ্রণ করুন এবং থামিয়ে দিন।
তবে বেশিরভাগ স্ট্রিং অপারেশনের জন্য এই কয়েকটি মৌলিক অপারেশন প্রয়োজন require উদাহরণস্বরূপ, স্ট্রিংটিকে সদৃশ করার জন্য একটি অনুলিপি অপারেশন প্রয়োজন হয় এবং অতএব বেশ কয়েকটি অপারেশন যা একটি স্ট্রিংয়ের দৈর্ঘ্যের সাথে সমানুপাতিক হয় (এটি "লিনিয়ার")। অন্য স্ট্রিংয়ের মধ্যে একটি স্ট্রিং সন্ধান করার ক্ষেত্রেও রৈখিক জটিলতা রয়েছে।
এটি সম্পূর্ণরূপে অপারেশন, স্ট্রিংগুলি কীভাবে উপস্থাপিত হয় এবং কী কী অপ্টিমাইজেশান বিদ্যমান তা নির্ভর করে। স্ট্রিংগুলি দৈর্ঘ্যে 4 বা 8 বাইট হয় (এবং প্রান্তিককরণ), এগুলি অগত্যা ধীর হবে না - অনেকগুলি ক্রিয়াকলাপ আদিমগুলির মতোই দ্রুত হবে। অথবা, যদি সমস্ত স্ট্রিংয়ের 32-বিট বা 64-বিট হ্যাশ থাকে তবে অনেকগুলি ক্রিয়াকলাপও ঠিক তত দ্রুত হবে (যদিও আপনি হ্যাশিংয়ের ব্যয় সামনের দিকে প্রদান করে)।
এটি "ধীর" বলতে কী বোঝায় তার উপরও নির্ভর করে। বেশিরভাগ প্রোগ্রামগুলি প্রয়োজনীয়তার জন্য স্ট্রিংগুলি প্রচুর দ্রুত প্রক্রিয়াকরণ করবে। স্ট্রিং তুলনা দুটি ইন্টের তুলনায় তত দ্রুত নাও হতে পারে তবে কেবল প্রোফাইলিংই আপনাকে জানায় যে "ধীর" আপনার প্রোগ্রামটির অর্থ কী।
আমাকে একটি প্রশ্ন দিয়ে আপনার প্রশ্নের উত্তর দিন। শব্দগুলির একটি স্ট্রিং বলতে কেন একটি শব্দ বলার চেয়ে বেশি সময় লাগে?