এই এক্সওআর মানটির অদলবদলটি এখনও ব্যবহৃত বা দরকারী


25

আমি যখন প্রথম কোনও মেইনফ্রেম এসেম্বলার প্রোগ্রামার কাজ শুরু করি তখন তারা আমাকে দেখায় যে তারা কীভাবে valuesতিহ্যগত অ্যালগোরিদম ব্যবহার না করে মানগুলিতে অদলবদল করে:

a = 0xBABE
b = 0xFADE

temp = a
a = b
b = temp

তারা দুটি মানকে অদলবদল করে - কিছুটা বড় ব্যাফার থেকে - এটি ছিল:

a = 0xBABE
b = 0xFADE

a = a XOR b
b = b XOR a
a = a XOR b

এখন

b == 0xBABE
a == 0xFADE

যা তৃতীয় টেম্প হোল্ডিং স্পেসের প্রয়োজন ছাড়াই ২ টি অবজেক্টের বিষয়বস্তু অদলবদল করে।

আমার প্রশ্নটি: এটি কি এই এক্সওআর সোয়াপ অ্যালগরিদম এখনও ব্যবহৃত এবং কোথায় এটি এখনও প্রযোজ্য।


50
এটি সাক্ষাত্কার বন্ধ এবং খারাপ প্রশ্নগুলির জন্য এখনও ব্যাপক ব্যবহারে রয়েছে; এটা সম্বন্ধে.
মাইকেল বর্গওয়ার্ট

4
এটি কি কৌশলটির মতো কিছু: a = a + b, b = ab, a = ab?
পিটার বি

4
@PieterB হ্যাঁ তারা এই উভয় ক্ষেত্রেই হয় stackoverflow.com/questions/1826159/...
জে।

সুতরাং ... আপনি একটি রেজিস্টার সংরক্ষণ করুন তবে আরও 3 টি নির্দেশাবলী দিয়ে অর্থ প্রদান করুন। আমি মনে করি টেম্প ভার্সনটি যাইহোক দ্রুত হবে।
বিলি ওনিল

1
এক্সএমএইচজি নির্দেশের কারণে @ এমএলএস এর প্রথম থেকেই @ সলটারের মান অদলবদল সমস্যা হয়নি been ওটিওএইচ 2 মেমোরি অবস্থানের অদলবদলের জন্য 3 এক্সএইচজিএস প্রয়োজন :)
নেট

উত্তর:


41

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

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


18
যদি উভয় মান একই হয় তবে আপনি এখনও সঠিক ফলাফল দিয়ে শেষ করতে চান। a: 0101 ^ 0101 = 0000; b: 0101 ^ 0000 = 0101; a: 0101 ^ 0000 = 0101;
ববসন

1
@ GlenH7 কি বলেছে। -1-> +1
ববসন

1
আপনার কাছে এখনও লাইনটি মনে হয় "xorswap ব্যবহার করার সময় ফাংশনটির উভয় যুক্তির মতো একই ভেরিয়েবল সরবরাহ করার ঝুঁকি রয়েছে যা বলা হয় যে এটি পরিবর্তনশীল হয়ে যায় কারণ এটি নিজের সাথে xor'd হওয়ার কারণে সমস্ত বিট শূন্যে পরিণত হয়।" .. তার মানে কি সরানো হয়নি?
ক্রিস

9
@ ক্রিস নো, প্রথমে আমি লিখেছিলাম যে মানগুলি যদি একইরকম হয় a=10, b=10এবং যদি আপনি xorswap(a,b)এটি করেন এবং ভেরিয়েবলগুলি শূন্য না করে যা এখন মুছে ফেলা হয়। তবে আপনি যদি তা করেন xorswap(a, a)তবে aশূন্য হয়ে যেত যা আমি বলতে চাইছিলাম কিন্তু বোকা ছিলাম। :)
zxcdw

3
এটি নির্দিষ্ট ভাষাগুলিতে বেশ প্রাসঙ্গিক - এর মতো ছোট ছোট বিপদগুলি ভবিষ্যতে বাগগুলি খুঁজে পাওয়া দুষ্কৃতকারীদের সাথে কাজ করার সময় দু'টি পয়েন্টার নিয়ে কাজ করে যে কোনওভাবে একই ঠিকানাটিতে 100+ লাইন দেখায় যা আপনি দেখতে পান না।
ড্রার ক্লারিস

14

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

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

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

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


2
নিবন্ধগুলি অনেক প্রসঙ্গে সত্যই এতটা প্রচুর নয়। এমনকি যদি কোনও প্রসেসরের রেজিস্টারগুলির পর্যাপ্ত সরবরাহ থাকে, তবে আইএসআর-এ ব্যবহৃত প্রতিটি রেজিস্টার এমন একটি নিবন্ধ যা আগেই সংরক্ষণ করতে হবে এবং পরে পুনরুদ্ধার করতে হবে। যদি কোনও আইএসআর বিশটি চক্র গ্রহণ করে এবং প্রতি চল্লিশটি চক্র চালানোর কথা হয় তবে আইএসআরে যুক্ত প্রতিটি অতিরিক্ত চক্র সিস্টেমের কার্যকারিতা পাঁচ শতাংশ পয়েন্টকে হ্রাস করবে deg
সুপারক্যাট

8

এটা কি কাজ করবে? হ্যাঁ।

আপনি এটি ব্যবহার করা উচিত? না।

এই ধরণের মাইক্রো-অপ্টিমাইজেশানটি অর্থবোধ করে যদি:

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

  • আপনি আপনার অ্যাপ্লিকেশনটির প্রোফাইল দিয়েছেন এবং খুঁজে পেয়েছেন যে সোজা পদ্ধতির ব্যয় কোডের স্পষ্টতা ছাড়িয়ে যায় (এবং রক্ষণাবেক্ষণে ফলস্বরূপ সঞ্চয়)

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

দ্বিতীয় পর্যায়ে, আপনি যুক্ত জটিলতার জন্য কী অর্জন করছেন? এমনকি আপনি যদি এক্সওআর পদ্ধতির দ্রুত পরিমাপ করেছেন এবং খুঁজে পেয়েছেন, তবে কি এটি একটি কম পরিষ্কার পদ্ধতির ন্যায্যতার পক্ষে যথেষ্ট প্রভাব ফেলছে? তুমি কিভাবে জান?

অবশেষে, আপনার প্ল্যাটফর্ম / ভাষার জন্য মানক অদলবদ ফাংশন রয়েছে কিনা তা আপনার সন্ধান করা উচিত - উদাহরণস্বরূপ, সি ++ এসটিএল একটি টেম্পলেট স্ব্যাপ ফাংশন সরবরাহ করে যা আপনার সংকলক / প্ল্যাটফর্মের জন্য অত্যন্ত অনুকূল হয়ে উঠবে।


2

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

তবে যে কেউ এটি ব্যবহার করে যত্ন নিতে হবে যে এই দুটি অবস্থান একই রকম হতে পারে না কারণ পরবর্তী ক্ষেত্রে এটি কার্যকরভাবে উভয় মানের শূন্য করবে। সুতরাং সাধারণত এটি কোনও রেজিস্টার এবং মেমরির অবস্থানের বিনিময়ের মতো সুস্পষ্ট ক্ষেত্রে সীমাবদ্ধ থাকে।

X86 এর সাহায্যে, xchg এবং cmpxchg নির্দেশাবলী বেশিরভাগ ক্ষেত্রে প্রয়োজনীয়তা পূরণ করে তবে RISC গুলি সাধারণত তাদের সাথে আবৃত হয় না (স্পার্ক ব্যতীত)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.