সি / সি ++ এর সাথে তুলনায় পারফরম্যান্সের জন্য জাভা কি "টুইঙ্ক" করা অনেক বেশি শক্ত? [বন্ধ]


11

JVM এর "যাদু" জাভাতে মাইক্রো-অপটিমাইজেশনের উপর কোনও প্রোগ্রামারের প্রভাবকে বাধা দেয়? আমি সম্প্রতি সি ++ এ পড়েছি কখনও কখনও ডেটা সদস্যদের ক্রমটি অপ্টিমাইজেশন সরবরাহ করতে পারে (মাইক্রোসেকেন্ড পরিবেশে দেওয়া হয়) এবং আমি ধরে নিয়েছিলাম যে জাভা থেকে পারফরম্যান্স চেপে ধরার সময় কোনও প্রোগ্রামারের হাত বাঁধা আছে?

আমি প্রশংসা করি একটি শালীন অ্যালগরিদম আরও বেশি গতি-লাভ প্রদান করে, তবে আপনি একবার সঠিক অ্যালগরিদম জেভিএম নিয়ন্ত্রণের কারণে জাভা আরও শক্ত করতে চান?

যদি তা না হয় তবে লোকেরা জাভাতে আপনি কী কৌশল ব্যবহার করতে পারেন তার উদাহরণ দিতে পারে (সাধারণ সংকলক পতাকা ছাড়াও)।


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

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

1
"জাভা কর্মক্ষমতা ঠাট" জন্য, অধ্যয়নরত মূল্য আছেন: কার্যকরী জাভা , Angelika ল্যাঙ্গার লিংক - জাভা পারফরমেন্স এবং ব্রায়ান Goetz দ্বারা কর্মক্ষমতা সম্পর্কিত নিবন্ধ জাভা তত্ত্ব ও অনুশীলন এবং থ্রেডিং স্বল্প সিরিজ ক্লিক এখানে
মশা

2
টিপস এবং কৌশল সম্পর্কে অত্যন্ত সতর্কতা অবলম্বন করুন - জেভিএম, অপারেটিং সিস্টেম এবং হার্ডওয়্যার এগিয়ে চলে - আপনি আপনার বিশেষ পরিবেশের জন্য পারফরম্যান্স টিউনিং পদ্ধতিটি এবং বর্ধিতকরণগুলি প্রয়োগ করা বন্ধ করে দিতে পারেন :-)
মার্টিজ ভার্বার্গ

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

উত্তর:


5

অবশ্যই, মাইক্রো-অপ্টিমাইজেশনের স্তরে জেভিএম এমন কিছু কাজ করবে যা আপনার বিশেষত সি এবং সি ++ এর তুলনায় খুব সামান্য নিয়ন্ত্রণ রাখবে।

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

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


আপনার অ্যাপটি কোর জুড়ে স্কেল করে না দেখলে এটি অনেকটা বিষয় হয়ে যায়
জেমস

@ জেমস - বিস্তৃত যত্ন?
টেলাস্টিন

1
একটি সূচনা জন্য এখানে দেখুন: যান্ত্রিক-
জেমস

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

29

মাইক্রো-অপ্টিমাইজেশানগুলি প্রায় সময়ের জন্য উপযুক্ত নয় এবং প্রায় সমস্ত সহজগুলি স্বয়ংক্রিয়ভাবে সংকলক এবং রানটাইম দ্বারা সম্পন্ন হয়।

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

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

যদি তা না হয় তবে লোকেরা জাভাতে আপনি কী কৌশল ব্যবহার করতে পারেন তার উদাহরণ দিতে পারে (সাধারণ সংকলক পতাকা ছাড়াও)।

জাভা সংকলক প্রায় কোন অপ্টিমাইজেশন না কারণ কম্পাইলার পতাকা জাভা অপ্রাসঙ্গিক; রানটাইম করে।

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


1
+1: মূলত আমি আমার উত্তরে যা লিখছিলাম তা সম্ভবত আরও ভাল গঠনের।
ক্লাইম

1
+1: খুব ভাল পয়েন্টগুলি খুব সংক্ষিপ্ত উপায়ে ব্যাখ্যা করা হয়েছে: "এটি বেশ শক্ত ... তবে যদি সঠিকভাবে করা হয় তবে এটি পুরোপুরি দমদায়ক পারফরম্যান্সের দিকে নিয়ে যেতে পারে all অবশ্যই আপনি এর জন্য সমস্ত ধরণের ভয়াবহ বাগের সম্ভাবনা দিয়ে অর্থ প্রদান করেন course । "
জর্জিও

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

3
@ মার্টিন বা: মূলত হ্যাঁ ঝুঁকিপূর্ণ পয়েন্টার, বাফার ওভারফ্লো, অবিচ্ছিন্ন পয়েন্টার, পয়েন্টার গাণিতিকের ত্রুটিগুলি, ম্যানুয়াল মেমরি পরিচালনা ব্যতীত যে সমস্ত কিছুই কেবল অস্তিত্ব নেই। এবং মেমরি অ্যাক্সেসকে অনুকূল করে তোলার জন্য আপনাকে অনেকগুলি ম্যানুয়াল মেমরি পরিচালনা করতে হবে।
মাইকেল বর্গওয়ার্ট

1
জাভাতে আপনি বেশ কয়েকটি জিনিস করতে পারেন। একটি হ'ল অবজেক্ট পুলিং, যা বস্তুর সম্ভাবনা মেমরির লোকালিকে সর্বাধিক করে তোলে (সি ++ এর বিপরীতে যেখানে এটি মেমরির স্থানীয়তার গ্যারান্টি দিতে পারে)।
রকএল

5

[...] (মাইক্রোসেকেন্ড পরিবেশে অনুমোদিত) [...]

আমরা যদি কয়েক মিলিয়ন থেকে কোটি কোটি জিনিস লুপ করে থাকি তবে মাইক্রো-সেকেন্ড যুক্ত হয়। সি ++ (ব্যক্তিগতভাবে কোনও অ্যালগরিদমিক উন্নতি নেই) থেকে একটি ব্যক্তিগত ভিটিউন / মাইক্রো-অপ্টিমাইজেশন সেশন:

T-Rex (12.3 million facets):
Initial Time: 32.2372797 seconds
Multithreading: 7.4896073 seconds
4.9201039 seconds
4.6946372 seconds
3.261677 seconds
2.6988536 seconds
SIMD: 1.7831 seconds
4-valence patch optimization: 1.25007 seconds
0.978046 seconds
0.970057 seconds
0.911041 seconds

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

মেমরি দক্ষতার অপ্টিমাইজ করা প্রায়শই যেকোন সময় থেকে একক থ্রেডযুক্ত প্রেক্ষাপটে বিশাল আকারের অর্ডারগুলিতে এবং মাল্টিথ্রেডযুক্ত প্রসঙ্গে আরও অনেকগুলি সহায়তা করতে পারে (দক্ষ মেমরির প্রতিনিধির সুবিধাগুলি প্রায়শই মিশ্রণের একাধিক থ্রেডের সাথে গুণ করে)।

মাইক্রো-অপটিমাইজেশনের গুরুত্বের উপর

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

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

আলগোরিদিম

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

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

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

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

জাভা ভাল মাইক্রো-অপ্টিমাইজেশনের জন্য প্রচুর ঘর ফেলেছে

ভাই, দুঃখিত - এই ধরণের অভিমানের পাশাপাশি:

JVM এর "যাদু" জাভাতে মাইক্রো-অপটিমাইজেশনের উপর কোনও প্রোগ্রামারের প্রভাবকে বাধা দেয়?

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

জাভাতে আর কোথাও পৌঁছানো অসম্ভব যদি আপনি বলেন, কোনও Pixelবস্তু তৈরি করেছেন (এটি একা পিক্সেলের আকার 4 বাইট থেকে 16 বিট পর্যন্ত 64-বিট বাড়িয়ে তুলবে)।

আপনি যদি Pixelবস্তুটি এড়িয়ে যান , বাইটের একটি অ্যারে ব্যবহার করেন এবং কোনও Imageবস্তুকে মডেল করেন তবে আপনি সম্ভবত পুরোটা খুব কাছাকাছি পেতে সক্ষম হতে পারেন । জাভা এখনও সেখানে বেশ দক্ষ যদি আপনি সরল পুরানো ডেটার অ্যারে ব্যবহার শুরু করেন। আমি জাভাতে আগে এই ধরণের জিনিসগুলি চেষ্টা করেছি এবং বেশ প্রভাবিত হয়েছি তবে আপনি যে কোনও জায়গায় ছোট ছোট কিশোর বস্তুগুলি যে কোনও জায়গার চেয়ে স্বাভাবিকের চেয়ে 4 গুণ বড় (উদাহরণস্বরূপ: intপরিবর্তে ব্যবহার করুন Integer) তৈরি করবেন না এবং বাল্কের ইন্টারফেসগুলির মতো মডেলিং শুরু করবেন না providedImage ইন্টারফেস, ইন্টারফেস নয় Pixel। এমনকি আপনি যদি বলতে পারেন যে জাভা সি ++ পারফরম্যান্সকে প্রতিদ্বন্দ্বিতা করতে পারে তবে যদি আপনি সরল পুরানো ডেটা লুপ করেন এবং অবজেক্টস না ( floatযেমন বিশাল অ্যারে , যেমন না Float))

মেমরির আকারগুলির চেয়ে আরও গুরুত্বপূর্ণ এটি হ'ল একটি অ্যারে intএকটি প্রতিনিধিত্বমূলক প্রতিনিধিত্বের গ্যারান্টি দেয়। একটি অ্যারে Integerনা। রেফারেন্সের স্থানীয়তার জন্য প্রায়শই সাবলীলতা আবশ্যক, কারণ এর অর্থ একাধিক উপাদান (উদা: ১ intsall) সমস্ত একক ক্যাশে লাইনে ফিট করতে পারে এবং দক্ষ মেমরি অ্যাক্সেস প্যাটার্নগুলির সাথে উচ্ছেদের আগে সম্ভাব্যভাবে একসাথে অ্যাক্সেস করা যেতে পারে। ইতিমধ্যে কোনও একক Integerস্মৃতিতে অন্য কোথাও আটকে থাকতে পারে পার্শ্ববর্তী স্মৃতি অপ্রাসঙ্গিক, কেবলমাত্র 16 টি পূর্ণসংখ্যার বিপরীতে উচ্ছেদের পূর্বে একটি একক পূর্ণসংখ্যার ব্যবহারের জন্য কেবল মেমরির অঞ্চলটি ক্যাশে লাইনে লোড করা হয়। এমনকি যদি আমরা দুর্দান্তভাবে ভাগ্যবান এবং চারপাশে পেয়েছিIntegersমেমরির ক্ষেত্রে একে অপরের পাশে ঠিক ছিলাম, আমরা কেবল 4 টি ক্যাশে লাইনে ফিট করতে পারি Integerযা 4 গুণ বড় হওয়ার ফলস্বরূপ উচ্ছেদের আগে অ্যাক্সেস করা যায় এবং এটি সর্বোত্তম ক্ষেত্রে রয়েছে।

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

আমি সম্প্রতি সি ++ এ পড়েছি কখনও কখনও ডেটা সদস্যদের ক্রমটি অপ্টিমাইজেশন সরবরাহ করতে পারে [...]

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

যদি তা না হয় তবে লোকেরা জাভাতে আপনি কী কৌশল ব্যবহার করতে পারেন তার উদাহরণ দিতে পারে (সাধারণ সংকলক পতাকা ছাড়াও)।

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

অ-সমজাতীয় ক্ষেত্রগুলি জুড়ে মেমরি লেআউটের স্বাতন্ত্র্য নিয়ন্ত্রণ করতে সি ++ এ কিছুটা সহজ easier জাভায় যখন জিসির মাধ্যমে অবজেক্টগুলি বরাদ্দ করা হয়।

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

পার্থক্য আরো বেশ একটু পরিবর্তিত হতে যদি আপনি কেবল "ভালো" পারফরম্যান্সের জন্য পৌঁছনো হয় - মত ছোট বস্তুর সঙ্গে যতটা না করতে পারবে না Integerবনাম intবিশেষত উপায় এটা জেনেরিক্স সাথে মিথস্ক্রিয়া সঙ্গে একটি Pita একটি বিট আরো হতে পারে, । এটা তোলে জাভা একটি কেন্দ্রীয় অপ্টিমাইজেশান লক্ষ্য শুধু বিল্ড এক জেনেরিক ডাটা স্ট্রাকচার করার জন্য একটি বিট কঠিন যে জন্য কাজ int, floatইত্যাদি যখন ঐ বড় এবং ব্যয়বহুল UDTs এড়ানো, কিন্তু প্রায়ই সবচেয়ে কর্মক্ষমতা-সমালোচনামূলক এলাকায় হাত-রোলিং আপনার নিজের ডাটা স্ট্রাকচার প্রয়োজন হবে যাইহোক যাইহোক একটি খুব নির্দিষ্ট উদ্দেশ্যে সুরযুক্ত তাই এটি কেবল কোডের জন্য বিরক্তিকর যা ভাল পারফরম্যান্সের জন্য চেষ্টা করছে তবে পিক পারফরম্যান্সের জন্য নয়।

ওভারহেড অবজেক্ট

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

যদি কেউ এই অংশ সম্পর্কে সন্দেহ অনুভব করেন তবে আমি এক মিলিয়ন র্যান্ডম intsবনাম দশ মিলিয়ন র্যান্ডম যোগফলের মাঝে একটি বার্তা তৈরি করার পরামর্শ দিচ্ছি এবং Integersবারবার এটি করার জন্য ( Integersপ্রাথমিক জিসি চক্রের পরে স্মৃতিতে রদবদল হবে)।

চূড়ান্ত ট্রিক: ইন্টারফেস ডিজাইনগুলি অনুকূলিতকরণের জন্য ঘর ছেড়ে দেয়

সুতরাং চূড়ান্ত জাভা ট্রিক হিসাবে আমি এটি দেখতে পাচ্ছি যদি আপনি এমন কোনও জায়গার সাথে কথা বলছেন যা ছোট ছোট বস্তুর উপর ভারী বোঝা পরিচালনা করে (উদা: একটি Pixel, একটি 4-ভেক্টর, 4x4 ম্যাট্রিক্স, একটি Particle, সম্ভবত এমনকি Accountযদি এটিতে কেবল কয়েকটি ছোট থাকে) ক্ষেত্রগুলি) এই কিশোর জিনিসগুলির জন্য অবজেক্টগুলি ব্যবহার এড়াতে এবং প্লেইন পুরানো ডেটার অ্যারেগুলি (সম্ভবত এক সাথে বেড়ানো) ব্যবহার করা। বস্তুগুলি তারপরে Image, ম্যাট্রিক বা ভেক্টর ইত্যাদির সংগ্রহ যেমন , সংগ্রহের ইন্টারফেসে পরিণত হয় ParticleSystem, Accountsপৃথকগুলি সূচক দ্বারা অ্যাক্সেস করা যায়, উদাহরণস্বরূপ এটি সি এবং সি ++ এর চূড়ান্ত নকশার কৌশলগুলির মধ্যে একটি, যেহেতু সেই মৌলিক অবজেক্ট ছাড়াই এবং একচেটিয়া কণার স্তরে ইন্টারফেসকে মডেলিং করা মঞ্জুরিযুক্ত না হওয়া, সবচেয়ে কার্যকর সমাধানগুলিকে বাধা দেয়।


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

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

1
ঠিক আছে, আমি কেবল লক্ষ্য করেছি কারণ জিনিসগুলি সত্যই ধীর। এবং আমি প্রত্যেকের সাথে আমার সময় নিয়েছি।
উত্সাহক

আমি সত্যিই ভাবছি কেন user204677চলে গেলেন। এমন দুর্দান্ত উত্তর
অলিগোফ্রেন

3

একদিকে মাইক্রো অপটিমাইজেশন এবং অন্যদিকে অ্যালগরিদমের ভাল পছন্দের মধ্যে একটি মাঝারি ক্ষেত্র রয়েছে।

এটি ধ্রুবক-গুণক গতিরোধের ক্ষেত্র এবং এটি আকারের ক্রম অর্জন করতে পারে।
এটি করার উপায়টি হ'ল প্রথম 30% এর মতো মৃত্যুদন্ড কার্যকর করার সময়টির পুরো ভগ্নাংশটি বন্ধ করে দেওয়া, তারপরে যা বাকী থাকে তার 20%, তার মধ্যে 50% এবং এরকম কিছু পুনরাবৃত্তির জন্য, যতক্ষণ না খুব কমই কিছু থাকে।

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

সাধারণত স্পিডআপগুলিতে এই জাতীয় জিনিস থাকে:

  • কল কমানো newপুরানো অবজেক্টগুলিকে পুলিং এবং পুনরায় ব্যবহার করে

  • সেখানে প্রয়োজনীয় জিনিসগুলি স্বীকৃতি প্রদান করা যা সাধারণ প্রয়োজনের পরিবর্তে সেখানে সাধারণভাবে করা প্রয়োজন,

  • একইসাথে বিগ-ও আচরণযুক্ত বিভিন্ন সংগ্রহের ক্লাস ব্যবহার করে ডেটা স্ট্রাকচারকে সংশোধন করা তবে বাস্তবে ব্যবহৃত অ্যাক্সেসিং প্যাটার্নগুলির সুবিধা গ্রহণ করুন,

  • ফাংশনটিকে পুনরায় কল করার পরিবর্তে ফাংশন কলগুলির দ্বারা অর্জিত তথ্য সংরক্ষণ করা (সংক্ষেপে নামযুক্ত ফাংশনগুলি দ্রুত সম্পাদন করে program এমন ধারণা করা প্রোগ্রামারদের একটি প্রাকৃতিক এবং মজাদার প্রবণতা is)

  • অপ্রয়োজনীয় ডেটা স্ট্রাকচারের মধ্যে নির্দিষ্ট পরিমাণের অসঙ্গতি সহ্য করা, বিজ্ঞপ্তি ইভেন্টগুলির সাথে পুরোপুরি সামঞ্জস্য রাখার চেষ্টা করার বিপরীতে,

  • ইত্যাদি ইত্যাদি

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


2

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

বিদ্যমান অনিরাপদ শ্রেণি যা আপনাকে সি / সি ++ এর নমনীয়তা দেয় তবে সি / সি ++ এর বিপদ নিয়েও।

এটি আপনাকে আপনার কোডের জন্য জেভিএম উত্পন্ন সংসদীয় কোডটি দেখতে সহায়তা করতে পারে

এই জাতীয় বিশদটি দেখায় এমন একটি জাভা অ্যাপ্লিকেশনটি পড়তে LMAX দ্বারা প্রকাশিত বিপর্যয়কর কোডটি দেখুন


2

এই প্রশ্নের উত্তর দেওয়া খুব কঠিন, কারণ এটি ভাষা বাস্তবায়নের উপর নির্ভর করে।

সাধারণভাবে আজকাল এই জাতীয় "মাইক্রো অপ্টিমাইজেশন" এর খুব কম জায়গা রয়েছে। মূল কারণ হ'ল সংকলনের সময় সংকলকরা এই জাতীয় অপ্টিমাইজেশনের সুবিধা গ্রহণ করে। উদাহরণস্বরূপ প্রাক-ইনক্রিমেন্ট এবং পোস্ট-ইনক্রিমেন্ট অপারেটরগুলির মধ্যে যেখানে শব্দার্থবিজ্ঞানের অভিন্নতা রয়েছে তার মধ্যে পারফরম্যান্সের পার্থক্য নেই। আর একটি উদাহরণ উদাহরণস্বরূপ এটির মতো একটি লুপ হবে for(int i=0; i<vec.size(); i++)যেখানে কেউ যুক্তি জানাতে পারে তার পরিবর্তেsize()প্রতিটি পুনরাবৃত্তির সময় সদস্য ফাংশন লুপের আগে ভেক্টরের আকার পাওয়া ভাল হবে এবং তারপরে সেই একক ভেরিয়েবলের সাথে তুলনা করা এবং এভাবে পুনরাবৃত্তির জন্য কলটি এড়ানো এড়ানো ভাল। যাইহোক, এমন কেস রয়েছে যেখানে একটি সংকলক এই নির্বোধ কেসটি সনাক্ত করবে এবং ফলাফলটি ক্যাশে করবে। তবে এটি কেবল তখনই সম্ভব যখন ফাংশনটির কোনও পার্শ্ব-প্রতিক্রিয়া নেই এবং সংকলকটি নিশ্চিত হতে পারে যে লুপের সময় ভেক্টরের আকার স্থির থাকে তাই এটি কেবল মোটামুটি মামুলি ক্ষেত্রে প্রযোজ্য।


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

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

2
@ লাই রায়ান: সাধারণ ক্ষেত্রে অনস্বীকার্য এমন অনেক কিছুই সুনির্দিষ্ট তবে সাধারণ মামলার জন্য পুরোপুরি সিদ্ধান্ত নেওয়া যায় এবং এখানে আপনার যা প্রয়োজন তা সত্যই।
মাইকেল বর্গওয়ার্ট

@ লাইরিয়ান যদি আপনি কেবল constএই ভেক্টরটিতে পদ্ধতিগুলি কল করেন তবে আমি নিশ্চিত যে অনেক অপ্টিমাইজ করা সংকলকরা এটি বের করে ফেলবে।
কে.স্টেফ

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

1

লোকেরা জাভাতে আপনি কী কৌশল ব্যবহার করতে পারেন তার উদাহরণ দিতে পারে (সাধারণ সংকলক পতাকা ছাড়াও)।

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

1000x1000 ints এর অ্যারে অ্যাক্সেস করতে জাভা উদাহরণ

নীচের নমুনা কোডটি বিবেচনা করুন - এটি মেমরির একই ক্ষেত্রটি (ints এর 1000x1000 অ্যারে) অ্যাক্সেস করে, তবে ভিন্ন ক্রমে। আমার ম্যাক মিনিতে (কোর আই 7, ২.7 গিগাহার্টজ) আউটপুট নীচে দেওয়া হয়েছে, যা দেখায় যে সারি দ্বারা অ্যারে অতিক্রম করে পারফরম্যান্স দ্বিগুণ হয় (প্রতিটি গড়ে ১০০ এরও বেশি)।

Processing columns by rows*** took 4 ms (avg)
Processing rows by columns*** took 10 ms (avg) 

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

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

নমুনার কোড:

  package test;

  import java.lang.*;

  public class PerfTest {
    public static void main(String[] args) {
      int[][] numbers = new int[1000][1000];
      long startTime;
      long stopTime;
      long elapsedAvg;
      int tries;
      int maxTries = 100;

      // process columns by rows 
      System.out.print("Processing columns by rows");
      for(tries = 0, elapsedAvg = 0; tries < maxTries; tries++) {
       startTime = System.currentTimeMillis();
       for(int r = 0; r < 1000; r++) {
         for(int c = 0; c < 1000; c++) {
           int v = numbers[r][c]; 
         }
       }
       stopTime = System.currentTimeMillis();
       elapsedAvg += ((stopTime - startTime) - elapsedAvg) / (tries + 1);
      }

      System.out.format("*** took %d ms (avg)\n", elapsedAvg);     

      // process rows by columns
      System.out.print("Processing rows by columns");
      for(tries = 0, elapsedAvg = 0; tries < maxTries; tries++) {
       startTime = System.currentTimeMillis();
       for(int c = 0; c < 1000; c++) {
         for(int r = 0; r < 1000; r++) {
           int v = numbers[r][c]; 
         }
       }
       stopTime = System.currentTimeMillis();
       elapsedAvg += ((stopTime - startTime) - elapsedAvg) / (tries + 1);
      }

      System.out.format("*** took %d ms (avg)\n", elapsedAvg);     
    }
  }

1

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

এক বিপর্যয়কারী লেখকের এই বিষয়ের উপর একটি উচ্চ তথ্যবহুল ব্লগ পড়ার প্রস্তাব দেওয়া হচ্ছে:

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

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