برنامه را با ورودیهای 4 و 7 و 9 اجرا میکنیم و میفهمیم که تابع temp
بیشترین زمان اجرا را دارد:
همچنین میفهمیم که تابع add
بیشترین زمان اجرا را گرفته که به دلیل داینامیک بودن 'ArrayList' زیاد طول میکشد. همچنین به مشکل کمبود حافظه هم خوردیم.
بجای آنکه از آرایه داینامیک استفاده کنیم، از آرایه با اندازه ثابت استفاده میکنیم. چون اندازه آرایهای که در این تابع وجود دارد ثابت است.
int[] a = new int[10000 * 20000];
int index = 0;
for (int i = 0; i < 10000; i++)
{
for (int j = 0; j < 20000; j++) {
a[index] = i + j;
index++;
}
}
حال میبینیم که میزان استفاده CPU و زمان اجرا خیلی بهتر شده است و اینکه به مشکل هم نخوردیم و برنامه با موفقیت اجرا میشود.
برای این سوال کدی را نوشتیم که اعداد اول از 1 تا 10000 را پیدا کند. کد زیر کد اولیه است(PrimeCalculator.java
):
public class PrimeCalculator {
public static void main(String[] args) {
final int UPPER_LIMIT = 10000;
printPrimeNumbers(UPPER_LIMIT);
}
private static void printPrimeNumbers(int upperLimit) {
System.out.println("First prime numbers up to " + upperLimit + ":");
for (int number = 2; number <= upperLimit; number++) {
if (checkPrime(number)) {
System.out.print(number + " ");
}
}
}
private static boolean checkPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i < num; i++) {
if (multipleFound(num, i)) return false;
}
return true;
}
private static boolean multipleFound(int num, int factor) {
for (int j = 1; j <= factor; j++) {
if (factor * j == num) {
return true;
}
}
return false;
}
}
شکلهای زیر عملکرد کد را نشان میدهند:
حال کد را به این شکل بهینه میکنیم که که فقط اعداد فرد را بررسی کند و اینکه تا جذر آن عدد هم بررسی میکنیم آیا عدد مورد نظر ما بر هیچکدام بخش پذیر است یا نه:
public class PrimeCalculator {
public static void main(String[] args) {
final int UPPER_LIMIT = 10000;
printPrimeNumbers(UPPER_LIMIT);
}
private static void printPrimeNumbers(int upperLimit) {
System.out.println("Prime numbers up to " + upperLimit + ":");
for (int number = 2; number <= upperLimit; number++) {
if (isPrime(number)) {
System.out.print(number + " ");
}
}
}
private static boolean isPrime(int num) {
if (num <= 1) return false;
if (num == 2) return true;
if (num % 2 == 0) return false;
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
مجدد کد را اجرا میکنیم و درمییابیم که در میزان مصرف CPU کاهش قابل توجهی داشتیم.