এক্সিকিউশন টাইম মেজারমেন্ট কী?
একটি প্রোগ্রাম বা মেথড চালানোর 데 কতसमয় লাগে তা মাপা। পারফরম্যান্স অ্যানালাইসিস, বেঞ্চমার্কিং এবং অপ্টিমাইজেশনের জন্য এটি অত্যন্ত গুরুত্বপূর্ণ।
জাভাতে টাইম মেজারমেন্টের পদ্ধতিগুলো
| মেথড | রেজোলিউশন | ব্যবহার |
| System.currentTimeMillis() | মিলিসেকেন্ড (১/১০০০ সেকেন্ড) | সাধারণ টাইমিং, দীর্ঘ আপারেশন |
| System.nanoTime() | ন্যানোসেকেন্ড (১/১,০০০,০০০,০০০ সেকেন্ড) | উচ্চ নির্ভুলতা, ছোট আপারেশন, বেঞ্চমার্ক |
| Instant.now() (Java 8+) | ন্যানোসেকেন্ড | মডার্ন API, টাইমজোন সাপোর্ট |
ইনপুট ও আউটপুট উদাহরণ
ইনপুট:
Run the program
আউটপুট:
The program is being executed:
The Execution time of the program is: 620872 nanoseconds
অ্যালগরিদম
- প্রোগ্রাম শুরু করুন
- তিনটি লং ভেরিয়েবল ঘোষণা করুন: my_start_time, my_end_time, my_execution_time
- শুরুতে System.nanoTime() কল করে my_start_time-এ স্টোর করুন
- প্রোগ্রাম/মেথড এক্সিকিউট করুন
- শেষে System.nanoTime() কল করে my_end_time-এ স্টোর করুন
- my_execution_time = my_end_time - my_start_time ক্যালকুলেট করুন
- ফলাফল প্রদর্শন করুন
- প্রোগ্রাম শেষ করুন
উদাহরণ ১: বেসিক টাইমিং
public class Main {
public static void main(String[] args) {
long my_start_time, my_end_time, my_execution_time;
my_start_time = System.nanoTime();
System.out.println("The program is being executed:");
my_end_time = System.nanoTime();
my_execution_time = my_end_time - my_start_time;
System.out.println("The Execution time of the program is: " + my_execution_time + " nanoseconds");
}
}
উদাহরণ ২: কোড ব্লক টাইমিং
public class Main {
public static void main(String[] args) {
long my_start_time, my_end_time, my_execution_time;
my_start_time = System.nanoTime();
int my_input_1 = 100;
int my_input_2 = 250;
int my_sum = my_input_1 + my_input_2;
System.out.println("The program is being executed:");
my_end_time = System.nanoTime();
my_execution_time = my_end_time - my_start_time;
System.out.println("The Execution time of the program is: " + my_execution_time + " nanoseconds");
}
}
বেশতর বাস্তব ব্যবহার: মেথড টাইমিং ইউটিলিটি
public class TimerUtil {
public static long measureTime(Runnable task) {
long start = System.nanoTime();
task.run();
long end = System.nanoTime();
return end - start;
}
public static T measureTimeWithResult(Callable task) throws Exception {
long start = System.nanoTime();
T result = task.call();
long end = System.nanoTime();
System.out.println("Execution time: " + (end - start) + " ns");
return result;
}
}
// ব্যবহার
long time = TimerUtil.measureTime(() -> {
// টেস্ট করার কোড
int sum = 0;
for (int i = 0; i < 1000000; i++) sum += i;
});
JMH (Java Microbenchmark Harness) - প্রোফেশনাল বেঞ্চমার্কিং
সঠিক বেঞ্চমার্কের জন্য JMH ব্যবহার করুন (JVM ওয়ার্ম-আপ, JIT কম্পাইলেশন, ডেড কোড এলিমিনেশন হ্যান্ডল করে):
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MyBenchmark {
@Benchmark
public void testMethod() {
// টেস্ট কোড
}
}
সাধারণ ভুল এড়ানোর টিপস
- System.currentTimeMillis() ব্যবহার করবেন না মাইক্রো-বেঞ্চমার্কের জন্য (রেজোলিউশন কম)
- Warm-up রান করুন JIT কম্পাইলেশন হওয়ার আগে ফলাফল নাবেন না
- ডেড কোড এলিমিনেশন এড়ান: রেজাল্ট ব্যবহার করুন (print বা return)
- গারবেজ কালেকশন: মেজারমেন্টের মাঝপথে GC হলে ফলাফল বिगড়ে যেতে পারে
- অ্যাবসোলিউট টাইমের বদলে রিলেটিভ কম্পের করুন (বেসলাইন বনাম অপ্টিমাইজড)
ফরম্যাটেড আউটপুট
long ns = end - start;
System.out.printf("Time: %,d ns = %.3f µs = %.3f ms%n",
ns, ns / 1_000.0, ns / 1_000_000.0);
উন্নত সংস্করণ: মাল্টিপল রান ও গড়
public static double averageTime(Runnable task, int runs) {
long total = 0;
for (int i = 0; i < runs; i++) {
long start = System.nanoTime();
task.run();
total += System.nanoTime() - start;
}
return (double) total / runs;
}