কিভাবে জাভা প্রোগ্রাম কার্যকর করার গতি সময়


85

জাভা প্রোগ্রাম কার্যকর করার সময় আপনি কীভাবে ব্যবহার করেন? আমি নিশ্চিত না যে এটি করার জন্য আমার কোন ক্লাসটি ব্যবহার করা উচিত।

আমি কিন্ডার মতো কিছু খুঁজছি:

// Some timer starts here
for (int i = 0; i < length; i++) {
  // Do something
}
// End timer here

System.out.println("Total execution time: " + totalExecutionTime);

উত্তর:


139
final long startTime = System.currentTimeMillis();
for (int i = 0; i < length; i++) {
  // Do something
}
final long endTime = System.currentTimeMillis();

System.out.println("Total execution time: " + (endTime - startTime));

4
এটি আসলে ন্যানোটাইম হওয়া উচিত
ইউজিন

6
ন্যানোটাইম হওয়া উচিত নয়। Rhu এর উত্তর দেখুন।
ফেবস্প্রো

4
আপনি এখানে "চূড়ান্ত" ব্যবহারের কোন বিশেষ কারণ আছে? আপনি কীওয়ার্ডটি বাদ দিলে কী আলাদা হবে?
dijxtra

9
@ ডিজজট্রা ব্যবহার করে finalএমন সুবিধা রয়েছে যা আপনি দুর্ঘটনাক্রমে এটি বরাদ্দ করতে পারবেন না (পাশাপাশি অন্যান্য সুবিধাগুলি যেমন বেনাম শ্রেণীর অ্যাক্সেস ইত্যাদি)। এই কোডে এটি কোনও পার্থক্য করবে না। এটি সবকিছু তৈরি করা finalএবং finalআপনার প্রয়োজন হলে কেবল এটি নিষ্ক্রিয় করা মোটামুটি সাধারণ অভ্যাস ।
wchargin

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

34

কিছু বিষয় আছে যেখানে সচেতন থাকুন System#nanoTime() অতিবাহিত সময় রেকর্ড করার জন্য মাল্টি-কোর সিপিইউতে নির্ভরযোগ্যভাবে ব্যবহার করা যায় না ... প্রতিটি কোর নিজস্ব টিএসসি বজায় রেখেছে ( টাইম স্ট্যাম্প কাউন্টার) ) : এই কাউন্টারটি ন্যানো সময় পাওয়ার জন্য ব্যবহৃত হয় (সত্যই এটি সিপিইউ বুট করার পরে টিক্সের সংখ্যা)।

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

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

এছাড়াও, System#nanoTime()ভার্চুয়ালবক্স পরিবেশে জাভা ব্যবহার করার সময় (এএফএআইকি) একটি এখনও পর্যন্ত অব্যবহিত বাগ রয়েছে ; java.util.concurrencyপ্যাকেজটির বেশিরভাগ অংশ ন্যানো সময়ের উপর নির্ভর করে আমাদের জন্য সমস্ত ধরণের উদ্ভট অন্তর থ্রেডিং সমস্যা সৃষ্টি করে ।

আরো দেখুন:

System.nanoTime () কি সম্পূর্ণ অকেজো? http://vbox.innotek.de/pipermail/vbox-trac/2010- জানুয়ারী/135631.html


9

আপনি বর্তমান সিস্টেমের সময়টি মিলিসেকেন্ডে পান:

final long startTime = System.currentTimeMillis();

তারপরে আপনি যা করতে যাচ্ছেন তা করুন:

for (int i = 0; i < length; i++) {
  // Do something
}

তারপরে আপনি দেখতে পাচ্ছেন যে এটি কতক্ষণ নিল:

final long elapsedTimeMillis = System.currentTimeMillis() - startTime;

বালাসসির উত্তরও সঠিক; এটি প্রয়োজনীয় টাইমার রেজোলিউশনের উপর নির্ভর করে এবং আপনার সময় কেন প্রয়োজন।
জোনাথন ফেইনবার্গ

9

আপনি এর ব্যবহার করতে পারেন System#nanoTime()। মৃত্যুদন্ড কার্যকর করার আগে এবং পরে এটি পান এবং কেবল গণিত করুন। এটি উপরে পছন্দসই System#currentTimeMillis()কারণ এটির আরও ভাল নির্ভুলতা রয়েছে। ব্যবহৃত হার্ডওয়্যার এবং প্ল্যাটফর্মের উপর নির্ভর করে আপনি অন্যথায় বিচ্ছিন্ন সময়ে একটি ভুল ফাঁক পেতে পারেন। এখানে উইন্ডোজটিতে কোর 2 ডুও সহ প্রায় 0 থেকে 15 ডলার মধ্যে কোনও কিছুই গণনা করা যায় না।

আরও উন্নত সরঞ্জাম একটি প্রোফাইলার


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

4
nanoTime()একটি সমস্যা আছে (কমপক্ষে উইন্ডোজে); টাইমস্ট্যাম্প প্রসেসরের কোরের সাথে নির্দিষ্ট। আমার একটি প্রোগ্রাম ছিল যা একটি নেতিবাচক প্রয়োগের সময় পেয়েছিল কারণ এটি একটি কোরটিতে "স্টার্ট" টাইমস্ট্যাম্প এবং অন্য কোরটিতে "স্টপ" টাইমস্ট্যাম্প পেয়েছিল।
gustafc

3

সাধারণ স্টাফের জন্য, সিস্টেম.কন্ট্রেন্টটাইমমিলিস () কাজ করতে পারে।

এটি আসলে এত সাধারণ যে আমার আইডিই সেটআপ হয় যাতে "t0" প্রবেশের পরে এটি আমাকে নীচের লাইনটি তৈরি করে:

final long t0 = System.currentTimeMillis()

তবে আরও জটিল জিনিসের জন্য আপনি সম্ভবত এখানে পরিসংখ্যান সংক্রান্ত সময় পরিমাপ ব্যবহার করতে চাইবেন (কিছুটা নিচে স্ক্রোল করুন এবং স্ট্যান্ডার্ড বিচ্যুতি ইত্যাদি সহ প্রকাশিত সময়ের পরিমাপগুলি দেখুন):

http://perf4j.codehaus.org/devguide.html


অটো-জেনারেটর কোডটি নির্দেশ করার জন্য +1। আমি সর্বদা একটি অনুরূপ বিবৃতি ব্যবহার করি, এবং কোড টেমপ্লেট সন্নিবেশ সম্পর্কে জানতাম না। এটি কীভাবে গ্রহন সহ কীভাবে করবেন তা সন্ধান করেছেন এবং এটি অবশ্যই সহায়তা করবে!
জেসন

সমস্ত কোডহাস পরিষেবা বন্ধ করা হয়েছে। আপনার লিঙ্কটি এখন ভেঙে গেছে।
naXa

2

এওপি / অ্যাসপেক্টজে এবং জ্যাকবি-দিকগুলি@Loggable থেকে টিকাটি ব্যবহার করে আপনি এটি সহজ এবং কমপ্যাক্ট করতে পারেন:

@Loggable(Loggable.DEBUG)
public String getSomeResult() {
  // return some value
}

এই পদ্ধতির প্রতিটি কল DEBUGলগিং স্তরের সাথে এসএলএফ 4 জে লগিং সুবিধাতে প্রেরণ করা হবে । এবং প্রতিটি লগ বার্তা কার্যকর করার সময় অন্তর্ভুক্ত করবে।


2

জাভায় মৃত্যুদন্ড কার্যকর করার সময়টি খুঁজে পাওয়ার কয়েকটি উপায় এখানে রয়েছে:

1) System.nanoTime ()

long startTime = System.nanoTime();
.....your code....
long endTime   = System.nanoTime();
long totalTime = endTime - startTime;
System.out.println("Execution time in nanoseconds  : " + totalTime);
System.out.println("Execution time in milliseconds : " + totalTime / 1000000);

2) সিস্টেম.কালিনটাইমমিলিস ()

long startTime = System.currentTimeMillis();
.....your code....
long endTime = System.currentTimeMillis();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds  : " + totalTime);

3) ইনস্ট্যান্ট.নো ()

long startTime = Instant.now().toEpochMilli();
.....your code....
long endTime = Instant.now().toEpochMilli();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds: " + totalTime);

বা

Instant start = Instant.now();
.....your code....
Instant end = Instant.now();
Duration interval = Duration.between(start, end);
System.out.println("Execution time in seconds: " +interval.getSeconds());

4) তারিখ.সেটটাইম ()

long startTime = new Date().getTime();
.....your code....
long endTime = new Date().getTime();
long totalTime = endTime - startTime;
System.out.println("Execution time in milliseconds: " + totalTime);

1

startTime=System.currentTimeMillis()লুপের শীর্ষে, শুরুর সময়ের জন্য দীর্ঘ ব্যবহার করুন

করা long endTime= System.currentTimeMillis();লুপ শেষে বাইরে। রানটাইমটি মিলি সেকেন্ডে পেতে আপনাকে মানগুলি বিয়োগ করতে হবে।

আপনি যদি ন্যানোসেকেন্ডে সময় চান তবে দেখুন System.nanoTime()


1

আমি একটি উচ্চতর অর্ডার ফাংশন তৈরি করেছি যা আপনি ল্যাম্বডায় / হিসাবে মাপতে চান এমন কোড গ্রহণ করে:

class Utils {

    public static <T> T timeIt(String msg, Supplier<T> s) {
        long startTime = System.nanoTime();
        T t = s.get();
        long endTime = System.nanoTime();
        System.out.println(msg + ": " + (endTime - startTime) + " ns");
        return t;
    }

    public static void timeIt(String msg, Runnable r) {
       timeIt(msg, () -> {r.run(); return null; });
    }
}

এটিকে কল করুন:

Utils.timeIt("code 0", () ->
        System.out.println("Hallo")
);

// in case you need the result of the lambda
int i = Utils.timeIt("code 1", () ->
        5 * 5
);

আউটপুট:

কোড 0: 180528 এনএস
কোড 1: 12003 এনএস

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



0

আপনি চেষ্টা করতে পারেন Perf4J। এটি আপনি যা সন্ধান করছেন তা করার একটি ঝরঝরে উপায় এবং এক নির্ধারিত সময়ের মধ্যে গড়, ন্যূনতম, সর্বাধিক, স্ট্যান্ডার্ড বিচ্যুতি এবং প্রতি সেকেন্ডে লেনদেনের মতো সামগ্রিক পারফরম্যান্সের পরিসংখ্যানগুলিতে সহায়তা করে। Http://perf4j.codehaus.org/devguide.html থেকে একটি নির্যাস :

StopWatch stopWatch = new LoggingStopWatch();

try {
    // the code block being timed - this is just a dummy example
    long sleepTime = (long)(Math.random() * 1000L);
    Thread.sleep(sleepTime);
    if (sleepTime > 500L) {
        throw new Exception("Throwing exception");
    }

    stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms");
} catch (Exception e) {
    stopWatch.stop("codeBlock2.failure", "Exception was: " + e);
}

আউটপুট:

INFO: start[1230493236109] time[447] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493236719] time[567] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493237286] time[986] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493238273] time[194] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238467] time[463] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493238930] time[310] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239241] time[610] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]
INFO: start[1230493239852] time[84] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239937] time[30] tag[codeBlock2.success] message[Sleep time was < 500 ms]
INFO: start[1230493239968] time[852] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]

0
public class someClass
{
   public static void main(String[] args) // your app start point
   {
       long start = java.util.Calendar.getInstance().getTimeInMillis();

       ... your stuff ...

       long end = java.util.Calendar.getInstance().getTimeInMillis();
       System.out.println("it took this long to complete this stuff: " + (end - start) + "ms");
   }
}

0

সিস্টেম কন্ট্রোনটাইমমিলিস () ব্যবহার করা এটি করার সঠিক উপায় way তবে, আপনি যদি কমান্ড লাইন ব্যবহার করেন এবং আপনি পুরো প্রোগ্রামটি প্রায় এবং দ্রুত সময়ের সাথে দেখতে চান তবে এই সম্পর্কে চিন্তা করুন:

time java App

যা আপনাকে আপনার অ্যাপ্লিকেশন কোড এবং সময় পরিবর্তন করতে না দেয়।


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