আমার কি গুণ বা বিভাগ ব্যবহার করা উচিত?


118

এখানে মূর্খ মজাদার প্রশ্ন:

ধরা যাক আমাদের একটি সাধারণ অপারেশন করতে হবে যেখানে আমাদের একটি ভেরিয়েবলের মানের অর্ধেক প্রয়োজন। আছে সাধারণত এই কাজ করার দুটি উপায়:

y = x / 2.0;
// or...
y = x * 0.5;

ধরে নিচ্ছি আমরা ভাষার সাথে সরবরাহিত স্ট্যান্ডার্ড অপারেটরগুলি ব্যবহার করছি, যার মধ্যে আরও ভাল পারফরম্যান্স রয়েছে?

আমি অনুমান করছি যে গুণটি সাধারণত ভাল হয় তাই আমি কোড করার সময় সেটির সাথে লেগে থাকার চেষ্টা করি তবে আমি এটি নিশ্চিত করতে চাই।

যদিও ব্যক্তিগতভাবে আমি পাইথন ২.৪-২.৫ এর উত্তরে আগ্রহী , অন্য ভাষার জন্যও উত্তর পোস্ট করতে নির্দ্বিধায়! এবং যদি আপনি চান, অন্য ফ্যানসিয়ার উপায়গুলি (বিটওয়াইড শিফট অপারেটরগুলি ব্যবহার করার মতো) পোস্ট করতে নির্দ্বিধায় পড়ুন।


5
আপনি কি একটি মানদণ্ড চালিয়েছেন? এটি কোডের প্রায় এক ডজন লাইনের। বেঞ্চমার্ক চালানো থেকে আপনি কী শিখলেন? [ইঙ্গিত: এটি করা প্রশ্নটি এখানে পোস্ট করার চেয়ে আরও দ্রুত হত would]
এস .লট

4
দুর্দান্ত প্রশ্ন, যা বেশ কিছু আকর্ষণীয় উত্তর / আলোচনা উত্পন্ন করেছে। ধন্যবাদ :)
স্টিলথকপ্টার

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

1
বিভাগটি বহুগুণের চেয়ে অনেক ধীর। তবে কিছু স্মার্ট কমপ্লায়ার / ভিএম বিভাগ বিভাজনকে গুণকে রূপান্তরিত করে, সুতরাং আপনার পরীক্ষাগুলির একই ফলাফল হবে (উভয় পরীক্ষার পরীক্ষার গুণক)।
ইভান ককির

4
কিছুটা বিষয় বন্ধ, তবে আমি কেবল বলতে চাই যে আমি @ কেভিনহাইটফুটটির সাথে কতটা সম্মত। প্রযুক্তিগত প্রশ্নের স্ট্রে টেকনিক্যাল জবাবের চেয়ে খুতবা থেকে পাঠ করার মতো হতাশার কিছুই নেই। ধন্যবাদ আপনার মন্তব্যের জন্য কেভিন!
জিন-ফ্রান্সোইস

উত্তর:


78

পাইথন:

time python -c 'for i in xrange(int(1e8)): t=12341234234.234 / 2.0'
real    0m26.676s
user    0m25.154s
sys     0m0.076s

time python -c 'for i in xrange(int(1e8)): t=12341234234.234 * 0.5'
real    0m17.932s
user    0m16.481s
sys     0m0.048s

গুণটি 33% দ্রুত

অ্যাপ্লিকেশন Lua:

time lua -e 'for i=1,1e8 do t=12341234234.234 / 2.0 end'
real    0m7.956s
user    0m7.332s
sys     0m0.032s

time lua -e 'for i=1,1e8 do t=12341234234.234 * 0.5 end'
real    0m7.997s
user    0m7.516s
sys     0m0.036s

=> কোন বাস্তব পার্থক্য

LuaJIT:

time luajit -O -e 'for i=1,1e8 do t=12341234234.234 / 2.0 end'
real    0m1.921s
user    0m1.668s
sys     0m0.004s

time luajit -O -e 'for i=1,1e8 do t=12341234234.234 * 0.5 end'
real    0m1.843s
user    0m1.676s
sys     0m0.000s

=> এটি কেবল 5% দ্রুত

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


বেঞ্চমার্কিংয়ের জন্য টাইম কমান্ড ব্যবহারের পরামর্শের জন্য ধন্যবাদ!
এডমন্ডিতো

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

7
@ রেস্মাস: জেআইটি আরও ভাল হওয়ার সাথে সাথে আপনি বিভাজনের জন্য জিজ্ঞাসা করলেও সিপিইউ গুণনের নির্দেশ ব্যবহার করার সম্ভাবনা বেশি।
বেন ভয়েগট

68

যেটি পরিষ্কার তা সর্বদা ব্যবহার করুন। আপনি অন্য যে কোনও কিছু করুন কম্পাইলারকে আউটসামার্ট করার চেষ্টা করছেন। সংকলকটি যদি কিছুটা বুদ্ধিমান হয় তবে ফলাফলটি অনুকূল করে তোলার জন্য এটি সর্বোত্তম চেষ্টা করবে তবে পরবর্তী কিছু লোক আপনার ক্রেপি বিটশিটিং সমাধানের জন্য আপনাকে ঘৃণা করতে পারে না (উপায়টি দ্বারা আমি বিট ম্যানিপুলেশন পছন্দ করি, তবে এটি মজাদার But তবে মজা! = পাঠযোগ্য )

অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল। সর্বদা অপটিমাইজেশনের তিনটি নিয়ম মনে রাখবেন!

  1. অপ্টিমাইজ করবেন না।
  2. আপনি যদি বিশেষজ্ঞ হন তবে নিয়ম # 1 দেখুন
  3. আপনি যদি বিশেষজ্ঞ হন এবং প্রয়োজনটিকে ন্যায়সঙ্গত করতে পারেন তবে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন:

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

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


7
এটি সম্পূর্ণ নথের উদ্ধৃতি নয়; দেখতে en.wikipedia.org/wiki/...
জেসন এস

না, বিভিন্ন উত্স থেকে এই বিষয়ে প্রায় 40 টি বিভিন্ন উদ্ধৃতি রয়েছে। আমি কয়েক টুকরা একসাথে কয়েক।
বিল কে

আপনার শেষ বাক্যটি কখন অসম্পূর্ণ করে তোলে কখন # 1 এবং # 2 বিধি প্রয়োগ করা উচিত, যেখানে আমরা শুরু করেছি সেখানে ফিরে গিয়ে: কোনটি অনুকূলিতকরণ সার্থক এবং কোনটি নয় তা আমাদের সিদ্ধান্ত নিতে হবে। উত্তরের ভান করা কোনও উত্তর নয় answer
ম্যাট

2
এটা সত্যিই আপনার কাছে বিভ্রান্তিকর? আপনি যদি ক্লায়েন্টের নির্দিষ্টকরণগুলি না পূরণ করেন এবং সিপিইউয়ের ভাষা এবং ক্যাশে বৈশিষ্ট্যগুলি সহ পুরো সিস্টেমের সাথে খুব পরিচিত না হন তবে সর্বদা নিয়ম 1 এবং 2 প্রয়োগ করুন। এই মুহুর্তে, কেবলমাত্র 3-এ পদ্ধতিটি অনুসরণ করুন, কেবল এই ভাবেন না "আরে, আমি যদি এই পরিবর্তনশীলকে কল করার পরিবর্তে স্থানীয়ভাবে ক্যাশে করি তবে জিনিসগুলি সম্ভবত দ্রুত হবে First যেগুলি সাহায্য করে না তাদের ফেলে দিন way সমস্ত পথ
বিল কে

49

আমি মনে করি এটি এতটা নিটপিকি হচ্ছে যে কোডটি আরও পঠনযোগ্য করে তোলে তাই করা ভাল better যদি আপনি কয়েক হাজার কোটি না হয়ে কয়েক হাজার বার অপারেশন না করেন তবে আমি সন্দেহ করি যে কেউ কখনও এই পার্থক্যটি লক্ষ্য করতে পারে।

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


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

আমি কিছু জিনিস অনুমান করি, আপনি হয়ত একক অপারেশন সম্পর্কে যত্নশীল। তবে আমি আশা করব যে 99% অ্যাপ্লিকেশনগুলিতে, এটি কোনও ব্যাপার নয়।
টমাস

27
বিশেষত যেহেতু ওপি পাইথনে কোনও উত্তর খুঁজছিল। আমি সন্দেহ করি যে পরিমাণে যে পরিমাণ দক্ষতার প্রয়োজন তা পাইথনে লেখা হবে।
এড এস।

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

@ সোলিয়ান্ট - হ্যাঁ স্পিডআপ তবে আমি সন্দেহ করি "অনেক সময়" - ভাসমান-পয়েন্ট বিভাগ এবং গুণটি প্রায় 4: 1 এর বেশি হওয়া উচিত নয়, যদি না প্রশ্নে প্রসেসরটি সত্যিকার অর্থে গুণনের জন্য অনুকূলিত না হয় বিভাজন না করে।
জেসন এস

39

গুণ বহুগুণ, বিভাগ আরও সঠিক। আপনার নম্বরটি 2 পাওয়ার শক্তি না হলে আপনি কিছুটা নির্ভুলতা হারাবেন:

y = x / 3.0;
y = x * 0.333333;  // how many 3's should there be, and how will the compiler round?

এমনকি যদি আপনি সংযোজকটিকে নিখুঁত নির্ভুলতার জন্য উল্টানো ধ্রুবকটি বের করতে দেন তবে উত্তরটি এখনও আলাদা হতে পারে।

x = 100.0;
x / 3.0 == x * (1.0/3.0)  // is false in the test I just performed

গতি ইস্যুটি কেবল সি / সি ++ বা জেআইটি ভাষাগুলিতেই গুরুত্বপূর্ণ, এবং তারপরেও যদি অপারেশনটি কোনও অচেতনার লুপে থাকে।


আপনি সম্পূর্ণ সংখ্যা দ্বারা ভাগ করে নিলে বিভাগ সঠিক is
প্লিন্থ

7
ডিনোমিনেটর> অংকের সাথে ভাসমান পয়েন্ট বিভাগকে নিম্ন-আদেশ বিটগুলিতে অর্থহীন মানগুলি অবশ্যই প্রবর্তন করতে হবে; বিভাগ সাধারণত নির্ভুলতা হ্রাস করে।
এস। লট

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

1
আমি জানি এই উত্তরটি 8 বছরেরও বেশি পুরানো, তবে এটি বিভ্রান্তিকর; আপনি নির্ভুলতার উল্লেখযোগ্য ক্ষতি ছাড়াই বিভাগ সম্পাদন করতে পারেন: y = x * (1.0/3.0);এবং সংকলক সাধারণত সংকলন সময়ে 1/3 গণনা করবে। হ্যাঁ, 1/3 আইইইই -754-তে পুরোপুরি উপস্থাপনযোগ্য নয়, তবে আপনি যখন ভাসমান-পয়েন্ট গাণিতিক সম্পাদন করছেন আপনি যে কোনওভাবেই নির্ভুলতা হারাচ্ছেন , আপনি গুণ বা বিভাগ করছেন কিনা, কারণ নিম্ন-অর্ডার বিটগুলি বৃত্তাকার হয়। যদি আপনি জানেন যে আপনার গণনাটি রাউন্ডিং ত্রুটির প্রতি সংবেদনশীল তবে আপনার কীভাবে সমস্যাটি সমাধান করা যায় তাও জানা উচিত।
জেসন এস

1
@ জেসনস আমি মাত্র একটি প্রোগ্রাম রাতারাতি চলতে শুরু করেছিলাম, 1.0 থেকে শুরু করে 1 ইউএলপি দিয়ে গণনা করছি; আমি (1.0/3.0)বিভাজক দ্বারা গুণ দ্বারা ফলাফল তুলনা 3.0। আমি 1.0000036666774155 পর্যন্ত পেয়েছি এবং সেই জায়গায় 7.3% ফলাফল আলাদা ছিল% আমি অনুমান করি যে তারা কেবল 1 বিট দ্বারা পৃথক ছিল, তবে যেহেতু আইইইই গাণিতিকটি নিকটতম সঠিক ফলাফলের কাছে পৌঁছানোর গ্যারান্টিযুক্ত আমি বিভাগটি আরও সঠিক বলে আমার বক্তব্য দ্বারা দাঁড়িয়েছি। পার্থক্যটি উল্লেখযোগ্য কিনা তা আপনার উপর নির্ভর করে।
মার্ক রান্সম

25

আপনি যদি নিজের কোডটি অপ্টিমাইজ করতে চান তবে এখনও পরিষ্কার হতে চান তবে এটি চেষ্টা করুন:

y = x * (1.0 / 2.0);

সংকলকটি সংকলন সময়ে বিভাজন করতে সক্ষম হওয়া উচিত, তাই আপনি রান-টাইমে একটি গুণটি পান। আমি স্পষ্টতা y = x / 2.0ক্ষেত্রে হিসাবে একই হতে পারে আশা করি ।

এটি এম্বেড থাকা প্রসেসরে যেখানে অনেকগুলি লট থাকে তা ভাসমান-পয়েন্ট গণিতের গণনা করার জন্য ভাসমান-পয়েন্ট অনুকরণ প্রয়োজন Where


12
নিজেকে স্যুট করুন (এবং যারাই এটি পছন্দ করে) - এটি এম্বেড করা বিশ্বে স্ট্যান্ডার্ড অনুশীলন এবং সেই ক্ষেত্রের সফটওয়্যার ইঞ্জিনিয়াররা এটি পরিষ্কার দেখতে পান find
জেসন এস

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

1
ওএমজি, প্রাথমিক গণিতটি অস্পষ্ট বলে ভেবে কমপক্ষে 6 জন প্রোগ্রামার রয়েছেন। আফাইক, আইইইই 754 গুণটি কমিটিকেটিভ (তবে অ-অ্যাসোসিয়েটেটিভ)।
মার্টিনাস

13
সম্ভবত আপনি বিন্দু মিস করছি। বীজগণিতিক সঠিকতার সাথে এর কোনও যোগসূত্র নেই। একটি আদর্শ বিশ্বে আপনার কেবল দুটি দ্বারা বিভাজন করতে সক্ষম হওয়া উচিত: y = x / 2.0;তবে বাস্তব বিশ্বে আপনাকে কম-ব্যয়বহুল গুণটি সম্পাদনের জন্য সংকলকটি সিজল করতে হতে পারে। সম্ভবত এটি কেন কম y = x * (1.0 / 2.0);ভাল তা পরিষ্কার এবং এর y = x * 0.5;পরিবর্তে এটি আরও পরিষ্কার করা হবে। কিন্তু পরিবর্তন 2.0একটি থেকে 7.0এবং আমি অনেক বরং দেখতে না y = x * (1.0 / 7.0);চেয়ে y = x * 0.142857142857;
জেসন এস

3
এটি আপনার পদ্ধতিটি ব্যবহার করার জন্য কেন আরও সুসংগঠিত (এবং সুনির্দিষ্ট) তা সত্যিই এটি পরিষ্কার করে দেয়।
হুয়ান মার্টিনেজ

21

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

আমি কোনও অপ্টিমাইজেশন ছাড়াই সমাবেশে সংকলন করেছি এবং ফলাফলটির দিকে চেয়েছি।
কোড:

int main() {

    volatile int a;
    volatile int b;

    asm("## 5/2\n");
    a = 5;
    a = a / 2;

    asm("## 5*0.5");
    b = 5;
    b = b * 0.5;

    asm("## done");

    return a + b;

}

সংকলিত gcc tdiv.c -O1 -o tdiv.s -S

বিভাগ দ্বারা 2:

movl    $5, -4(%ebp)
movl    -4(%ebp), %eax
movl    %eax, %edx
shrl    $31, %edx
addl    %edx, %eax
sarl    %eax
movl    %eax, -4(%ebp)

এবং 0.5 দ্বারা গুণফল:

movl    $5, -8(%ebp)
movl    -8(%ebp), %eax
pushl   %eax
fildl   (%esp)
leal    4(%esp), %esp
fmuls   LC0
fnstcw  -10(%ebp)
movzwl  -10(%ebp), %eax
orw $3072, %ax
movw    %ax, -12(%ebp)
fldcw   -12(%ebp)
fistpl  -16(%ebp)
fldcw   -10(%ebp)
movl    -16(%ebp), %eax
movl    %eax, -8(%ebp)

যাইহোক, যখন আমি এই গুলিগুলিকে intএস-তে পরিবর্তন করি double(যা পাইথন সম্ভবত এটি করবে), আমি এটি পেয়েছি:

বিভাগ:

flds    LC0
fstl    -8(%ebp)
fldl    -8(%ebp)
flds    LC1
fmul    %st, %st(1)
fxch    %st(1)
fstpl   -8(%ebp)
fxch    %st(1)

গুণ:

fstpl   -16(%ebp)
fldl    -16(%ebp)
fmulp   %st, %st(1)
fstpl   -16(%ebp)

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

পার্শ্ব নোট হিসাবে, আপনি দেখতে পারেন যে আমার প্রোগ্রামে main()ফিরে আসে a + b। আমি যখন অস্থিতিশীল কীওয়ার্ডটি সরিয়ে নিয়ে যাই, আপনি কখনই অনুমান করতে পারবেন না যে সমাবেশটি কেমন দেখাচ্ছে (প্রোগ্রাম সেটআপ বাদ দিয়ে):

## 5/2

## 5*0.5
## done

movl    $5, %eax
leave
ret

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

অত্যধিক দীর্ঘ উত্তরের জন্য দুঃখিত।


1
এটি কোনও "একক নির্দেশনা" নয়। এটি কেবল ধ্রুবক ভাঁজ পেয়েছে।
kvanberendonck

5
@kvanberendonck অবশ্যই এটি একটি একক নির্দেশনা। এগুলি গণনা করুন: movl $5, %eax অপ্টিমাইজেশনের নামটি গুরুত্বপূর্ণ বা প্রাসঙ্গিকও নয়। আপনি কেবল চার বছরের পুরানো উত্তরটির প্রতি মনোনিবেশ করতে চেয়েছিলেন।
কারসন মাইয়ার্স

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

10

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

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

আপনি যদি এখনও কৌতূহলী হন তবে নিম্ন স্তরের অপ্টিমাইজেশন পয়েন্ট থেকে:

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

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

আপনি কোনও টিভি শো দেখার সময় একটি উপমা মাইক্রোওয়েভে পাই স্থাপন করছে। এটি আপনাকে টিভি শো থেকে দূরে সরিয়ে নিয়ে যাওয়ার মোট সময় হল এটিকে মাইক্রোওয়েভে রাখা এবং মাইক্রোওয়েভ থেকে বের করে আনতে কত সময় ছিল। আপনার বাকি সময় আপনি এখনও টিভি শো দেখেছেন। তাই যদি পাইটি 1 মিনিটের পরিবর্তে রান্না করতে 10 মিনিট সময় নেয় তবে এটি আসলে আপনার টিভি দেখার আর কোনও সময় ব্যবহার করে না।

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

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


7

যাকে লিখুন তাতে আপনার অভিপ্রায়টি আরও স্পষ্টভাবে বলা আছে।

আপনার প্রোগ্রামটি কাজ করার পরে, ধীরগতির কী তা বের করুন এবং এটিকে আরও দ্রুত করুন।

এটি অন্য উপায়ে করবেন না।


6

আপনার যা প্রয়োজন তা করুন। প্রথমে আপনার পাঠককে ভাবুন, আপনার পারফরম্যান্স সমস্যা না হওয়া পর্যন্ত পারফরম্যান্স সম্পর্কে চিন্তা করবেন না।

সংকলক আপনার জন্য অভিনয় করতে দিন।


5

আপনি যদি পূর্ণসংখ্যার বা নন ফ্লোটিং পয়েন্ট ধরণের সাথে কাজ করে থাকেন তবে আপনার বিটশিটিং অপারেটরদের ভুলে যাবেন না: << >>

    int y = 10;
    y = y >> 1;
    Console.WriteLine("value halved: " + y);
    y = y << 1;
    Console.WriteLine("now value doubled: " + y);

7
এই অপ্টিমাইজেশনটি কোনও আধুনিক সংকলকটিতে পর্দার আড়ালে স্বয়ংক্রিয়ভাবে সঞ্চালিত হয়।
ডাস্টিন গেটেজ

অপরেন্ড (?) এর পরিবর্তে এটি ব্যবহারের জন্য শিফটেবল সংস্করণ রয়েছে কিনা তা পরীক্ষা করে (বিট অপ্স ব্যবহার করে) কেউ পরীক্ষা করেছে? ফাংশন মুল (ক, খ) {যদি (খ ২ হয়) একটি << 1 প্রদান করে; যদি (খ 4 হয়) একটি << 2 প্রদান করে; // ... ইত্যাদি একটি * খ ফেরত দিন; } আমার অনুমান যে আইএফ এত ব্যয়বহুল এটি কম দক্ষ হবে।
ক্রিস্টোফার লাইটফুট

যা আমি কল্পনা করেছিলাম তার কাছাকাছি জায়গায় মুদ্রণ হয়নি; কিছু মনে করো না.
ক্রিস্টোফার লাইটফুট

কনস্ট ক্রিয়াকলাপগুলির জন্য একটি সাধারণ সংকলক কাজটি করা উচিত; তবে এখানে আমরা অজগর ব্যবহার করছি তাই আমি নিশ্চিত নই যে এটির স্মার্ট যথেষ্ট জানা আছে কিনা? (এটা করা উচিত).
ক্রিস্টোফার লাইটফুট

ভাল শর্টকাট ছাড়া এটি সত্যই ঘটছে তা অবিলম্বে পরিষ্কার হয় না। বেশিরভাগ প্রোগ্রামার এমনকি বিটশিফ্ট অপারেটরদেরও চিনতে পারে না।
ব্লেজমোনজার

4

আসলে এখানে একটি ভাল কারণ আছে যে সাধারণ নিয়ম হিসাবে থাম্বের গুণন ভাগের চেয়ে দ্রুত হবে। সম্ভাবনা বেশি এই দিন - - মত পুনরাবৃত্তিও সঙ্গে হার্ডওয়্যার বিন্দু বিভাগ ভাসমান শিফ্ট ও শর্তাধীন বিয়োগ আলগোরিদিম (বাইনারি সংখ্যার "লম্বা বিভাজন") বা পারেন সম্পন্ন করা হয় Goldschmidt এর অ্যালগরিদমের । শিফট এবং বিয়োগফলের বিট যথার্থতার জন্য কমপক্ষে একটি চক্রের প্রয়োজন (পুনরাবৃত্তিগুলি শিখন-এবং যোগের গুণকের সমান্তরালভাবে প্রায় অসম্ভব), এবং পুনরাবৃত্তকরণ অ্যালগরিদমগুলি প্রতি পুনরাবৃত্তির ক্ষেত্রে কমপক্ষে একটি গুণ করা যায়। উভয় ক্ষেত্রেই সম্ভবত বিভাগটি আরও বেশি চক্র নেবে এমনটি সম্ভবত খুব সম্ভবত। অবশ্যই এটি সংকলক, ডেটা মুভমেন্ট বা স্পষ্টতা মধ্যে quirks জন্য অ্যাকাউন্ট না। মোটামুটি , যদিও আপনি যদি কোনও প্রোগ্রামের সময়ের সংবেদনশীল অংশে কোনও অভ্যন্তরীণ লুপটি কোডিং করে থাকেন তবে এটি লেখার জন্য 0.5 * xবা 1.0/2.0 * xতার চেয়ে x / 2.0যুক্তিসঙ্গত কাজ। "কোড কী পরিষ্কার" এর পেডেন্ট্রি একেবারেই সত্য, তবে এই তিনটিই পঠনযোগ্যতার এত কাছে যে প্যাডেন্ট্রি এই ক্ষেত্রে কেবল পেডেন্টিক।


3

আমি সবসময় শিখেছি যে গুণটি আরও দক্ষ।


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

3

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


2

ভাসমান-পয়েন্ট বিভাগটি (সাধারণত) বিশেষত ধীর, সুতরাং ভাসমান-পয়েন্টের গুণটি তুলনামূলকভাবে ধীর হলেও এটি সম্ভবত ভাসমান-পয়েন্ট বিভাগের চেয়ে দ্রুত faster

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


2

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


2

সাবধান থাকুন "অনুমান করা গুণগুলি সাধারণত ভাল হয় তাই আমি যখন কোড করি তখন তার সাথে লেগে থাকার চেষ্টা করি,"

এই নির্দিষ্ট প্রশ্নের প্রসঙ্গে, এখানে আরও ভাল অর্থ "দ্রুত"। যা খুব কার্যকর নয়।

গতি সম্পর্কে চিন্তা করা একটি গুরুতর ভুল হতে পারে। গণনার নির্দিষ্ট বীজগণিত ফর্মটিতে ত্রুটিযুক্ত ত্রুটিযুক্ত প্রভাব রয়েছে।

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

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

সবচেয়ে বড় সমস্যাগুলি দুটি প্রায়-সমান সংখ্যার কারসাজির চেষ্টা থেকে আসে। ডান-সর্বাধিক বিট (ত্রুটির বিট) ফলাফলগুলিতে আধিপত্য বিস্তার করতে আসে।

>>> for i in range(7):
...     a=1/(10.0**i)
...     b=(1/10.0)**i
...     print i, a, b, a-b
... 
0 1.0 1.0 0.0
1 0.1 0.1 0.0
2 0.01 0.01 -1.73472347598e-18
3 0.001 0.001 -2.16840434497e-19
4 0.0001 0.0001 -1.35525271561e-20
5 1e-05 1e-05 -1.69406589451e-21
6 1e-06 1e-06 -4.23516473627e-22

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


1

আমি কোথাও পড়েছি যে সি / সি ++ তে গুণ বেশি দক্ষ; বর্ণিত ভাষা সম্পর্কিত কোনও ধারণা নেই - অন্যান্য সমস্ত ওভারহেডের কারণে পার্থক্যটি সম্ভবত নগণ্য।

যতক্ষণ না এটি আরও রক্ষণাবেক্ষণযোগ্য / পড়ার যোগ্য তা নিয়ে ইস্যু স্টিক না হয়ে যায় - লোকেরা যখন আমাকে এটি বলে তবে এটি সত্য it


1

আমি সাধারণভাবে গুণনের পরামর্শ দেব কারণ আপনার বিভাজক 0 নয় তা নিশ্চিত করার জন্য আপনাকে চক্র ব্যয় করতে হবে না, অবশ্যই যদি আপনার বিভাজক একটি ধ্রুবক হয় তবে এটি প্রয়োগ হয় না।


1

জাভা অ্যান্ড্রয়েড, স্যামসাং জিটি-এস 578-তে প্রোফাইলিত

public void Mutiplication()
{
    float a = 1.0f;

    for(int i=0; i<1000000; i++)
    {
        a *= 0.5f;
    }
}
public void Division()
{
    float a = 1.0f;

    for(int i=0; i<1000000; i++)
    {
        a /= 2.0f;
    }
}

ফলাফল?

Multiplications():   time/call: 1524.375 ms
Division():          time/call: 1220.003 ms

বিভাগটি গুণনের চেয়ে প্রায় 20% দ্রুত (!)


1
বাস্তববাদী হওয়ার জন্য, আপনার পরীক্ষা করা উচিত a = i*0.5, না a *= 0.5। বেশিরভাগ প্রোগ্রামাররা এই অপারেশনগুলি ব্যবহার করবে।
ব্লেজমোনজার

1

# 24 পোস্টের মতো (গুণগুলি দ্রুত) এবং # 30 - তবে কখনও কখনও এগুলি উভয়ই বোঝা ঠিক তত সহজ:

1*1e-6F;

1/1e6F;

Them আমি তাদের উভয়ই পঠনযোগ্য হিসাবে সহজ হিসাবে খুঁজে পাই এবং তাদের কয়েক বিলিয়ন বার পুনরাবৃত্তি করতে হয়েছিল। সুতরাং এটি জেনে রাখা দরকারী যে গুণগুলি সাধারণত দ্রুত হয়।


1

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

একটি পেন্টিয়াম 4, 2.8 গিগাহার্টজ, বনাম 2003:

  • গুণ: 8.09
  • বিভাগ: 7.97

একটি শিওন ডাব্লু 3530, বনাম 2003:

  • গুণ: 4.68
  • বিভাগ: 4.64

Xeon W3530 এ, বনাম 2010:

  • গুণ: 5.33
  • বিভাগ: 21.05

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

18-03-2013 সম্পাদনা করুন: vs2010 এর জন্য পর্যবেক্ষণ


আমি অবাক হলাম যে কোনও কারণ আছে কি যদি কোনও সংকলক n/10.0ফর্মের একটি এক্সপ্রেশন সহ উদাহরণস্বরূপ প্রতিস্থাপন করতে পারে না (n * c1 + n * c2)? আমি প্রত্যাশা করব যে বেশিরভাগ প্রসেসরগুলিতে একটি বিভাগ দুটি গুণ এবং একটি বিভাগের চেয়ে বেশি সময় নেয় এবং আমি বিশ্বাস করি যে কোনও ধ্রুবক দ্বারা বিভাগ নির্দেশিত সূত্র ব্যবহার করে সমস্ত ক্ষেত্রে সঠিকভাবে গোল ফল পেতে পারে।
সুপারক্যাট

1

এখানে মূর্খ মজাদার উত্তর:

এক্স / 2.0 হয় না সমতূল্য এক্স * 0.5

ধরা যাক আপনি 22 অক্টোবর, 2008 এ এই পদ্ধতিটি লিখেছিলেন।

double half(double x) => x / 2.0;

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

double half(double x) => x * 0.5;

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

double quantize(double x)
{
    if (half(x) > threshold))
        return 1;
    else
        return -1;
}

নীচে লাইন হয়; দু'জনের যে কোনও একটির জন্য স্থির হয়ে গেলে, তারপরে এটি আটকে দিন!


1
Downvote? আপনার মতামত ব্যাখ্যা করে একটি মন্তব্য সম্পর্কে? এই উত্তরটি অবশ্যই 100% প্রাসঙ্গিক।
l33t

কম্পিউটার বিজ্ঞানে, 2 টির শক্তির দ্বারা ভাসমান বিন্দুর মানগুলির গুণিত / বিভাজন হ্রাসহীন, যদি না মানটি ডেনরমালাইজড বা ওভারফ্লো হয়।
সূচনা

যেহেতু বিভাগের সময় ভাসমান বিন্দুটি নিখরচায় নয়, আপনার বক্তব্যটি সত্য কিনা তা আসলেই কিছু আসে যায় না। যদিও তা হলে আমি খুব অবাক হব।
l33t

1
"বিভাগের সময় ভাসমান বিন্দুটি নিখরচায় নয়" কেবলমাত্র যখন আপনি প্রাচীন সংকলকটি তৈরি করেন যা অবচয়যুক্ত x87 কোডটি প্রকাশ করে। আধুনিক হার্ডওয়্যার উপর শুধু একটি ভাসা থাকার / ডবল পরিবর্তনশীল, অবচয়হীন হয় 32 বা 64 বিট আইইইই 754: en.wikipedia.org/wiki/IEEE_754 কারণ উপায় আইইইই 754 কাজ, যখন আপনি 2 দ্বারা বা 0.5 দ্বারা গুন ভাগ, আপনি কমছে 1 দ্বারা প্রকাশক, বাকি বিটস (সাইন + মন্টিসে) পরিবর্তন হয় না। এবং নির্ভুলতার কোনও ক্ষতি ছাড়াই আইইইই 754 তে হ'ল 2এবং 0.5সংখ্যা উভয়ই উপস্থাপন করা যেতে পারে (উদাহরণস্বরূপ 0.4বা 0.1তারা পারছেন না)।
শীঘ্রই

0

ঠিক আছে, আমরা যদি ধরে নিই যে কোনও অ্যাড / সাবট্র্যাক অপারেশনটির জন্য 1 খরচ হয়, তবে 5 টি গুণ করে এবং প্রায় 20 কে বিভাজন করতে হবে।


আপনি এই নম্বরগুলি কোথা থেকে পেয়েছেন? অভিজ্ঞতা? অন্তরের অনুভূতি? ইন্টারনেটে নিবন্ধ? তারা বিভিন্ন ডেটা ধরণের জন্য কীভাবে পরিবর্তন করবে?
ক্রোজ

0

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


-3

প্রযুক্তিগতভাবে বিভাজনের মতো কোনও জিনিস নেই, বিপরীত উপাদানগুলির দ্বারা কেবল গুণ রয়েছে। উদাহরণস্বরূপ আপনি কখনই 2 দ্বারা ভাগ করবেন না, আপনি আসলে 0.5 দ্বারা গুণাবেন।

'বিভাগ' - আসুন ছাগলছানা নিজেদেরকে এটি একটি দ্বিতীয় জন্য বিদ্যমান - সবসময় কঠিন কারণ 'ডিভাইড' থেকে যে গুণ হল xদ্বারা yমান গনা প্রথমে চাহিদা y^{-1}যেমন যে y*y^{-1} = 1এবং তারপর গুণ না x*y^{-1}। আপনি যদি ইতিমধ্যে জানেন y^{-1}তবে এটি থেকে গণনা না করা yঅবশ্যই একটি অপ্টিমাইজেশন হতে হবে।


3
যা সিলিকনে বিদ্যমান উভয় আদেশের বাস্তবতাকে সম্পূর্ণ উপেক্ষা করে।
এনপিএসএফ 3000

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

@ বিটাইলার যদি উভয় কমান্ড সিলিকনে বিদ্যমান থাকে এবং উভয় কমান্ডই নির্দেশনাটি তুলনামূলকভাবে জটিল যে তুলনামূলকভাবে জটিল সেটির চেয়ে পিওভ (পিওভ) থেকে সম্পূর্ণ অপ্রাসঙ্গিক, তার চেয়ে একই সংখ্যক চক্র [যেমন একটি প্রত্যাশা করবে) নেয়।
এনপিএসএফ 3000

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