অন্যদের বলেছি, বিষয়টি অ্যারে মেমরি অবস্থান দোকান হল: x[i][j]
। এখানে কিছুটা অন্তর্দৃষ্টি কেন:
আপনার কাছে একটি দ্বিমাত্রিক অ্যারে রয়েছে, তবে কম্পিউটারে মেমরিটি সহজাতভাবে 1-মাত্রিক। সুতরাং আপনি যখন নিজের অ্যারেটি কল্পনা করবেন তখন:
0,0 | 0,1 | 0,2 | 0,3
----+-----+-----+----
1,0 | 1,1 | 1,2 | 1,3
----+-----+-----+----
2,0 | 2,1 | 2,2 | 2,3
আপনার কম্পিউটার এটিকে একক লাইন হিসাবে স্মৃতিতে সঞ্চয় করে:
0,0 | 0,1 | 0,2 | 0,3 | 1,0 | 1,1 | 1,2 | 1,3 | 2,0 | 2,1 | 2,2 | 2,3
২ য় উদাহরণে, আপনি প্রথমে ২ য় নম্বর লুপ করে অ্যারে অ্যাক্সেস করেন,
x[0][0]
x[0][1]
x[0][2]
x[0][3]
x[1][0] etc...
এর অর্থ হ'ল আপনি তাদের সবাইকে ক্রমে ক্রমে আঘাত করছেন। এখন 1 ম সংস্করণ দেখুন। আপনি করছেন:
x[0][0]
x[1][0]
x[2][0]
x[0][1]
x[1][1] etc...
যেভাবে মেমরিতে সি 2-ডি অ্যারে রেখেছিল, আপনি এটিকে পুরো জায়গা জুড়ে লাফিয়ে বলতে বলছেন। তবে এখন কিকারের জন্য: এই বিষয়টি কেন? সমস্ত স্মৃতি অ্যাক্সেস একই, তাই না?
না: ক্যাশের কারণে। আপনার স্মৃতি থেকে ডেটা সিপিইউতে সামান্য অংশে আনা হয় (যাকে 'ক্যাশে লাইন' বলা হয়) সাধারণত 64৪ বাইট। আপনার যদি 4-বাইট পূর্ণসংখ্যা থাকে, তার অর্থ আপনি একটি ঝরঝরে সামান্য বান্ডেলে টানা 16 টি পূর্ণসংখ্যা পেয়ে যাচ্ছেন। মেমরির এই অংশগুলি আনতে আসলে এটি যথেষ্ট ধীর; আপনার সিপিইউ একক ক্যাশে লাইনটি লোড হতে সময় নেয়ায় অনেক কাজ করতে পারে।
এখন অ্যাক্সেসের ক্রমের দিকে ফিরে তাকাুন: দ্বিতীয় উদাহরণটি হল (1) ১ in টি ইন্টের কিছু অংশ ধরা, (২) সমস্তটি সংশোধন করা, (৩) 4000 * 4000/16 বার পুনরাবৃত্তি করুন। এটি দুর্দান্ত এবং দ্রুত এবং সিপিইউতে সর্বদা কিছু কাজ করার থাকে।
প্রথম উদাহরণটি হ'ল (1) ১ in টি ইন্টের কিছু অংশ ধরুন, (২) এর মধ্যে কেবল একটিটিকে সংশোধন করুন, (৩) 4000 * 4000 বার পুনরাবৃত্তি করুন। এর জন্য মেমরি থেকে "ফেচ" সংখ্যার 16 গুণ বেশি প্রয়োজন। আপনার সিপিইউতে প্রকৃতপক্ষে সেই স্মৃতিটি প্রদর্শিত হওয়ার অপেক্ষায় বসে প্রায় সময় ব্যয় করতে হবে এবং আপনি যখন বসে আছেন তখন আপনি মূল্যবান সময় নষ্ট করছেন।
গুরুত্বপূর্ণ তথ্য:
এখন আপনার উত্তরটি রয়েছে, এখানে একটি আকর্ষণীয় নোট: আপনার দ্বিতীয় উদাহরণটি দ্রুত হওয়া উচিত এমন কোনও অন্তর্নিহিত কারণ নেই। উদাহরণস্বরূপ, ফোর্টরানে প্রথম উদাহরণটি দ্রুত এবং দ্বিতীয়টি ধীর হবে। কারণ সি এর মতো ধারণাগত "সারি "গুলিতে জিনিসগুলি প্রসারিত করার পরিবর্তে ফোর্টরান" কলামগুলিতে "প্রসারিত হয়েছে, অর্থাত:
0,0 | 1,0 | 2,0 | 0,1 | 1,1 | 2,1 | 0,2 | 1,2 | 2,2 | 0,3 | 1,3 | 2,3
সি এর বিন্যাসকে 'সারি-মেজর' এবং ফোর্টরানসকে 'কলাম-মেজর' বলা হয়। আপনি দেখতে পাচ্ছেন, আপনার প্রোগ্রামিং ভাষাটি সারি-প্রধান বা কলাম-প্রধান কিনা তা জানা খুব গুরুত্বপূর্ণ! আরও তথ্যের জন্য এখানে একটি লিঙ্ক রয়েছে: http://en.wikedia.org/wiki/Row-major_order