সম্ভব হলে বিভাগকে গুণের সাথে প্রতিস্থাপন করা কি ভাল অনুশীলন?


73

যখনই আমার বিভাগ প্রয়োজন, উদাহরণস্বরূপ, শর্ত পরীক্ষা করা, আমি গুণকের মধ্যে বিভাগের অভিব্যক্তিটি রিফ্যাক্টর করতে চাই, উদাহরণস্বরূপ:

মূল সংস্করণ:

if(newValue / oldValue >= SOME_CONSTANT)

নতুন সংস্করণ:

if(newValue >= oldValue * SOME_CONSTANT)

কারণ আমি মনে করি এটি এড়াতে পারে:

  1. শূন্য দ্বারা বিভাগ

  2. oldValueখুব ছোট হলে ওভারফ্লো হয়

এটা কি সঠিক? এই অভ্যাস জন্য কোন সমস্যা আছে?


41
সতর্কতা অবলম্বন করুন যে নেতিবাচক সংখ্যা সহ, দুটি সংস্করণ সম্পূর্ণ আলাদা জিনিস পরীক্ষা করে। আপনি কি নিশ্চিত oldValue >= 0?
ব্যবহারকারী 2313067

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

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

12
@ মার্কবেনিংফিল্ড: যাই হোক না কেন, সংকলক শূন্য দ্বারা বিভাজনকে অপ্টিমাইজ করতে পারে না। আপনি যে "অপ্টিমাইজেশন" এর কথা ভাবছেন তা হ'ল "স্পিড অপ্টিমাইজেশন"। ওপি অন্য ধরণের অপ্টিমাইজেশন - বাগ এড়ানো সম্পর্কে ভাবছে।
slebetman

25
পয়েন্ট 2 হ'ল বোগাস। মূল সংস্করণটি ছোট মানগুলির জন্য উপচে পড়তে পারে, তবে নতুন সংস্করণটি বড় মূল্যবোধের জন্য উপচে পড়তে পারে, তাই সাধারণ ক্ষেত্রে উভয়ই নিরাপদ নয়।
জ্যাকবিবি

উত্তর:


74

দুটি সাধারণ বিষয় বিবেচনা করতে হবে:

পূর্ণসংখ্যার গাণিতিক

স্পষ্টতই যদি আপনি পূর্ণসংখ্যার গাণিতিক ব্যবহার করেন (যা কেটে যায়) তবে আপনি একটি আলাদা ফলাফল পাবেন। সি # তে এখানে একটি ছোট উদাহরণ রয়েছে:

public static void TestIntegerArithmetic()
{
    int newValue = 101;
    int oldValue = 10;
    int SOME_CONSTANT = 10;

    if(newValue / oldValue > SOME_CONSTANT)
    {
        Console.WriteLine("First comparison says it's bigger.");
    }
    else
    {
        Console.WriteLine("First comparison says it's not bigger.");
    }

    if(newValue > oldValue * SOME_CONSTANT)
    {
        Console.WriteLine("Second comparison says it's bigger.");
    }
    else
    {
        Console.WriteLine("Second comparison says it's not bigger.");
    }
}

আউটপুট:

First comparison says it's not bigger.
Second comparison says it's bigger.

ভাসমান পয়েন্ট গণিত

এটিকে বাদ দিয়ে যে বিভাগটি শূন্য দ্বারা বিভক্ত হয়ে গেলে আলাদা ফলাফল পেতে পারে (এটি একটি ব্যতিক্রম উৎপন্ন করে, যেখানে গুণনটি হয় না), এটি কিছুটা পৃথক গোলাকৃতি ত্রুটি এবং একটি পৃথক ফলাফলের ফলস্বরূপও হতে পারে। সি # তে সহজ উদাহরণ:

public static void TestFloatingPoint()
{
    double newValue = 1;
    double oldValue = 3;
    double SOME_CONSTANT = 0.33333333333333335;

    if(newValue / oldValue >= SOME_CONSTANT)
    {
        Console.WriteLine("First comparison says it's bigger.");
    }
    else
    {
        Console.WriteLine("First comparison says it's not bigger.");
    }

    if(newValue >= oldValue * SOME_CONSTANT)
    {
        Console.WriteLine("Second comparison says it's bigger.");
    }
    else
    {
        Console.WriteLine("Second comparison says it's not bigger.");
    }
}

আউটপুট:

First comparison says it's not bigger.
Second comparison says it's bigger.

আপনি যদি আমাকে বিশ্বাস না করেন তবে এখানে একটি ফিডল রয়েছে যা আপনি কার্যকর করতে পারেন এবং নিজের জন্য দেখতে পারেন।

অন্যান্য ভাষা বিভিন্ন হতে পারে; তবে মনে রাখবেন যে সি #, অনেকগুলি ভাষার মতো একটি আইইইই স্ট্যান্ডার্ড (আইইইই 754) ফ্লোটিং পয়েন্ট লাইব্রেরি প্রয়োগ করে , যাতে আপনার অন্যান্য মানক চালানোর সময়ে একই ফলাফল পাওয়া উচিত।

উপসংহার

আপনি যদি গ্রিনফিল্ডে কাজ করছেন তবে আপনি সম্ভবত ঠিক আছেন।

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

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

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


41
দ্বিতীয় আর্থিক বিট। এই ধরণের স্যুইচ হিসাবরক্ষকদের পিচফোর্কের সাহায্যে আপনাকে তাড়া করতে বলছে। আমার মনে আছে 5000 টি লাইন যেখানে আমাকে "সঠিক" উত্তর খুঁজে না পাওয়ার চেয়ে পিচফোর্সকে উপসাগরীয় স্থানে রাখার জন্য আরও প্রচেষ্টা করতে হয়েছিল - যা আসলে সাধারণত কিছুটা ভুল ছিল। .01% দ্বারা বন্ধ হওয়া কোনও বিষয় নয়, একেবারে সামঞ্জস্যপূর্ণ উত্তরগুলি বাধ্যতামূলক ছিল। এইভাবে আমি গণনাটি এমনভাবে করতে বাধ্য হয়েছিল যা একটি নিয়মতান্ত্রিক রাউন্ডঅফ ত্রুটির কারণ হয়েছিল।
লরেন পেচটেল

8
5 শতাংশ ক্যান্ডি কেনার কথা চিন্তা করুন (এটির আর কোনও অস্তিত্ব নেই)) 20 টুকরো কিনুন, "সঠিক" উত্তরটি কোনও কর ছিল না কারণ এক টুকরো 20 টি কেনার উপর কোনও কর ছিল না।
লরেন পেচটেল

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

9
কারণ আমি গ্রীনফিল্ড শব্দটি আগে কখনও শুনিনি , আমি এটি সন্ধান করেছি। উইকিপিডিয়া বলেছে এটি "এমন একটি প্রকল্প যা পূর্ববর্তী কাজের দ্বারা আরোপিত কোনও বাধা নেই" "
হেনরিক রিপা

9
@ স্টিভ: আমার বস সম্প্রতি "গ্রিনফিল্ড" থেকে "ব্রাউনফিল্ড" -এর তুলনা করেছেন। আমি মন্তব্য করেছি যে কিছু প্রকল্পগুলি "ব্ল্যাকফিল্ড" এর মতো ... :
ডি

25

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

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

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

অতিরিক্ত প্রবাহের বিরুদ্ধে সুরক্ষা বিতর্কযোগ্য। আপনি যদি জানেন যে newValueএটি সর্বদা এর চেয়ে বড় oldValueতবে সম্ভবত আপনি সেই যুক্তিটি তৈরি করতে পারেন। তবে এমন (oldValue * SOME_CONSTANT)ঘটনাও ঘটতে পারে যেখানে ওভারফ্লোও হবে। সুতরাং আমি এখানে খুব বেশি লাভ দেখছি না।

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

উপরের সমস্তটির প্রতিফলন ঘটানো, সাধারণভাবে আমি মনে করি না পুরানো সংস্করণের তুলনায় আপনার নতুন সংস্করণটি অর্জন করার মতো অনেক কিছুই রয়েছে, বিশেষত স্পষ্টতা হ্রাসের কারণে। তবে সুনির্দিষ্ট ক্ষেত্রে থাকতে পারে যেখানে কিছু সুবিধা রয়েছে benefit


16
এহম, স্বেচ্ছাসেবী বিভাগের চেয়ে স্বেচ্ছাসেবী গুণগুলি আরও দক্ষ হওয়া সত্যিকারের মেশিনগুলির জন্য প্রসেসর নির্ভর নয়।
উত্সাহক

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

@ রোং সবসময় না দশমিক অংশটি ফেলে রেখে বেশ কয়েকটি ভাষায় পূর্ণসংখ্যা বিভাগ হয়, সুতরাং কোনও কাস্ট প্রয়োজন হয় না।
টি। সার

@ টি.সার আপনি যে কৌশলটি বর্ণনা করেছেন এবং উত্তরে বর্ণিত শব্দার্থতত্ত্বগুলি আলাদা। শব্দার্থক হ'ল প্রোগ্রামার উত্তরটি একটি ভাসমান-পয়েন্ট বা ভগ্নাংশের মান হিসাবে অভিহিত করে কিনা; আপনি যে কৌশলটি বর্ণনা করেছেন তা হ'ল পারস্পরিক গুণ দ্বারা বিভাজন, যা কখনও কখনও পূর্ণসংখ্যা বিভাগের জন্য একটি নিখুঁত অনুমান (বিকল্প) হয়। পরের কৌশলটি সাধারণত প্রয়োগ করা হয় যখন বিভাজকটি আগে থেকেই জানা যায়, কারণ পূর্ণসংখ্যার পারস্পরিক ক্রিয়াকলাপ (2 ** 32 দ্বারা স্থানান্তরিত) সংকলন সময়ে করা যায়। রানটাইম সময়ে এটি করা উপকারী হবে না কারণ এটি বেশি সিপিইউ ব্যয়বহুল।
রবিং

22

না।

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

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

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

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

এছাড়াও দ্রষ্টব্য: কম্পাইলাররা প্রায়শই আপনার জন্য বিভাগটিকে অনুকূলিত করে - যখন এটি করা নিরাপদ


11
-1 এই উত্তরটি আসলেই প্রশ্নটির সাথে খাপ খায় না, যা বিভাগের সম্ভাব্য সমস্যাগুলি সম্পর্কে - অনুকূলিতকরণের সাথে কিছুই করার নয়
বেন কট্রেল

13
@ বেনকোটরেল এটি পুরোপুরি ভাল ফিট করে। সমস্যাটি রক্ষণাবেক্ষণের ব্যয়ে অর্থহীন কর্মক্ষমতা অপ্টিমাইজেশনে মূল্য স্থাপনের ক্ষেত্রে। প্রশ্ন থেকে "এই অভ্যাসের জন্য কোনও সমস্যা আছে?" - হ্যাঁ. এটি দ্রুত নিখুঁত জিব্বারিশ লেখার দিকে পরিচালিত করবে।
মাইকেল 11

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

5
@ বেনকোটারেল সম্ভবত আপনি আমাকে নির্দেশ করতে পারেন যেখানে প্রশ্নে সঠিকতা সম্পর্কে যা কিছু উল্লেখ আছে?
মাইকেল

5
@ বেনকোটারেল আপনার সবেমাত্র 'আমি পারব না' বলেছিলেন :)
মাইকেল

13

যে কোনও একটি কম বগি ব্যবহার করুন এবং আরও যুক্তিযুক্ত বোধ তৈরি করুন।

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

এটি দেখানোর জন্য এখানে কয়েকটি উদাহরণ পরিস্থিতি নির্ভর করে:

বিভাগ ভাল:

if ((ptr2 - ptr1) >= n / 3)  // good: check if length of subarray is at least n/3
    ...

গুণগুলি খারাপ:

if ((ptr2 - ptr1) * 3 >= n)  // bad: confusing!! what is the intention of this code?
    ...

গুণ ভাল:

if (j - i >= 2 * min_length)  // good: obviously checking for a minimum length
    ...

বিভাগ খারাপ:

if ((j - i) / 2 >= min_length)  // bad: confusing!! what is the intention of this code?
    ...

গুণ ভাল:

if (new_length >= old_length * 1.5)  // good: is the new size at least 50% bigger?
    ...

বিভাগ খারাপ:

if (new_length / old_length >= 2)  // bad: BUGGY!! will fail if old_length = 0!
    ...

2
আমি সম্মত হই যে এটি প্রসঙ্গে নির্ভর করে তবে আপনার প্রথম দুটি জোড়া উদাহরণ অত্যন্ত দুর্বল। আমি উভয় ক্ষেত্রে একে অপরের চেয়ে পছন্দ করব না।
মাইকেল

6
@ মিশেল: আহম ... আপনি কি (ptr2 - ptr1) * 3 >= nমত প্রকাশের মত বুঝতে সহজ হিসাবে পাওয়া যায় ptr2 - ptr1 >= n / 3? এটি আপনার মস্তিষ্কের ট্রিপটি শেষ করে না এবং দুটি পয়েন্টারের মধ্যে পার্থক্যকে ত্রিগুণ করার অর্থটি বোঝার চেষ্টা করে ফিরে আসে না? যদি এটি আপনার এবং আপনার দলের কাছে সত্যই স্পষ্ট হয় তবে আপনার কাছে আরও শক্তির আমার ধারণা; আমাকে অবশ্যই ধীর সংখ্যালঘুতে থাকতে হবে।
মেহরদাদ

2
একটি পরিবর্তনশীল বলা হয় nএবং একটি নির্বিচারে 3 নম্বর উভয় ক্ষেত্রেই বিভ্রান্তিকর হয় তবে যুক্তিসঙ্গত নামের সাথে প্রতিস্থাপন করা হয়, অন্য কোনওটির চেয়ে আমি আর একটি বিভ্রান্তি পাই না।
মাইকেল

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

3

এরকম কিছু "যখনই সম্ভব" খুব খুব কমই একটি ভাল ধারণা।

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

যা সঠিক এবং সর্বাধিক পাঠযোগ্য Do যদি আপনার কাছে দৃ solid় প্রমাণ থাকে যে সর্বাধিক পঠনযোগ্য উপায়ে লিখন কোড কোনও পারফরম্যান্স সমস্যার কারণ হয়ে থাকে, তবে আপনি এটিকে পরিবর্তন বিবেচনা করতে পারেন। যত্ন, গণিত এবং কোড পর্যালোচনাগুলি আপনার বন্ধু।


1

কোডটির পঠনযোগ্যতা সম্পর্কে , আমি মনে করি যে কোনও ক্ষেত্রে গুণটি আরও বেশি পাঠযোগ্য। উদাহরণস্বরূপ, যদি এমন কিছু আছে যা আপনি যাচাই করে দেখতে পারেন যে newValueউপরে 5 শতাংশ বা তার বেশি বৃদ্ধি পেয়েছে oldValue, তবে এটির একটি 1.05 * oldValueপরীক্ষা যার বিরুদ্ধে পরীক্ষা করা উচিত newValueএবং লেখার পক্ষে এটি স্বাভাবিক

    if (newValue >= 1.05 * oldValue)

তবে আপনি যখন জিনিসগুলিকে এভাবে রিফ্যাক্ট করেন তখন নেতিবাচক সংখ্যার বিষয়ে সতর্ক থাকুন (হয় বিভাজনকে গুণের সাথে প্রতিস্থাপন করুন, বা গুণকে বিভাজনে প্রতিস্থাপন করবেন)। আপনি যে দুটি শর্ত বিবেচনা করেছেন তা oldValueহ'ল যদি নেতিবাচক না হওয়ার গ্যারান্টিযুক্ত হয়; তবে ধরুন newValueপ্রকৃতপক্ষে -13.5 এবং oldValue-10.1 হয়। তারপর

newValue/oldValue >= 1.05

সত্য মূল্যায়ন , কিন্তু

newValue >= 1.05 * oldValue

মিথ্যা যাও মূল্যায়ন ।


1

গুণক ব্যবহার করে ইনভেরিয়েন্ট পূর্ণসংখ্যার দ্বারা বিখ্যাত কাগজ বিভাগটি নোট করুন ।

সংকলকটি প্রকৃতপক্ষে গুণক করছে, যদি পূর্ণসংখ্যা অদম্য হয়! বিভাজন নয়। এমনকি এটি 2 টি মানের মূল্যহীনতার জন্যও ঘটে। 2 বিভাগের শক্তি স্পষ্টত বিট শিফট ব্যবহার করে এবং তাই আরও দ্রুত।

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

আমি মাইক্রো-অপ্টিমাইজেশান সম্পর্কে যত্নশীল, তাই আমি সম্ভবত অপ্টিমাইজেশন সম্ভাবনাগুলি একবার দেখে নিই।

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

এছাড়াও, 32-বিট আর্কিটেকচারে, 64-বিট বিভাগটি অনুকূলিত করা হয়নি, যেমনটি আমি জানতে পেরেছি ।


1

আপনার পয়েন্ট ২ এ তুলে নেওয়া, এটি সত্যিই খুব অল্প পরিমাণে ওভারফ্লো রোধ করবে oldValue। তবে যদি SOME_CONSTANTএটি খুব ছোট হয় তবে আপনার বিকল্প পদ্ধতিটি আন্ডারফ্লোতে শেষ হবে, যেখানে মানটি সঠিকভাবে উপস্থাপন করা যায় না।

এবং বিপরীতে, oldValueখুব বড় হলে কী হয় ? আপনার একই সমস্যা রয়েছে, ঠিক বিপরীতে round

যদি আপনি ওভারফ্লো / ডুবো প্রবাহের ঝুঁকি এড়াতে (বা হ্রাস করতে) চান তবে সর্বোত্তম উপায়টি হচ্ছে newValueমাত্রার নিকটতম oldValueবা নিকটে কিনা তা পরীক্ষা করা SOME_CONSTANT। এরপরে আপনি উপযুক্ত বিভাজন অপারেশন চয়ন করতে পারেন

    if(newValue / oldValue >= SOME_CONSTANT)

অথবা

    if(newValue / SOME_CONSTANT >= oldValue)

এবং ফলাফলটি সবচেয়ে নির্ভুল হবে।

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

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

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


0

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

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

আমি বলব যে গুণটির বিকল্পটি যুক্তিসঙ্গত সমাধান বলে মনে হচ্ছে কারণ সমস্যাটি সংজ্ঞায়িত।


0

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

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