c++ - উনল - সি++ বই




সি আসলে শিফট অপারেটর ব্যবহার করে গুণ এবং বিভাগ আসলে দ্রুত? (11)

বিট অপারেটর ব্যবহার করে গুণ এবং বিভাগ অর্জন করা যেতে পারে, উদাহরণস্বরূপ

i*2 = i<<1
i*3 = (i<<1) + i;
i*10 = (i<<3) + (i<<1)

এবং তাই।

এটা কি আসলেই দ্রুত বলতে হবে (i<<3)+(i<<1) 10 i*10 সাথে 10 গুণ বৃদ্ধি করতে সরাসরি ব্যবহার করব? কোন ধরণের ইনপুট আছে যা গুণমান বা বিভক্ত করা যায় না?


এটা কি আসলেই দ্রুত বলতে হবে (আমি << 3) + (আমি << 1) 10 * এর সাথে 10 গুণ বৃদ্ধি করতে সরাসরি ব্যবহার করব?

এটি আপনার মেশিনে হতে পারে বা নাও হতে পারে - যদি আপনি যত্নশীল হন তবে আপনার বাস্তব-বিশ্বব্যবস্থায় পরিমাপ করুন।

একটি কেস স্টাডি - 486 থেকে কোর i7 থেকে

Benchmarking অর্থপূর্ণভাবে করা খুব কঠিন, কিন্তু আমরা কিছু ঘটনা তাকান করতে পারেন। http://www.penguin.cz/~literakl/intel/s.html#SAL এবং http://www.penguin.cz/~literakl/intel/i.html#IMUL আমরা x86 ঘড়ির চক্রগুলির একটি ধারণা পাই গাণিতিক স্থানান্তর এবং গুণ জন্য প্রয়োজন। বলুন আমরা "486" (নতুনতম তালিকাভুক্ত), 32 বিট রেজিস্ট্রার এবং অবিলম্বে আটকাতে বলি, IMUL 13-4২ চক্র এবং আইডিআইভি 44 নেয়। প্রত্যেক SAL 2 লাগে এবং 1 যোগ করে, তাই কয়েকজন একসঙ্গে সরকারীভাবে দেখায় একটি বিজয়ী মত।

এই দিন, কোর i7 সঙ্গে:

( http://software.intel.com/en-us/forums/showthread.php?t=61481 থেকে)

ল্যাটিনটি একটি পূর্ণসংখ্যা সংযোজনের জন্য 1 চক্র এবং পূর্ণসংখ্যা গুণনের জন্য 3 চক্র । আপনি http://www.intel.com/products/processor/manuals/ অবস্থিত "Intel® 64 এবং IA-32 আর্কিটেকচারের অপ্টিমাইজেশান রেফারেন্স ম্যানুয়াল" এর পরিশিষ্ট C তে অন্তর্গত latencies এবং thoughput খুঁজে পেতে পারেন।

(কিছু ইন্টেল ব্লুর থেকে)

এসএসই ব্যবহার করে, কোর আই 7 একযোগে যোগ এবং নির্দেশনা বৃদ্ধি করতে পারে, যার ফলে প্রতি ক্লক চক্রের 8 টি ভাসমান-বিন্দু ক্রিয়াকলাপ (FLOP)

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

সোর্স কোড বনাম বাস্তবায়ন কার্যকারিতা

আরো সাধারণভাবে, আপনার প্রশ্ন সি এবং সি ++ ট্যাগ করা হয়। তৃতীয় প্রজন্মের ভাষা হিসাবে, তারা বিশেষভাবে অন্তর্নিহিত CPU নির্দেশ সেটের লুকানোর জন্য ডিজাইন করা হয়েছে। তাদের ভাষা স্ট্যান্ডার্ডগুলি সন্তুষ্ট করার জন্য, তাদের অবশ্যই অন্তর্নির্মিত এবং স্থানান্তর ক্রিয়াকলাপগুলি (এবং আরও অনেকে) সমর্থন করতে হবে, এমনকি অন্তর্নিহিত হার্ডওয়্যার না থাকলেও । এই ক্ষেত্রে, তারা অন্যান্য নির্দেশাবলী ব্যবহার করে প্রয়োজনীয় ফলাফল সংশ্লেষ করা আবশ্যক। একইভাবে, যদি তাদের CPU এ অভাব থাকে এবং তাদের কোনও FPU না থাকে তবে তাদের অবশ্যই ভাসমান বিন্দু ক্রিয়াকলাপগুলির জন্য সফ্টওয়্যার সমর্থন সরবরাহ করতে হবে। আধুনিক CPU গুলি সমস্ত সমর্থন * এবং << , তাই এটি অযৌক্তিকভাবে তাত্ত্বিক এবং ঐতিহাসিক বলে মনে হতে পারে, কিন্তু তাৎপর্য হল যে বাস্তবায়ন চয়ন করার স্বাধীনতা উভয় উপায়ে চলে যায়: এমনকি যদি সিপিওর এমন নির্দেশ থাকে যা সোর্স কোডে অনুরোধ করা ক্রিয়াকলাপটি প্রয়োগ করে সাধারণ ক্ষেত্রে, কম্পাইলারটি এটি পছন্দ করে এমন অন্য কিছু চয়ন করতে বিনামূল্যে কারণ এটি কম্পাইলারের মুখোমুখি নির্দিষ্ট ক্ষেত্রে ভাল।

উদাহরণ (একটি কল্পিত সমাবেশ ভাষা সঙ্গে)

source           literal approach         optimised approach
#define N 0
int x;           .word x                xor registerA, registerA
x *= N;          move x -> registerA
                 move x -> registerB
                 A = B * immediate(0)
                 store registerA -> x
  ...............do something more with x...............

এক্সক্লুসিভ বা এক্সক্লুসিভ ( xor ) এর মত সূত্র কোডের সাথে কোন সম্পর্ক নেই, তবে xor-ing যা কিছু আছে তা নিজেই বিটগুলিকে সাফ করে, তাই এটি 0 এ কিছু সেট করতে ব্যবহার করা যেতে পারে। সোর্স কোড যা মেমরি ঠিকানা বোঝায় তা ব্যবহার করা যেতে পারে না ।

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

সুতরাং, এমনকি যদি কিছু সরানো হার্ডওয়্যারে স্থানান্তর এবং যোগ করা আরও দ্রুত হয় তবে কম্পাইলার লেখক সম্ভবত এটি নিরাপদ এবং উপকারী উভয়ই ঠিক হয়ে গেছে।

Maintainability

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

সৌভাগ্যক্রমে, কোনও অপ্টিমাইজেশান সক্ষম হলে জি সি সি ভালো ভালো কম্পাইলার সাধারণত বিটসফিফ্ট এবং গাণিতিক সিরিজের প্রতিস্থাপন করতে পারে (অর্থাৎ ...main(...) { return (argc << 4) + (argc << 2) + argc; } -> imull $21, 8(%ebp), %eax ) তাই একটি পুনঃসংযোগ কোডটি ঠিক না করেও সাহায্য করতে পারে, তবে এটি নিশ্চিত নয়।

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

আংশিক সমাধান বনাম সাধারণ সমাধান

আপনার যদি কিছু অতিরিক্ত জ্ঞান থাকে, যেমন আপনার int সত্যই কেবল x , y এবং z মানগুলি সঞ্চয় করবে, তবে আপনি সেই মানগুলির জন্য কাজ করে এমন কিছু নির্দেশাবলী কাজ করতে সক্ষম হবেন এবং কম্পাইলারের তুলনায় আপনার ফলাফলটি আরও দ্রুত পেতে পারেন। যে অন্তর্দৃষ্টি আছে এবং সমস্ত int মানের জন্য কাজ করে যে একটি বাস্তবায়ন প্রয়োজন। উদাহরণস্বরূপ, আপনার প্রশ্ন বিবেচনা করুন:

বিট অপারেটর ব্যবহার করে গুণ এবং বিভাগ অর্জন করা যেতে পারে ...

আপনি গুণ ব্যাখ্যা, কিন্তু বিভাগ সম্পর্কে কিভাবে?

int x;
x >> 1;   // divide by 2?

সি ++ মান অনুযায়ী 5.8:

-3- E1 এর মান >> E2 E1 সঠিক-স্থানান্তরিত E2 বিট অবস্থান। E1 যদি একটি স্বাক্ষরিত টাইপ থাকে বা E1 একটি স্বাক্ষরিত টাইপ এবং একটি ননগ্রেটিভ মান থাকে তবে ফলাফলটির মানটি E1 এর সংখ্যার অবিচ্ছেদ্য অংশ শক্তি E2 থেকে উত্থাপিত পরিমাণ 2 দ্বারা বিভক্ত। E1 একটি স্বাক্ষরিত টাইপ এবং একটি নেতিবাচক মান আছে, ফলে মান বাস্তবায়ন-সংজ্ঞায়িত করা হয়।

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

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

কোন ধরণের ইনপুট আছে যা গুণমান বা বিভক্ত করা যায় না?

হ্যাঁ ... উপরে উল্লিখিত হিসাবে, নেতিবাচক সংখ্যায় বিট-স্থানান্তর দ্বারা "বিভক্ত" করার সময় বাস্তবায়ন সংজ্ঞায়িত আচরণ আছে।


Python পরীক্ষা একই র্যান্ডম সংখ্যা বিরুদ্ধে একই গুণ গুণ 100 মিলিয়ন বার সঞ্চালন।

>>> from timeit import timeit
>>> setup_str = 'import scipy; from scipy import random; scipy.random.seed(0)'
>>> N = 10*1000*1000
>>> timeit('x=random.randint(65536);', setup=setup_str, number=N)
1.894096851348877 # Time from generating the random #s and no opperati

>>> timeit('x=random.randint(65536); x*2', setup=setup_str, number=N)
2.2799630165100098
>>> timeit('x=random.randint(65536); x << 1', setup=setup_str, number=N)
2.2616429328918457

>>> timeit('x=random.randint(65536); x*10', setup=setup_str, number=N)
2.2799630165100098
>>> timeit('x=random.randint(65536); (x << 3) + (x<<1)', setup=setup_str, number=N)
2.9485139846801758

>>> timeit('x=random.randint(65536); x // 2', setup=setup_str, number=N)
2.490908145904541
>>> timeit('x=random.randint(65536); x / 2', setup=setup_str, number=N)
2.4757170677185059
>>> timeit('x=random.randint(65536); x >> 1', setup=setup_str, number=N)
2.2316000461578369

সুতরাং পাইথনের দুইটি শক্তি দ্বারা গুণ / বিভাগের পরিবর্তে একটি স্থানান্তর করার ক্ষেত্রে সামান্য উন্নতি ঘটে (~ বিভাগের জন্য ~ 10%; গুণের জন্য ~ 1%)। যদি এটির দুটি অ-শক্তি থাকে, সম্ভবত একটি উল্লেখযোগ্য মন্থর।

আবার এই # গুলি আপনার প্রসেসরের উপর নির্ভর করবে, আপনার কম্পাইলার (বা ইন্টারপ্রেটার - সরলতার জন্য পাইথনে ব্যবহার করেছিলেন)।

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


আপনি একেবারে প্রয়োজন না হওয়া পর্যন্ত না এবং আপনার কোড অভিপ্রায় গুণগত / বিভাগ পরিবর্তে স্থানান্তর প্রয়োজন।

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

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


আমি ড্রিউ হল দ্বারা চিহ্নিত উত্তর দিয়ে একমত। উত্তর যদিও কিছু অতিরিক্ত নোট ব্যবহার করতে পারে।

সফটওয়্যার ডেভেলপারদের বিশাল সংখ্যার জন্য প্রসেসর এবং কম্পাইলার আর প্রাসঙ্গিক নয়। আমাদের অধিকাংশই 8088 এবং এমএস-ডস অতিক্রম করে অনেক দূরে। এটি সম্ভবত শুধুমাত্র তাদের জন্য উপযুক্ত যারা এখনও এমবেডেড প্রসেসরগুলির জন্য উন্নয়নশীল ...

আমার সফটওয়্যার কোম্পানি ম্যাথ (অ্যাড / সাব / মুুল / ডিভি) এ সমস্ত গণিতের জন্য ব্যবহার করা উচিত। তথ্য টাইপের মধ্যে রূপান্তরিত করার সময় Shift ব্যবহার করা উচিত। n + 8 এবং নাই / 256 হিসাবে বাইট uhort।


এটা সম্পূর্ণ টার্গেট ডিভাইস, ভাষা, উদ্দেশ্য, ইত্যাদি উপর নির্ভর করে

একটি ভিডিও কার্ড ড্রাইভার পিক্সেল crunching? খুব সম্ভবত, হ্যাঁ!

আপনার বিভাগের জন্য নেট ব্যবসা আবেদন? একেবারে এমনকি এটি তাকান কোন কারণ।

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


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

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


যতদূর আমি জানি কিছু মেশিনের গুণমান 16 থেকে 32 যন্ত্র চক্রের প্রয়োজন হতে পারে। তাই হ্যাঁ , মেশিনের ধরন অনুসারে, বিটসফিফ্ট অপারেটর গুণ / বিভাগের চেয়ে দ্রুত।

তবে নির্দিষ্ট মেশিনে তাদের গণিত প্রসেসর আছে, যা গুণ / বিভাগের জন্য বিশেষ নির্দেশাবলী রয়েছে।


শুধু আমার কম্পিউটার কম্পাইল করার চেষ্টা করে:

int a = ...;
int b = a * 10;

যখন এটি disassembling আউটপুট উত্পাদন করে:

MOV EAX,DWORD PTR SS:[ESP+1C] ; Move a into EAX
LEA EAX,DWORD PTR DS:[EAX+EAX*4] ; Multiply by 5 without shift !
SHL EAX, 1 ; Multiply by 2 using shift

এই সংস্করণটি আপনার হাত-অপ্টিমাইজড কোডটি খাঁটি স্থানান্তর এবং সংযোজনের সাথে দ্রুত।

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


সংক্ষিপ্ত উত্তর: সম্ভবত না।

লম্বা উত্তর: আপনার কম্পাইলারের মধ্যে একটি অপটিমাইজার রয়েছে যা আপনার টার্গেট প্রসেসর আর্কিটেকচারটি যত তাড়াতাড়ি সম্ভব গুণমান করতে পারে তা জানেন। আপনার সেরা বাজিটি কম্পাইলারকে আপনার অভিপ্রায়টি স্পষ্টভাবে জানাতে (অর্থাৎ আমি << 1 এর পরিবর্তে আমি * 2) বলি এবং দ্রুততম সমাবেশ / মেশিন কোড ক্রমটি কী তা নির্ধারণ করে। এটি এমনকি সম্ভব যে প্রসেসর নিজেই পরিবর্তনের ক্রম হিসাবে মাইক্রোডোডে যোগ এবং সংযোজন হিসাবে প্রয়োগ করা হয়েছে।

নিচের লাইন - এই সম্পর্কে উদ্বেগজনক সময় ব্যয় করবেন না। যদি আপনি স্থানান্তর মানে, স্থানান্তর। যদি আপনি গুণ করতে চান, সংখ্যাবৃদ্ধি করুন। যা semantically clearest কি করবেন - আপনার সহকর্মীরা পরে আপনাকে ধন্যবাদ হবে। অথবা, সম্ভবত, আপনি অন্যথায় যদি পরে আপনি অভিশাপ।


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

প্রকৃতপক্ষে বিভাগের কৌশল, যাদু বিভাগের নামে পরিচিত, প্রকৃতপক্ষে বিশাল অর্থ প্রদান করতে পারে। আবার আপনি এটি প্রয়োজন হলে দেখতে প্রোফাইল করা উচিত। কিন্তু আপনি যদি এটি ব্যবহার করেন তবে একই বিভাগের সেমান্টিক্সের জন্য কোন নির্দেশগুলি প্রয়োজন তা নির্ধারণ করতে সহায়তা করার জন্য আশেপাশে দরকারী প্রোগ্রাম রয়েছে। এখানে একটি উদাহরণ: http://www.masm32.com/board/index.php?topic=12421.0

MASM32 এ OP এর থ্রেড থেকে আমি তুলে নিলাম এমন একটি উদাহরণ:

include ConstDiv.inc
...
mov eax,9999999
; divide eax by 100000
cdiv 100000
; edx = quotient

তৈরি হবে:

mov eax,9999999
mov edx,0A7C5AC47h
add eax,1
.if !CARRY?
    mul edx
.endif
shr edx,16

আমি মনে করি যে এক ক্ষেত্রে আপনি দুইটি শক্তি দ্বারা গুণ বা বিভক্ত করতে চান, আপনি বিটসফफ्ट অপারেটরগুলি ব্যবহারে ভুল করতে পারবেন না, এমনকি যদি কম্পাইলারটি তাদের একটি MUL / DIV রূপান্তর করে তবেও কিছু প্রসেসর মাইক্রোকোড (আসলে, একটি ম্যাক্রো) যাইহোক, তাই যে ক্ষেত্রে আপনি একটি উন্নতি অর্জন করতে হবে, বিশেষ করে যদি শিফটটি 1 এর বেশি। বা আরো স্পষ্টতই, যদি CPU- তে কোন বিটসফफ़्ट অপারেটর থাকে না তবে এটি একটি MUL / DIV যাইহোক, তবে যদি CPU বিটসফफ्ट অপারেটর, আপনি একটি মাইক্রোকোড শাখা এড়াতে এবং এই কয়েক নির্দেশ কম।

আমি এখন কিছু কোড লিখছি যার জন্য অনেকগুলি দ্বিগুণ / হ্যালভিং ক্রিয়াকলাপ দরকার কারণ এটি একটি ঘন বাইনারি গাছের উপর কাজ করছে এবং আরও একটি ক্রিয়াকলাপ রয়েছে যা আমি সন্দেহ করতে পারি যে এটি একটি সংযোজনের চেয়ে বেশি অনুকূল হতে পারে - একটি বাম (দুই গুণের শক্তি ) একটি সংযোজন সঙ্গে স্থানান্তর। আপনি যদি যোগ করতে চান এমন বিটগুলির সংখ্যাটির চেয়ে শিফটটি বিচ্ছিন্ন থাকে তবে এটি একটি বাম স্থানান্তর এবং একটি xor দ্বারা প্রতিস্থাপিত করা যেতে পারে, সহজ উদাহরণটি (i << 1) ^ 1, যা দ্বিগুণ মানকে এক যোগ করে। এটি অবশ্যই একটি সঠিক শিফট (দুই ভাগের শক্তি) প্রয়োগ করতে পারে না কারণ শুধুমাত্র একটি বাম (সামান্য এন্ডিয়ান) শিফট শূণ্যস্থান দিয়ে ফাঁক পূরণ করে।

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

এছাড়াও, আমি যে অ্যালগরিদম লিখছি তাতে তারা দৃশ্যত এমন আন্দোলনের প্রতিনিধিত্ব করে যা এ অর্থে ঘটেছে যে তারা আসলে আরও স্পষ্ট। বাইনারি গাছের বাম দিকটি বড়, এবং ডানটি ছোট। পাশাপাশি, আমার কোডে, অদ্ভুত এবং এমনকি সংখ্যার একটি বিশেষ তাত্পর্য রয়েছে, এবং গাছের সব বাম দিকের শিশু অদ্ভুত এবং ডান হাতের শিশু এবং মূল, এমনকি রয়েছে। কিছু ক্ষেত্রে, যা আমি এখনও পাই নি, কিন্তু ওহ, আসলে, আমি এমনকি এটি সম্পর্কে চিন্তাও করিনি, এক্স এবং 1 এক্স% 2 এর তুলনায় আরও ভাল অপারেশন হতে পারে। এমনকি একটি সংখ্যাতে এক্স এবং 1 শূন্য উৎপন্ন করবে, কিন্তু একটি বিজোড় সংখ্যা জন্য 1 উত্পন্ন করবে।

শুধু অদ্ভুত / এমনকি শনাক্তকরণের চেয়ে আরও কিছুটা এগিয়ে যাওয়া, যদি আমি x এবং 3 এর জন্য শূন্য পাই তবে আমি জানি যে 4 আমাদের নম্বরের একটি ফ্যাক্টর এবং 8% এর জন্য x% 7 এর জন্য একই রকম। আমি জানি যে এই ক্ষেত্রে সম্ভবত সীমিত ইউটিলিটি পেয়েছে তবে এটি জানা ভাল যে আপনি একটি মডুলাস অপারেশন এড়াতে পারেন এবং পরিবর্তে বিটওয়ের লজিক অপারেশনটি ব্যবহার করতে পারেন, কারণ বিটwise ক্রিয়াকলাপগুলি প্রায়শই দ্রুততম হয় এবং কমপ্লেয়ারের কাছে কমপক্ষে সন্দেহজনক হতে পারে।

আমি ঘন বাইনারি বৃক্ষের ক্ষেত্রটি আবিষ্কার করছি, তাই আমি আশা করি যে লোকেরা এই মন্তব্যটির মূল্য বুঝতে পারবে না, কারণ খুব কমই মানুষ শুধুমাত্র দুইটি শক্তির উপর ফ্যাক্টাইজেশান করতে চায়, অথবা শুধুমাত্র দুইটি গুণকে বিভক্ত / বিভক্ত করে।





bit-shift