আমি জাভাতে নতুন, এবং গতরাতে কিছু কোড চালাচ্ছিলাম এবং এটি আমাকে সত্যিই বিরক্ত করেছিল। আমি লুপ জন্য একটি প্রতিটি এক্স আউটপুট প্রদর্শন করতে একটি সহজ প্রোগ্রাম তৈরী করতে লাগলেন, আর আমি কর্মক্ষমতা একটি বিশাল হ্রাস যখন আমি যেমন মডুলাস ব্যবহার লক্ষ্য variable % variable
বনাম variable % 5000
বা যে কোন বস্তু। কেউ আমাকে ব্যাখ্যা করতে পারেন যে এটি কেন এবং এর কারণ কী? তাই আমি আরও ভাল হতে পারি ...
এখানে "দক্ষ" কোডটি রয়েছে (দুঃখিত যদি আমি কিছুটা সিনট্যাক্স ভুল করে ফেলেছি তবে আমি এখনই কোডটি কম্পিউটারে নেই)
long startNum = 0;
long stopNum = 1000000000L;
for (long i = startNum; i <= stopNum; i++){
if (i % 50000 == 0) {
System.out.println(i);
}
}
এখানে "অদক্ষ কোড"
long startNum = 0;
long stopNum = 1000000000L;
long progressCheck = 50000;
for (long i = startNum; i <= stopNum; i++){
if (i % progressCheck == 0) {
System.out.println(i);
}
}
মনে মনে আমি পার্থক্যগুলি পরিমাপ করার জন্য আমার একটি তারিখের পরিবর্তনশীল ছিল এবং এটি যথেষ্ট দীর্ঘ হয়ে গেলে, প্রথমটিরটি 50 মিলিয়ন হয়ে যায় অন্যটি 12 সেকেন্ড বা এর মতো কিছু নেয়। আপনার পিসি আমার চেয়ে বেশি দক্ষ কিনা বা কী না তা আপনাকে বাড়িয়ে দিতে stopNum
বা হ্রাস করতে হতে পারে progressCheck
।
আমি ওয়েবে চারপাশে এই প্রশ্নটি চেয়েছিলাম, কিন্তু আমি কোনও উত্তর খুঁজে পাই না, সম্ভবত আমি এটি ঠিক জিজ্ঞাসা করছি না।
সম্পাদনা: আমি আমার প্রশ্নটি এত জনপ্রিয় হবে বলে আশা করিনি, আমি সমস্ত উত্তরগুলির প্রশংসা করি। আমি প্রতিটি অর্ধেক সময় নিয়ে একটি মানদণ্ড সম্পাদন করেছি এবং অকার্যকর কোডটি সেকেন্ড বনাম 10 সেকেন্ডের 1/4 / সেকেন্ডে যথেষ্ট সময় নিয়েছিল। নিশ্চিত যে তারা প্রিন্টলন ব্যবহার করছে, তবে তারা উভয়ই একই পরিমাণ করছে, তাই আমি ভাবতে পারি না যে এটি এটিকে অনেকটা কমিয়ে দেবে, বিশেষত যেহেতু এই তফাতটি পুনরাবৃত্তিযোগ্য। উত্তরগুলির ক্ষেত্রে, যেহেতু আমি জাভাতে নতুন, আমি এখনই ভোটগুলি সিদ্ধান্ত নিতে দেব যে উত্তরটি সবচেয়ে ভাল। আমি বুধবারের মধ্যে একটি বাছাই করার চেষ্টা করব।
সম্পাদনা 2: আমি আজ রাতে আরেকটি পরীক্ষা করতে যাচ্ছি, যেখানে মডুলাসের পরিবর্তে এটি কেবল একটি পরিবর্তনশীল বৃদ্ধি করে এবং যখন এটি প্রগ্রেস চেক এ পৌঁছায়, তখন এটি একটি সম্পাদন করবে, এবং তৃতীয় বিকল্পের জন্য 0 পরিবর্তন করতে হবে।
EDIT3.5:
আমি এই কোডটি ব্যবহার করেছি, এবং নীচে আমি আমার ফলাফলগুলি দেখাবো .. দুর্দান্ত সহায়তার জন্য আপনাকে সমস্ত ধন্যবাদ! আমি দীর্ঘ থেকে 0 এর সংক্ষিপ্ত মানটির তুলনা করার চেষ্টাও করেছি, সুতরাং আমার সমস্ত নতুন চেক এটিকে পুনরাবৃত্তিতে সমান করে তুলতে "65536" বার হয়।
public class Main {
public static void main(String[] args) {
long startNum = 0;
long stopNum = 1000000000L;
long progressCheck = 65536;
final long finalProgressCheck = 50000;
long date;
// using a fixed value
date = System.currentTimeMillis();
for (long i = startNum; i <= stopNum; i++) {
if (i % 65536 == 0) {
System.out.println(i);
}
}
long final1 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
//using a variable
for (long i = startNum; i <= stopNum; i++) {
if (i % progressCheck == 0) {
System.out.println(i);
}
}
long final2 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
// using a final declared variable
for (long i = startNum; i <= stopNum; i++) {
if (i % finalProgressCheck == 0) {
System.out.println(i);
}
}
long final3 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
// using increments to determine progressCheck
int increment = 0;
for (long i = startNum; i <= stopNum; i++) {
if (increment == 65536) {
System.out.println(i);
increment = 0;
}
increment++;
}
//using a short conversion
long final4 = System.currentTimeMillis() - date;
date = System.currentTimeMillis();
for (long i = startNum; i <= stopNum; i++) {
if ((short)i == 0) {
System.out.println(i);
}
}
long final5 = System.currentTimeMillis() - date;
System.out.println(
"\nfixed = " + final1 + " ms " + "\nvariable = " + final2 + " ms " + "\nfinal variable = " + final3 + " ms " + "\nincrement = " + final4 + " ms" + "\nShort Conversion = " + final5 + " ms");
}
}
ফলাফল:
- স্থির = 874 এমএস (সাধারণত 1000 মিমি প্রায়, তবে এটি 2 পাওয়ার শক্তি হওয়ার কারণে দ্রুত)
- পরিবর্তনশীল = 8590 এমএস
- চূড়ান্ত পরিবর্তনশীল = 1944 এমএস (50000 ব্যবহার করার সময় ms 1000ms ছিল)
- বৃদ্ধি = 1904 এমএস
- সংক্ষিপ্ত রূপান্তর = 679 এমএস
যথেষ্ট আশ্চর্যজনক নয়, বিভাগের অভাবের কারণে সংক্ষিপ্ত রূপান্তরটি "দ্রুত" পথে 23% দ্রুত ছিল was এটি লক্ষণীয় আকর্ষণীয়। আপনার যদি প্রতি 256 বার (বা সেখানে প্রায়) কিছু দেখাতে বা তুলনা করার দরকার হয় তবে আপনি এটি করতে পারেন এবং ব্যবহার করতে পারেন
if ((byte)integer == 0) {'Perform progress check code here'}
একটি ফাইনাল ইন্টারেস্টিং নোট, 65536 (একটি চমত্কার সংখ্যা নয়) সহ "ফাইনাল ঘোষিত ভেরিয়েবল" তে মডিউল ব্যবহার করে স্থির মানের চেয়ে ধীর গতি (ধীর) ছিল। যেখানে আগে এটি একই গতির কাছে বেঞ্চমার্কিং ছিল।
final
সামনে যুক্ত করি তবেprogressCheck
উভয়ই আবার একই গতিতে চলে। এটি আমাকে বিশ্বাস করতে পরিচালিত করে যে সংকলক বা জেআইটি যখন লুপটিprogressCheck
স্থির করে তা লুপটিকে অনুকূলিত করে তোলে is