স্ট্রিং এত ধীর কেন?


23

হাই স্কুলে আমার প্রথম প্রোগ্রামিং ক্লাস থেকেই, আমি শুনেছি যে স্ট্রিং অপারেশনগুলি ধীরে ধীরে - অর্থাত্ ব্যয়বহুল - পৌরাণিক "গড় অপারেশন" এর চেয়ে বেশি। কেন তাদের এত ধীর করে তোলে? (এই প্রশ্নটি ইচ্ছাকৃতভাবে বিস্তৃত হয়েছে))


11
যদি আপনি জানেন যে এই "গড় অপারেশনগুলি" পৌরাণিক, তবে আপনি কি তাদের কমপক্ষে কিছু বলতে পারেন? আপনি যেমন একটি অস্পষ্ট প্রশ্ন জিজ্ঞাসা করছেন, এই দৃ un়বিশ্বাস্য ক্রিয়াকলাপগুলি সত্যই পৌরাণিক যে আপনার দৃ trust় বিশ্বাসের পক্ষে বিশ্বাস করা শক্ত।
Seh

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

আসলকথা কি ? যদি বলা স্ট্রিংগুলি আসলে ধীর হয়, আপনি কি সেগুলি ব্যবহার বন্ধ করবেন?
তুলাইনস কর্ডোভা

ভুলে যান. যদি কেউ আপনাকে এই ধরণের বাজে কথা বলেন, তবে পাল্টা প্রশ্নটি হ'ল: "আসলেই কি তারা? আমরা কি তখন কোন ইন্টার-অ্যারে ব্যবহার করব?"
ইনগো

উত্তর:


47

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

উদাহরণস্বরূপ, দুটি সংখ্যা যুক্ত করতে সাধারণত 2-4 এএসএম নির্দেশিকা লাগে। দুটি স্ট্রিং কনটেকটিং ("যুক্ত") এর জন্য একটি নতুন মেমরি বরাদ্দ প্রয়োজন এবং একটি বা দুটি স্ট্রিং অনুলিপি রয়েছে, পুরো স্ট্রিং জড়িত।

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


4
এবং নির্দিষ্ট কিছু ভাষা এটিকে আরও ভাল করে তোলে: অ্যারের শুরুতে ডেলফির স্ট্রিং দৈর্ঘ্যের এনকোডিং স্ট্রিং সংমিশ্রণটিকে খুব দ্রুত করে তোলে।
ফ্র্যাঙ্ক শিয়েরার

4
@ গাবলিন: এটি স্ট্রিংকে আরও দ্রুত অনুলিপি করার মাধ্যমেও সহায়তা করে। যখন আপনি সামনের আকারটি জানবেন, আপনাকে একবারে একটি বাইট কপি করতে হবে এবং প্রতিটি বাইট নাল টার্মিনেটরের জন্য যাচাই করতে হবে না, যাতে আপনি সিমড রিপ্রেস সহ যে কোনও রেজিস্টারের পুরো আকারটি ডেটা চলাচলের জন্য ব্যবহার করতে পারবেন এটি 16 বার দ্রুত গতিতে
ম্যাসন হুইলার

4
@ ম্যাথেপিক: হ্যাঁ, এবং এটি আপনাকে যতটা নেবে ততক্ষণ তা ঠিক আছে তবে আপনি যখন libc বা অন্যান্য বাহ্যিক কোডের সাথে আলাপচারিতা শুরু করেন, তখন এটি একটি char*নয়, একটি প্রত্যাশা করে strbufএবং আপনি আবার স্কোয়ারে ফিরে যাবেন There সেখানে আপনি কেবলমাত্র অনেক কিছুই রয়েছেন যখন কোনও খারাপ ডিজাইন ভাষায় বেক করা হয় তখন তা করতে পারে।
ম্যাসন হুইলারের

6
@ ম্যাথেপিক: অবশ্যই bufপয়েন্টার আছে। আমি কখনই বোঝাতে চাইনি যে এটি উপলব্ধ নয়; বরং এটি প্রয়োজনীয়। স্ট্যান্ডার্ড লাইব্রেরি হিসাবে মৌলিক হিসাবে আপনার অপ্টিমাইজড-কিন্তু-নন-স্ট্যান্ডার্ড স্ট্রিং টাইপ সম্পর্কে জানে না এমন কোনও কোড এখনও ধীর, অনিরাপদে ফিরে যেতে হবে char*। আপনি চাইলে সেই FUD কল করতে পারেন, তবে এটি সত্য হয় না।
ম্যাসন হুইলারের

7
লোকেরা, ফ্রাঙ্ক শিয়েরারের বক্তব্য সম্পর্কে একটি জোয়েল স্পলস্কি কলাম রয়েছে: মূল বিষয়ে ফিরে যান
user16764

14

এটি একটি পুরানো থ্রেড এবং আমার মনে হয় যে অন্যান্য উত্তরগুলি দুর্দান্ত, তবে কিছু উপেক্ষা করুন, সুতরাং এখানে আমার (দেরিতে) 2 সেন্ট রয়েছে।

সিনট্যাকটিক সুগার-লেপ জটিলতা আড়াল করে

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

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

বাস্তবায়ন বিশদ

শুভ ওল 'অ্যারে

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

এটি পুরোপুরি স্ট্রিংয়ের অ্যাক্সেস দ্রুত হতে চাইলে এটি আপনাকে বোঝায় good আপনি যখন এই স্ট্রিংটি পরিচালনা করতে চান তবে এটি সম্ভাব্য ভয়ঙ্কর ব্যয়গুলি বোঝায়। মধ্যম শক্তি মধ্যে একটি উপাদান অ্যাক্সেস ফাস্ট যদি আপনি জানেন কি সূচক তোমার পরে আছে, কিন্তু হয় খুঁজছেন একটি উপাদান একটি শর্ত উপর ভিত্তি করে নয়।

এমনকি স্ট্রিংয়ের আকারটি ফিরিয়ে দেওয়া ব্যয়বহুল হতে পারে, যদি আপনার ভাষা স্ট্রিংয়ের দৈর্ঘ্যকে ক্যাশে না করে এবং অক্ষর গণনা করার জন্য এটির মধ্য দিয়ে চলতে হয়।

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

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

ইউনিকোড সমর্থন

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


এই সমস্তগুলির ফলাফল, আপনি যখন সিউডো-কোডের সমতুল্য কিছু করেন:

hello = "hello,"
world = " world!"
str = hello + world

এটি নাও হতে পারে - ভাষা বিকাশকারীরা সর্বোত্তম প্রচেষ্টা সত্ত্বেও আপনি বাদে যেমন ব্যবহার করতে চান - এটি একটি সহজ:

a = 1;
b = 2;
shouldBeThree = a + b

ফলোআপ হিসাবে, আপনি পড়তে চাইতে পারেন:


বর্তমান আলোচনায় ভাল সংযোজন।
আবেল

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

@ আবেল: ধন্যবাদ, আমার কাছে মনে হয়েছিল এটি আরও জেনেরিক বিবরণের জন্য জায়গা ছিল।
হাইলেম

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

1

তাত্ত্বিক র্যান্ডম-অ্যাক্সেস স্টোরড-প্রোগ্রাম মেশিনের একক ক্রিয়াকলাপটি সম্ভবত "গড় অপারেশন" শর্টহ্যান্ড । এটি বিভিন্ন তত অ্যালগরিদমের চলমান সময় বিশ্লেষণ করতে ব্যবহার করার প্রথাগত এটি তাত্ত্বিক মেশিন।

জেনেরিক অপারেশনগুলি সাধারণত লোড, অ্যাড, বিয়োগ, সঞ্চয়, শাখা হিসাবে নেওয়া হয়। হতে পারে পড়ুন, মুদ্রণ করুন এবং থামিয়ে দিন।

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


1

এটি সম্পূর্ণরূপে অপারেশন, স্ট্রিংগুলি কীভাবে উপস্থাপিত হয় এবং কী কী অপ্টিমাইজেশান বিদ্যমান তা নির্ভর করে। স্ট্রিংগুলি দৈর্ঘ্যে 4 বা 8 বাইট হয় (এবং প্রান্তিককরণ), এগুলি অগত্যা ধীর হবে না - অনেকগুলি ক্রিয়াকলাপ আদিমগুলির মতোই দ্রুত হবে। অথবা, যদি সমস্ত স্ট্রিংয়ের 32-বিট বা 64-বিট হ্যাশ থাকে তবে অনেকগুলি ক্রিয়াকলাপও ঠিক তত দ্রুত হবে (যদিও আপনি হ্যাশিংয়ের ব্যয় সামনের দিকে প্রদান করে)।

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


0

আমাকে একটি প্রশ্ন দিয়ে আপনার প্রশ্নের উত্তর দিন। শব্দগুলির একটি স্ট্রিং বলতে কেন একটি শব্দ বলার চেয়ে বেশি সময় লাগে?


2
এটি অগত্যা না।
ব্যবহারকারী16764

3
Supercalifragilisticexpialidocious
Spoike

এস / শব্দ / সিলেবল / জি
কালেব

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