দয়া করে আপডেট করা উত্তর এড়িয়ে যান ...
যাঁরা পারফরম্যান্সের বিষয়ে চিন্তা করেন তাদের জন্য System.out এড়িয়ে লুপটি 1 বাইটে সীমাবদ্ধ করুন। ডাবল (পরীক্ষা 1/2) ব্যবহার করে এবং স্ট্রিং (3/4) ব্যবহারের সময়টি উইন্ডোজ 7 প্রফেশনাল bit৪ বিট এবং জেডিকে-১.7.০.১১ এর সাথে মিলিসেকেন্ডে অতিবাহিত সময়গুলি নীচে দেওয়া হয়েছে। বাইটকোডগুলি (টেস্ট 1 এবং টেস্ট 2 এর জন্য নীচেও দেওয়া হয়েছে) এক নয়। আমি পরিবর্তনীয় এবং তুলনামূলকভাবে জটিল বিষয়গুলির সাথে পরীক্ষা করতে খুব অলস ছিলাম।
ডবল
টেস্ট 1 গ্রহণ করেছে: 2710 ম্যাসেকস
টেস্ট 2 নিয়েছে: 2790 ম্যাসেকস
স্ট্রিং (কেবল পরীক্ষার স্ট্রিংয়ের সাথে ডাবল প্রতিস্থাপন করুন)
টেস্ট 3 নিয়েছে: 1200 ম্যাসেকস
টেস্ট 4 নিয়েছে: 3000 ম্যাসেকস
সংকলন এবং বাইকোড পাচ্ছেন
javac.exe LocalTest1.java
javap.exe -c LocalTest1 > LocalTest1.bc
public class LocalTest1 {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
double test;
for (double i = 0; i < 1000000000; i++) {
test = i;
}
long finish = System.currentTimeMillis();
System.out.println("Test1 Took: " + (finish - start) + " msecs");
}
}
public class LocalTest2 {
public static void main(String[] args) throws Exception {
long start = System.currentTimeMillis();
for (double i = 0; i < 1000000000; i++) {
double test = i;
}
long finish = System.currentTimeMillis();
System.out.println("Test1 Took: " + (finish - start) + " msecs");
}
}
Compiled from "LocalTest1.java"
public class LocalTest1 {
public LocalTest1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: invokestatic #2 // Method java/lang/System.currentTimeMillis:()J
3: lstore_1
4: dconst_0
5: dstore 5
7: dload 5
9: ldc2_w #3 // double 1.0E9d
12: dcmpg
13: ifge 28
16: dload 5
18: dstore_3
19: dload 5
21: dconst_1
22: dadd
23: dstore 5
25: goto 7
28: invokestatic #2 // Method java/lang/System.currentTimeMillis:()J
31: lstore 5
33: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
36: new #6 // class java/lang/StringBuilder
39: dup
40: invokespecial #7 // Method java/lang/StringBuilder."<init>":()V
43: ldc #8 // String Test1 Took:
45: invokevirtual #9 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
48: lload 5
50: lload_1
51: lsub
52: invokevirtual #10 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
55: ldc #11 // String msecs
57: invokevirtual #9 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
60: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
63: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
66: return
}
Compiled from "LocalTest2.java"
public class LocalTest2 {
public LocalTest2();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Exception;
Code:
0: invokestatic #2 // Method java/lang/System.currentTimeMillis:()J
3: lstore_1
4: dconst_0
5: dstore_3
6: dload_3
7: ldc2_w #3 // double 1.0E9d
10: dcmpg
11: ifge 24
14: dload_3
15: dstore 5
17: dload_3
18: dconst_1
19: dadd
20: dstore_3
21: goto 6
24: invokestatic #2 // Method java/lang/System.currentTimeMillis:()J
27: lstore_3
28: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;
31: new #6 // class java/lang/StringBuilder
34: dup
35: invokespecial #7 // Method java/lang/StringBuilder."<init>":()V
38: ldc #8 // String Test1 Took:
40: invokevirtual #9 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
43: lload_3
44: lload_1
45: lsub
46: invokevirtual #10 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
49: ldc #11 // String msecs
51: invokevirtual #9 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
54: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
57: invokevirtual #13 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
60: return
}
উত্তর উত্তর
সমস্ত জেভিএম অপটিমাইজেশনের সাথে পারফরম্যান্সের তুলনা করা সত্যিই সহজ নয়। তবে এটি কিছুটা সম্ভব। গুগল ক্যালিপারে আরও ভাল পরীক্ষা এবং বিস্তারিত ফলাফল
- ব্লগে কিছু বিশদ: আপনার কি লুপের ভিতরে বা লুপের আগে পরিবর্তনশীল ঘোষণা করা উচিত?
- গিটহাবের সংগ্রহশালা: https://github.com/gunduru/jvdt
- ডাবল কেস এবং 100 এম লুপের পরীক্ষার ফলাফল (এবং হ্যাঁ সমস্ত জেভিএম বিবরণ): https://microbenchmark.appspot.com/runs/b1cef8d1-0e2c-4120-be61-a99faff625b4
- ঘোষিত আগে 1,759.209 এনএস
- ঘোষিত ইনসাইড 2,242.308 এনএস
দ্বিগুণ ঘোষণার জন্য আংশিক পরীক্ষার কোড
এটি উপরের কোডটির মতো নয়। যদি আপনি কেবল একটি ডামি লুপ কোড করেন ਜੇভিএম এড়িয়ে যায়, তাই কমপক্ষে আপনাকে কিছু বরাদ্দ করতে হবে এবং ফিরে আসতে হবে। ক্যালিপার ডকুমেন্টেশনে এটিও সুপারিশ করা হয়।
@Param int size; // Set automatically by framework, provided in the Main
/**
* Variable is declared inside the loop.
*
* @param reps
* @return
*/
public double timeDeclaredInside(int reps) {
/* Dummy variable needed to workaround smart JVM */
double dummy = 0;
/* Test loop */
for (double i = 0; i <= size; i++) {
/* Declaration and assignment */
double test = i;
/* Dummy assignment to fake JVM */
if(i == size) {
dummy = test;
}
}
return dummy;
}
/**
* Variable is declared before the loop.
*
* @param reps
* @return
*/
public double timeDeclaredBefore(int reps) {
/* Dummy variable needed to workaround smart JVM */
double dummy = 0;
/* Actual test variable */
double test = 0;
/* Test loop */
for (double i = 0; i <= size; i++) {
/* Assignment */
test = i;
/* Not actually needed here, but we need consistent performance results */
if(i == size) {
dummy = test;
}
}
return dummy;
}
সংক্ষিপ্তসার: ঘোষিতপূর্বগুলি আরও ভাল পারফরম্যান্সকে নির্দেশিত করে - অত্যন্ত ক্ষুদ্র- এবং এটি ক্ষুদ্রতম সুযোগের নীতির বিরুদ্ধে। জেভিএমের আসলে আপনার জন্য এটি করা উচিত