আমি জাভাতে কোনও পদ্ধতি কার্যকর করার সময় কীভাবে দেব?


834
  1. আমি কীভাবে কোনও পদ্ধতির প্রয়োগের সময় পেতে পারি?
  2. Timerকোনও কাজের জন্য কত সময় নেয় ইত্যাদি সময় নির্ধারণের মতো কাজের জন্য কি কোনও ইউটিলিটি ক্লাস রয়েছে?

গুগলে বেশিরভাগ অনুসন্ধান টাইমারের জন্য ফলাফলগুলি ফেরত দেয় যা থ্রেড এবং কার্যগুলি নির্ধারিত করে, যা আমি চাই না।


জামন এপিআই হ'ল একটি নিখরচায়, সাধারণ, উচ্চতর পারফরম্যান্স, থ্রেড নিরাপদ, জাভা এপিআই যা বিকাশকারীদের সহজেই উত্পাদন অ্যাপ্লিকেশনগুলির কর্মক্ষমতা এবং স্কেলিবিলিটি পর্যবেক্ষণ করতে দেয়। জ্যামন হিট, এক্সিকিউশন সময় (মোট, গড়, মিনিট, সর্বাধিক, স্ট্যান্ড ডেভ) এবং আরও অনেক কিছু ট্র্যাক করে। http://jamonapi.sourceforge.net/ ডাউনলোড: http://sourceforge.net/project/showfiles.php?group_id=96550
মাইক পোনে

1
আপনি অ্যাপাচি কমন্স ল্যাং স্টপওয়াচ ক্লাসটিও দেখতে চাইতে পারেন । একটি সাধারণ তবে দরকারী ইউটিলিটি ক্লাস।


হ্যাঁ, স্টপওয়াচ এটির জন্য দুর্দান্ত।
শুভম পান্ডে

জাভা 8 ব্যবহার Instantশ্রেণী: stackoverflow.com/a/30975902/1216775
akhil_mittal

উত্তর:


1207

পুরানো ধাঁচের উপায় সর্বদা রয়েছে:

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = (endTime - startTime);  //divide by 1000000 to get milliseconds.

233
আসলে, এটি "নতুন ধরণের" কারণ আপনি ন্যানোটাইম ব্যবহার করেছিলেন, যা জাভা
জন গার্ডনার

11
এটি (বা সিস্টেম.কন্ট্রেন্টটাইমমিলিস () ব্যবহার করে মনে হচ্ছে এটি সাধারণত জাভাতে যেভাবে করা হয়েছিল ... যা আমি যাইহোক দেখেছি। এটি এখনও আমাকে মৃদুভাবে আশ্চর্য করে যে টাইমার টি = নতুন টাইমার () এর মতো কোনও বিল্ট-ইন ক্লাস নেই class স্ট্রিং s = t.getElapsed (ফর্ম্যাট); ইত্যাদি ...
ওগরে গীতসংহিতা

18
ন্যানোটাইম কারেন্টটাইমমিলিস () এর চেয়ে নির্ভুলতার গ্যারান্টি দেয় না, যদিও এটি সাধারণত হয়। forums.sun.com/thread.jspa?messageID=9460663 এবং সিমংব্রাউন.
জেমস শেক

10
অবশ্যই, মাইক্রো-বেঞ্চমার্কিংয়ের সমস্যাগুলি স্মরণ করা সর্বদা গুরুত্বপূর্ণ, যেমন সংকলক / জেভিএম অপটিমাইজেশন যা ফলাফলকে বিকৃত করতে পারে = 8-)
যুবাল

18
শেষ পর্যন্ত ব্লকের প্রয়োজন নেই কারণ ব্যতিক্রম ছুঁড়ে ফেলা হলে এন্ডটাইম ব্যবহার করা হবে না।
পিটার লরে

197

আমি সহজ উত্তর সঙ্গে যেতে। আমার জন্য কাজ কর.

long startTime = System.currentTimeMillis();

doReallyLongThing();

long endTime = System.currentTimeMillis();

System.out.println("That took " + (endTime - startTime) + " milliseconds");

এটি বেশ ভাল কাজ করে। রেজোলিউশনটি অবশ্যই মিলিসেকেন্ডের পক্ষে, আপনি System.nanoTime () এর সাথে আরও ভাল করতে পারবেন। উভয়ের কিছু সীমাবদ্ধতা রয়েছে (অপারেটিং সিস্টেমের শিডিয়ুল স্লাইস ইত্যাদি) তবে এটি বেশ ভালভাবে কাজ করে।

কয়েক রানের জুড়ে গড় (আরও ভাল) এবং আপনি একটি শালীন ধারণা পাবেন।


51
প্রকৃতপক্ষে, সিস্টেম.কন্ট্রেন্টটাইমমিলিস () কেবল 15 মিমি উপরে accurate সত্যই নিম্ন মানের জন্য এটি বিশ্বাস করা যায় না। এর সমাধান (যেমন উল্লিখিত) হ'ল System.nanoTime ();
স্টিভ g

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

4
ন্যানোটাইম () বর্তমানের টাইমমিলিসের চেয়ে নির্ভুলতার গ্যারান্টি দেয় না, তবে অনেক জেভিএম বাস্তবায়নে ন্যানোটাইমের সাথে আরও ভাল নির্ভুলতা পাওয়া যায়।
জেমস শেক

5
@ জেমসচেক আপনার সত্যই আপনার শব্দটি দেখতে হবে, যেমন আমি ইতিমধ্যে অন্য কোথাও এই অভিন্ন মন্তব্যে উল্লেখ করেছি; অন্তত হিসাবে দৃolute় হিসাবে nanoTimeগ্যারান্টিযুক্ত হয় । docs.oracle.com/javase/7/docs/api/java/lang/…currentTimeMillis
b1nary.atr0phy

এর সামান্য সুবিধাটি currentTimeMillisহ'ল এটি একটি সত্যিকারের টাইমস্ট্যাম্প এবং এটি শুরু / শেষ সময়গুলি লগ করতে ব্যবহৃত হতে পারে, যখন nanoTime"কেবল সময় অতিবাহিত সময় পরিমাপ করতে ব্যবহৃত হতে পারে এবং এটি সিস্টেম বা প্রাচীর-ঘড়ির সময় সম্পর্কিত কোনও ধারণার সাথে সম্পর্কিত নয় । "
ব্র্যাড পার্কগুলি

177

চল সবাই! কেউই এটি করার পেয়ারা পদ্ধতির কথা উল্লেখ করেনি (যা তর্কাত্মকভাবে দুর্দান্ত)

import com.google.common.base.Stopwatch;

Stopwatch timer = Stopwatch.createStarted();
//method invocation
LOG.info("Method took: " + timer.stop());

সুন্দর জিনিস হ'ল স্টপওয়াচ.টোস্ট্রিং () পরিমাপের জন্য সময় ইউনিট নির্বাচন করার জন্য একটি ভাল কাজ করে। উদাহরণস্বরূপ, মানটি যদি ছোট হয় তবে এটি 38 এনএস আউটপুট দেয়, যদি এটি দীর্ঘ হয় তবে এটি 5 মি 3 এস প্রদর্শন করবে

এমনকি ভাল:

Stopwatch timer = Stopwatch.createUnstarted();
for (...) {
   timer.start();
   methodToTrackTimeFor();
   timer.stop();
   methodNotToTrackTimeFor();
}
LOG.info("Method took: " + timer);

দ্রষ্টব্য: গুগল পেয়ারা জাভা 1.6+ প্রয়োজন


21
দুর্ভাগ্যক্রমে, পেয়ারা স্টপওয়াচ থ্রেড-নিরাপদ নয়। আমি এই কঠিন উপায় শিখেছি।
ডেক্সটার লেগাস্পি

6
@ ডেক্সটারলেগ্যাসি আপনার অভিজ্ঞতায় খুব আগ্রহী হবে! ভাগ?
সিদ্ধার্থ

1
সমান্তরালে স্টপওয়াচ ব্যবহার করা আপনাকে start()একাধিকবার একসাথে কল করে (একই জন্য stop())।
মিংগুই স্যামুয়েল 16'19

141

জাভা 8 এর নতুন এপিআই থেকে তাত্ক্ষণিকসময়কাল ব্যবহার করে ,

Instant start = Instant.now();
Thread.sleep(5000);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

আউটপুট,

PT5S

2
ধন্যবাদ, আমি পিটি সামনে না রেখে কীভাবে ফলাফল আউটপুট করতে পারি?
java123999

1
পদ্ধতির সাথে সমস্যা হ'ল তাত্ক্ষণিকভাবে মিলি এবং ন্যানো দ্বিতীয় নির্ভুলতার সমস্যা হয় না। রেফ: স্ট্যাকওভারফ্লো.com
প্রশান্তসুঙ্কারী

8
@ java123999: আপনি কল করতে পারেন Duration.between(start, end).getSeconds()Durationঅন্যান্য সময় ইউনিটগুলিতে রূপান্তর করার পদ্ধতিও রয়েছে, যেমন toMillis()মিলিসেকেন্ডে রূপান্তর করে।
এমিল লুন্ডে

100

সমস্ত সম্ভাব্য উপায় একসাথে এক জায়গায় জড়ো করে।

তারিখ

Date startDate = Calendar.getInstance().getTime();
long d_StartTime = new Date().getTime();
Thread.sleep(1000 * 4);
Date endDate = Calendar.getInstance().getTime();
long d_endTime = new Date().getTime();
System.out.format("StartDate : %s, EndDate : %s \n", startDate, endDate);
System.out.format("Milli = %s, ( D_Start : %s, D_End : %s ) \n", (d_endTime - d_StartTime),d_StartTime, d_endTime);

পদ্ধতি. currentTimeMillis ()

long startTime = System.currentTimeMillis();
Thread.sleep(1000 * 4);
long endTime = System.currentTimeMillis();
long duration = (endTime - startTime);  
System.out.format("Milli = %s, ( S_Start : %s, S_End : %s ) \n", duration, startTime, endTime );
System.out.println("Human-Readable format : "+millisToShortDHMS( duration ) );

হিউম্যান রিডেবল ফরম্যাট

public static String millisToShortDHMS(long duration) {
    String res = "";    // java.util.concurrent.TimeUnit;
    long days       = TimeUnit.MILLISECONDS.toDays(duration);
    long hours      = TimeUnit.MILLISECONDS.toHours(duration) -
                      TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes    = TimeUnit.MILLISECONDS.toMinutes(duration) -
                      TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds    = TimeUnit.MILLISECONDS.toSeconds(duration) -
                      TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    long millis     = TimeUnit.MILLISECONDS.toMillis(duration) - 
                      TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration));

    if (days == 0)      res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis);
    else                res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis);
    return res;
}

পেয়ারা: গুগল স্টপওয়াচ জেআর Stop স্টপওয়াচের একটি বিষয় হ'ল ন্যানোসেকেন্ডগুলিতে অতিবাহিত সময় পরিমাপ করা।

com.google.common.base.Stopwatch g_SW = Stopwatch.createUnstarted();
g_SW.start();
Thread.sleep(1000 * 4);
g_SW.stop();
System.out.println("Google StopWatch  : "+g_SW);

এ্যাপাচি কমন্স ল্যাঙ JAR- র « বিরাম ঘড়ি সময় জন্য একটি সুবিধাজনক এপিআই প্রদান করে।

org.apache.commons.lang3.time.StopWatch sw = new StopWatch();
sw.start();     
Thread.sleep(1000 * 4);     
sw.stop();
System.out.println("Apache StopWatch  : "+ millisToShortDHMS(sw.getTime()) );

জোডা -টাইম

public static void jodaTime() throws InterruptedException, ParseException{
    java.text.SimpleDateFormat ms_SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
    String start = ms_SDF.format( new Date() ); // java.util.Date

    Thread.sleep(10000);

    String end = ms_SDF.format( new Date() );       
    System.out.println("Start:"+start+"\t Stop:"+end);

    Date date_1 = ms_SDF.parse(start);
    Date date_2 = ms_SDF.parse(end);        
    Interval interval = new org.joda.time.Interval( date_1.getTime(), date_2.getTime() );
    Period period = interval.toPeriod(); //org.joda.time.Period

    System.out.format("%dY/%dM/%dD, %02d:%02d:%02d.%04d \n", 
        period.getYears(), period.getMonths(), period.getDays(),
        period.getHours(), period.getMinutes(), period.getSeconds(), period.getMillis());
}

জাভা 8 থেকে জাভা তারিখের সময় এপিআই D একটি সময়কাল অবজেক্ট দুটি তাত্ক্ষণিক বস্তুর মধ্যে সময়ের একটি সময়কে উপস্থাপন করে।

Instant start = java.time.Instant.now();
    Thread.sleep(1000);
Instant end = java.time.Instant.now();
Duration between = java.time.Duration.between(start, end);
System.out.println( between ); // PT1.001S
System.out.format("%dD, %02d:%02d:%02d.%04d \n", between.toDays(),
        between.toHours(), between.toMinutes(), between.getSeconds(), between.toMillis()); // 0D, 00:00:01.1001 

স্প্রিং ফ্রেমওয়ার্ক প্রদান করে বিরাম ঘড়ি জাভা ব্যায়িত সময় পরিমাপ করতে উপযোগ বর্গ।

StopWatch sw = new org.springframework.util.StopWatch();
sw.start("Method-1"); // Start a named task
    Thread.sleep(500);
sw.stop();

sw.start("Method-2");
    Thread.sleep(300);
sw.stop();

sw.start("Method-3");
    Thread.sleep(200);
sw.stop();

System.out.println("Total time in milliseconds for all tasks :\n"+sw.getTotalTimeMillis());
System.out.println("Table describing all tasks performed :\n"+sw.prettyPrint());

System.out.format("Time taken by the last task : [%s]:[%d]", 
        sw.getLastTaskName(),sw.getLastTaskTimeMillis());

System.out.println("\n Array of the data for tasks performed « Task Name: Time Taken");
TaskInfo[] listofTasks = sw.getTaskInfo();
for (TaskInfo task : listofTasks) {
    System.out.format("[%s]:[%d]\n", 
            task.getTaskName(), task.getTimeMillis());
}

আউটপুট:

Total time in milliseconds for all tasks :
999
Table describing all tasks performed :
StopWatch '': running time (millis) = 999
-----------------------------------------
ms     %     Task name
-----------------------------------------
00500  050%  Method-1
00299  030%  Method-2
00200  020%  Method-3

Time taken by the last task : [Method-3]:[200]
 Array of the data for tasks performed « Task Name: Time Taken
[Method-1]:[500]
[Method-2]:[299]
[Method-3]:[200]

পেয়ারা স্টপওয়াচ, অ্যাপাচি কমন্স এবং স্প্রিং ফ্রেমওয়ার্ক থ্রেড নিরাপদ নয়। উত্পাদন ব্যবহারের জন্য নিরাপদ নয়।
দীপক পুথ্রায়

@ প্রদীপপুত্রায় তখন কোন লাইব্রেরি ব্যবহার করবেন যা উত্পাদন ব্যবহারের জন্য নিরাপদ?
গৌরব

1
@ প্রদীপপুত্রায় আপনি জাভা 8 প্রদত্ত জাভা ডেট টাইম এপিআই ব্যবহার করতে পারেন। যা সহজ।
যশ

আইএমও এই পোস্টে উপকৃত হবে যদি প্রতিটি সমাধান সিস্টেমের আউটপুটও দেখায়।
বেরুস

87

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

সম্পূর্ণ ইন্টিগ্রেটেড প্রোফাইলার ব্যবহার করার সময় এটি কোনও পদ্ধতির প্রোফাইলের পক্ষে কার্যকরভাবে তুচ্ছ। ডান ক্লিক করুন, প্রোফাইলার -> রুট পদ্ধতিতে যুক্ত করুন। তারপরে প্রোফাইলারটি চালান ঠিক যেমন আপনি পরীক্ষা চালাচ্ছেন বা ডিবাগার করছেন।


এটিও একটি দুর্দান্ত পরামর্শ ছিল এবং আমি যখন এই উত্তরটি পড়ি তখন সেই "দুহ" হালকা-বাল্বের মুহূর্তগুলির মধ্যে একটি আমার জন্য। আমাদের প্রকল্পটি জেডিফলার ব্যবহার করে তবে আমি পরীক্ষা করে দেখেছি এবং নিশ্চিত হয়েছি এটি একটি বিল্ট-ইন প্রোফাইলার পেয়েছে!
ওগ্রে গীতসংহিতা

2
জাভা 7 বিল্ড 40 থেকে (আমার মনে হয়) তারা প্রাক্তন জে রকিতস ফ্লাইট রেকর্ডারটিকে জাভাতে অন্তর্ভুক্ত করেছিল (জাভা মিশন নিয়ন্ত্রণের জন্য অনুসন্ধান করুন)
নীলস বেচ নিলসেন

নিশ্চিতভাবেই @ নিলস বেচনিয়েলসন! oracle.com/technetwork/java/javaseproducts/mission-control/…
ওগ্রে গীতসংহিতা 33

উদাহরণস্বরূপ, ভিজ্যুয়াল ভিএম দ্বারা জাভাতে পদ্ধতির কার্যকরকরণ কীভাবে পাবেন?
ওকেপ করুন

41

এটি সম্ভবত আপনি যা বলতে চেয়েছিলেন তা নয়, তবে এটি এওপি-র একটি ভাল ব্যবহার। আপনার পদ্ধতির আশেপাশে একটি প্রক্সি ইন্টারসেপ্টারকে চাবুক করুন এবং সেখানে সময় নির্ধারণ করুন।

কী, কেন এবং কীভাবে এওপি এই উত্তরটির বাইরে নয়, দুঃখের বিষয়, তবে আমি সম্ভবত এটি করব।

সম্পাদনা করুন: আপনি আগ্রহী হলে আপনাকে শুরু করার জন্য এখানে স্প্রিং এওপি- র একটি লিঙ্ক দেওয়া আছে। এটি জাভা জুড়ে আসা এওপি-র সর্বাধিক অ্যাক্সেসযোগ্য বাস্তবায়ন।

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


3
স্প্রিংয়ের মাধ্যমে এটি কীভাবে করা যায় তার একটি টিউটোরিয়াল এখানে দেওয়া হয়েছে: veerasundar.com/blog/2010/01/…
ডেভিড টিঙ্কার

39

System.currentTimeMillis();আপনার অ্যালগরিদমের কর্মক্ষমতা পরিমাপের জন্য ভাল পন্থা নয়। এটি কম্পিউটারের স্ক্রিনটি ব্যবহারকারী হিসাবে আপনি মোট সময়টি পরিমাপ করেন। এটিতে আপনার কম্পিউটারে পটভূমিতে চলমান অন্য সমস্ত কিছুর দ্বারা ব্যয় করা সময়ও অন্তর্ভুক্ত রয়েছে। আপনার ওয়ার্কস্টেশনে প্রচুর প্রোগ্রাম চলার ক্ষেত্রে এটি একটি বিশাল পার্থক্য আনতে পারে।

যথাযথ পদ্ধতির java.lang.managementপ্যাকেজ ব্যবহার করা হয় ।

Http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_Time_benchmarking ওয়েবসাইট থেকে :

  • "ব্যবহারকারীর সময়" হল আপনার অ্যাপ্লিকেশনটির নিজস্ব কোড চালাতে ব্যয় করা সময়।
  • "সিস্টেমের সময়" হ'ল আপনার অ্যাপ্লিকেশনটির পক্ষে ওএস কোড চালানোর সময় ব্যয় করা (যেমন I / O এর জন্য)।

getCpuTime() পদ্ধতি আপনাকে সেগুলির যোগফল দেয়:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public class CPUUtils {

    /** Get CPU time in nanoseconds. */
    public static long getCpuTime( ) {
        ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
        return bean.isCurrentThreadCpuTimeSupported( ) ?
            bean.getCurrentThreadCpuTime( ) : 0L;
    }

    /** Get user time in nanoseconds. */
    public static long getUserTime( ) {
        ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
        return bean.isCurrentThreadCpuTimeSupported( ) ?
            bean.getCurrentThreadUserTime( ) : 0L;
    }

    /** Get system time in nanoseconds. */
    public static long getSystemTime( ) {
        ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
        return bean.isCurrentThreadCpuTimeSupported( ) ?
            (bean.getCurrentThreadCpuTime( ) - bean.getCurrentThreadUserTime( )) : 0L;
    }

}

4
এটি অবশ্যই একটি ভাল পয়েন্ট, যে "ব্যবহারকারীর সময়" (ওয়াল-ক্লক টাইম) সর্বদা পারফরম্যান্সের দুর্দান্ত মাপকাঠি নয়, বিশেষত একটি বহু-থ্রেড প্রোগ্রামে।
ওগ্রে গীতসংহিতা 33

এই আমি উত্তর খুঁজছি।
ঝাওগাং

30

জাভা 8 এর মাধ্যমে আপনি প্রতিটি সাধারণ পদ্ধতিতেও এর মতো কিছু করতে পারেন :

Object returnValue = TimeIt.printTime(() -> methodeWithReturnValue());
//do stuff with your returnValue

সময় মত যেমন:

public class TimeIt {

public static <T> T printTime(Callable<T> task) {
    T call = null;
    try {
        long startTime = System.currentTimeMillis();
        call = task.call();
        System.out.print((System.currentTimeMillis() - startTime) / 1000d + "s");
    } catch (Exception e) {
        //...
    }
    return call;
}
}

এই মেথোডের সাহায্যে আপনি আপনার কোডের যে কোনও জায়গা না ভেঙে সহজ সময় পরিমাপ করতে পারবেন। এই সাধারণ উদাহরণে আমি কেবল সময়ের মুদ্রণ করি। আপনি টাইমটাইটের জন্য একটি স্যুইচ যুক্ত করতে পারেন, উদাহরণস্বরূপ কেবলমাত্র ডিবাগমোডে কিছু মুদ্রণ করতে বা কোনও কিছু।

আপনি যদি ফাংশন নিয়ে কাজ করছেন তবে আপনি এ জাতীয় কিছু করতে পারেন:

Function<Integer, Integer> yourFunction= (n) -> {
        return IntStream.range(0, n).reduce(0, (a, b) -> a + b);
    };

Integer returnValue = TimeIt.printTime2(yourFunction).apply(10000);
//do stuff with your returnValue

public static <T, R> Function<T, R> printTime2(Function<T, R> task) {
    return (t) -> {
        long startTime = System.currentTimeMillis();
        R apply = task.apply(t);
        System.out.print((System.currentTimeMillis() - startTime) / 1000d
                + "s");
        return apply;
    };
}

এটি অন্যান্য সমাধানগুলির চেয়ে অনেক ভাল দেখাচ্ছে। এর চেয়ে আরও হালকা স্প্রিং এওপি এর কাছাকাছি। সত্যিকারের জাভা 8 রাস্তা! +1 ধন্যবাদ!
অমিত কুমার

সম্ভবত এটি আপনার কাছে ভাল লাগছে, কারণ স্টেফান অভিনব নতুন জাভা ফাংশন ব্যবহার করছে। তবে আমি মনে করি এটি পড়া এবং বুঝতে অসুবিধাজনক।
স্টিম্পসন বিড়াল

18

এছাড়াও সময়টি পরিমাপ করার জন্য আমরা অ্যাপাচি কমনের স্টপওয়াচ ক্লাস ব্যবহার করতে পারি।

কোডের উদাহরণ

org.apache.commons.lang.time.StopWatch sw = new org.apache.commons.lang.time.StopWatch();

System.out.println("getEventFilterTreeData :: Start Time : " + sw.getTime());
sw.start();

// Method execution code

sw.stop();
System.out.println("getEventFilterTreeData :: End Time : " + sw.getTime());

15

কেবলমাত্র একটি ছোট মোচড়, যদি আপনি সরঞ্জাম প্রয়োগ না করেন এবং স্বল্প প্রয়োগের সময় নিয়ে সময় পদ্ধতিগুলি করতে চান: এটি একবারে কয়েকবার চালান, প্রতিবার আপনি যখন দ্বিতীয় বা তার বেশি না পৌঁছান ততবারের সংখ্যা দ্বিগুণ করে। সুতরাং, System.nanoTime এ কল করার সময় এবং ততক্ষণে, বা System.nanoTime এর নির্ভুলতা ফলাফলকে খুব বেশি প্রভাবিত করে না।

    int runs = 0, runsPerRound = 10;
    long begin = System.nanoTime(), end;
    do {
        for (int i=0; i<runsPerRound; ++i) timedMethod();
        end = System.nanoTime();
        runs += runsPerRound;
        runsPerRound *= 2;
    } while (runs < Integer.MAX_VALUE / 2 && 1000000000L > end - begin);
    System.out.println("Time for timedMethod() is " + 
        0.000000001 * (end-begin) / runs + " seconds");

অবশ্যই প্রাচীরের ঘড়িটি ব্যবহারের বিষয়ে সতর্কতাগুলি প্রয়োগ করে: জেআইটি-সংকলন, একাধিক থ্রেড / প্রক্রিয়া ইত্যাদির প্রভাব এইভাবে, আপনাকে প্রথমে প্রথমে প্রচুর বার চালিত করা দরকার যেমন জেআইটি সংকলকটি তার কাজটি করে এবং তারপরে একাধিকবার এই পরীক্ষার পুনরাবৃত্তি করুন এবং সর্বনিম্ন কার্যকর সময় নিন।


13

আমরা এই লক্ষ্যে AspectJ এবং জাভা টীকা ব্যবহার করছি। যদি কোনও পদ্ধতির জন্য আমাদের কার্যকর করার সময় জানতে হয় তবে আমরা এটিকে সহজভাবে বর্ণনা করি। আরও উন্নত সংস্করণ একটি নিজস্ব লগ স্তর ব্যবহার করতে পারে যা রানটাইম সক্ষম ও অক্ষম করতে পারে।

public @interface Trace {
  boolean showParameters();
}

@Aspect
public class TraceAspect {
  [...]
  @Around("tracePointcut() && @annotation(trace) && !within(TraceAspect)")
  public Object traceAdvice ( ProceedingJintPoint jP, Trace trace ) {

    Object result;
    // initilize timer

    try { 
      result = jp.procced();
    } finally { 
      // calculate execution time 
    }

    return result;
  }
  [...]
}

13

জেপ 230: মাইক্রোবেঞ্চমার্ক স্যুট

অবগতির জন্য, JEP 230: Microbenchmark সুইট একটি হল OpenJDK প্রকল্পে:

জেডিকে সোর্স কোডে মাইক্রোবেইনমার্কের একটি বেসিক স্যুট যুক্ত করুন এবং বিকাশকারীদের পক্ষে বিদ্যমান মাইক্রোব্যাঙ্কমার্কগুলি চালানো এবং নতুন তৈরি করা সহজ করে দিন।

এই বৈশিষ্ট্যটি জাভা 12 এ এসেছিল ।

জাভা মাইক্রোবেঞ্চমার্ক হারনেস (জেএমএইচ)

জাভার পূর্ববর্তী সংস্করণগুলির জন্য, জাভা মাইক্রোবেঞ্চমার্ক হারনেস (জেএমএইচ) প্রকল্পটি দেখুন যা জেপি 230 ভিত্তিক।


11

সত্যিই ভাল কোড।

http://www.rgagnon.com/javadetails/java-0585.html

import java.util.concurrent.TimeUnit;

long startTime = System.currentTimeMillis();
........
........
........
long finishTime = System.currentTimeMillis();

String diff = millisToShortDHMS(finishTime - startTime);


  /**
   * converts time (in milliseconds) to human-readable format
   *  "<dd:>hh:mm:ss"
   */
  public static String millisToShortDHMS(long duration) {
    String res = "";
    long days  = TimeUnit.MILLISECONDS.toDays(duration);
    long hours = TimeUnit.MILLISECONDS.toHours(duration)
                   - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes = TimeUnit.MILLISECONDS.toMinutes(duration)
                     - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds = TimeUnit.MILLISECONDS.toSeconds(duration)
                   - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    if (days == 0) {
      res = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    else {
      res = String.format("%dd%02d:%02d:%02d", days, hours, minutes, seconds);
    }
    return res;
  }

3
প্রকৃতপক্ষে প্রশ্নটি ছিল একটি পদ্ধতি কীভাবে সময় নেয় তা গণনা করতে হবে, কীভাবে এটি বিন্যাস করবেন না। তবে এই প্রশ্নটি বেশ পুরানো (প্রায় চার বছর!)। পুরানো থ্রেডগুলি পুনরুত্থান এড়াতে চেষ্টা করুন যদি না প্রতিক্রিয়া বিদ্যমান প্রতিক্রিয়ার চেয়ে নতুন এবং উল্লেখযোগ্য কিছু যুক্ত করে।
লেইগ

1
এবং শেষের দিকে অবশিষ্ট মিলিস যুক্ত করতে নিম্নলিখিত পরিবর্তনগুলি করুন: long millis = TimeUnit.MILLISECONDS.toMillis(duration) - TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration)); if (days == 0) { res = String.format("%02d:%02d:%02d.%02d", hours, minutes, seconds, millis); } else { res = String.format("%dd%02d:%02d:%02d.%02d", days, hours, minutes, seconds, millis); }
রিক বারখাউজ

10

আপনি পারফেক্ট 4j ব্যবহার করতে পারেন । খুব শীতল ইউটিলিটি। ব্যবহার সহজ

String watchTag = "target.SomeMethod";
StopWatch stopWatch = new LoggingStopWatch(watchTag);
Result result = null; // Result is a type of a return value of a method
try {
    result = target.SomeMethod();
    stopWatch.stop(watchTag + ".success");
} catch (Exception e) {
    stopWatch.stop(watchTag + ".fail", "Exception was " + e);
    throw e; 
}

বিকাশকারী গাইডে আরও তথ্য পাওয়া যাবে

সম্পাদনা: প্রকল্পটি মারা গেছে বলে মনে হচ্ছে


1
Perf4j এছাড়াও সুন্দর পরিসংখ্যান তৈরি করতে পারে ।
প্যাসকে

8
new Timer(""){{
    // code to time 
}}.timeMe();



public class Timer {

    private final String timerName;
    private long started;

    public Timer(String timerName) {
        this.timerName = timerName;
        this.started = System.currentTimeMillis();
    }

    public void timeMe() {
        System.out.println(
        String.format("Execution of '%s' takes %dms.", 
                timerName, 
                started-System.currentTimeMillis()));
    }

}

1
আপনার ইতিমধ্যে বিল্ড সিস্টেম এবং নির্ভরশীল ওটিএস সেট আপ করা হলে আপনার নিজের সাধারণ বর্গটি রোল করা ভাল পছন্দ, এবং কোনও ইউটিলিটি টাইমার শ্রেণীর অন্তর্ভুক্ত অন্য কোনও ওটিএস প্যাকেজে টানতে বিরক্ত করতে চান না।
ওগ্রে গীতসংহিতা 33

7

আমি মূলত এর বিভিন্নতা করি, তবে হটস্পট সংকলনটি কীভাবে কাজ করে তা বিবেচনা করে আপনি যদি সঠিক ফলাফল পেতে চান তবে আপনাকে প্রথম কয়েকটি পরিমাপ বের করতে হবে এবং নিশ্চিত করতে হবে যে আপনি পদ্ধতিটি একটি বাস্তব বিশ্বে ব্যবহার করছেন (অ্যাপ্লিকেশন নির্দিষ্ট পড়ুন) অ্যাপ্লিকেশনটিতে।

যদি জেআইটি এটি সংকলন করার সিদ্ধান্ত নেয় তবে আপনার সংখ্যাগুলি ব্যাপকভাবে পরিবর্তিত হবে। সুতরাং শুধু সচেতন হতে হবে


7

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

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

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


7

জাভাডক অনুসারে স্প্রিং একটি ইউটিলিটি ক্লাস org.springframework.util.ShopWatch সরবরাহ করে :

সরল স্টপ ওয়াচ, বেশ কয়েকটি কাজের সময় নির্ধারণের অনুমতি, প্রতিটি নামকৃত কাজের জন্য চলমান মোট সময় এবং চলমান সময় উন্মুক্ত করে।

ব্যবহার:

StopWatch stopWatch = new StopWatch("Performance Test Result");

stopWatch.start("Method 1");
doSomething1();//method to test
stopWatch.stop();

stopWatch.start("Method 2");
doSomething2();//method to test
stopWatch.stop();

System.out.println(stopWatch.prettyPrint());

আউটপুট:

StopWatch 'Performance Test Result': running time (millis) = 12829
-----------------------------------------
ms     %     Task name
-----------------------------------------
11907  036%  Method 1
00922  064%  Method 2

দিকগুলি সহ:

@Around("execution(* my.package..*.*(..))")
public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    Object retVal = joinPoint.proceed();
    stopWatch.stop();
    log.info(" execution time: " + stopWatch.getTotalTimeMillis() + " ms");
    return retVal;
}

এ্যাসপেক্টজে দিয়ে কি এটি ব্যবহার করা সম্ভব?
zygimantus

7

আমি পদ্ধতিটি প্রয়োগের সময়টি অনেক বেশি পাঠযোগ্য আকারে মুদ্রণের জন্য একটি পদ্ধতি লিখেছি। উদাহরণস্বরূপ, 1 মিলিয়ন এর ফ্যাক্টরিয়াল গণনা করতে, এটি প্রায় 9 মিনিট সময় নেয়। সুতরাং মৃত্যুদন্ড কার্যকর করার সময়টি মুদ্রিত হবে:

Execution Time: 9 Minutes, 36 Seconds, 237 MicroSeconds, 806193 NanoSeconds

কোডটি এখানে:

public class series
{
    public static void main(String[] args)
    {
        long startTime = System.nanoTime();

        long n = 10_00_000;
        printFactorial(n);

        long endTime = System.nanoTime();
        printExecutionTime(startTime, endTime);

    }

    public static void printExecutionTime(long startTime, long endTime)
    {
        long time_ns = endTime - startTime;
        long time_ms = TimeUnit.NANOSECONDS.toMillis(time_ns);
        long time_sec = TimeUnit.NANOSECONDS.toSeconds(time_ns);
        long time_min = TimeUnit.NANOSECONDS.toMinutes(time_ns);
        long time_hour = TimeUnit.NANOSECONDS.toHours(time_ns);

        System.out.print("\nExecution Time: ");
        if(time_hour > 0)
            System.out.print(time_hour + " Hours, ");
        if(time_min > 0)
            System.out.print(time_min % 60 + " Minutes, ");
        if(time_sec > 0)
            System.out.print(time_sec % 60 + " Seconds, ");
        if(time_ms > 0)
            System.out.print(time_ms % 1E+3 + " MicroSeconds, ");
        if(time_ns > 0)
            System.out.print(time_ns % 1E+6 + " NanoSeconds");
    }
}

6

এটি করার বেশ কয়েকটি উপায় রয়েছে। আমি সাধারণত এই জাতীয় কিছু ব্যবহার করে ফিরে যাই:

long start = System.currentTimeMillis();
// ... do something ...
long end = System.currentTimeMillis();

বা একই জিনিসটি System.nanoTime () এর সাথে;

বিষয়গুলির মাপদণ্ডের দিকে আরও কিছু করার জন্য এটিও মনে হয়: http://jetm.void.fm/ যদিও কখনও চেষ্টা করে দেখুন।


6

আপনি মেট্রিক্স লাইব্রেরি ব্যবহার করতে পারেন যা বিভিন্ন পরিমাপের সরঞ্জাম সরবরাহ করে। নির্ভরতা যুক্ত করুন:

<dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
</dependencies>

এবং এটি আপনার পরিবেশের জন্য কনফিগার করুন।

পদ্ধতিগুলি @ লক্ষ্যযুক্ত দ্বারা টিকা দেওয়া যেতে পারে :

@Timed
public void exampleMethod(){
    // some code
}

বা কোডের টুকরা টাইমার দিয়ে মোড়ানো :

final Timer timer = metricsRegistry.timer("some_name");
final Timer.Context context = timer.time();
// timed code
context.stop();

সমষ্টিগত মেট্রিকগুলি কনসোল, জেএমএক্স, সিএসভি বা অন্যান্যতে রফতানি করতে পারে।

@Timed মেট্রিক আউটপুট উদাহরণ:

com.example.ExampleService.exampleMethod
             count = 2
         mean rate = 3.11 calls/minute
     1-minute rate = 0.96 calls/minute
     5-minute rate = 0.20 calls/minute
    15-minute rate = 0.07 calls/minute
               min = 17.01 milliseconds
               max = 1006.68 milliseconds
              mean = 511.84 milliseconds
            stddev = 699.80 milliseconds
            median = 511.84 milliseconds
              75% <= 1006.68 milliseconds
              95% <= 1006.68 milliseconds
              98% <= 1006.68 milliseconds
              99% <= 1006.68 milliseconds
            99.9% <= 1006.68 milliseconds

5

আপনি যদি ওয়াল-ক্লক সময় চান

long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;

5

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

আপনি এমা ( http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0 ) এর মতো ওপেন সোর্স সরঞ্জাম সরঞ্জাম দ্বারা ব্যবহৃত কোডটি দেখতে পারেন । অন্যান্য ওপেনসোর্স কভারেজ সরঞ্জামটি হ'ল http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download

আপনি যদি শেষ পর্যন্ত যা সেট করেন তা করার ব্যবস্থা করেন, প্লিজ। আপনার পিঁপড়া টাস্ক / জারের সাথে এটিকে এখানে সম্প্রদায়ের সাথে আবার ভাগ করুন।



4

আমি সেকেন্ডে ফলাফল পেতে সঠিক উত্তর থেকে কোডটি পরিবর্তন করেছি:

long startTime = System.nanoTime();

methodCode ...

long endTime = System.nanoTime();
double duration = (double)(endTime - startTime) / (Math.pow(10, 9));
Log.v(TAG, "MethodName time (s) = " + duration);

4

আপনি বসন্ত কোর প্রকল্প থেকে স্টপওয়াচ ক্লাস ব্যবহার করতে পারেন:

কোড:

StopWatch stopWatch = new StopWatch()
stopWatch.start();  //start stopwatch
// write your function or line of code.
stopWatch.stop();  //stop stopwatch
stopWatch.getTotalTimeMillis() ; ///get total time

স্টপওয়াচের জন্য ডকুমেন্টেশন: সাধারণ স্টপ ওয়াচ, বেশ কয়েকটি কাজের সময় নির্ধারণের অনুমতি, প্রতিটি নামকৃত কাজের জন্য চলমান মোট সময় এবং চলমান সময় উন্মুক্ত করে। সিস্টেম কোডারেন্টটাইমমিলিস () এর ব্যবহার গোপন করে, অ্যাপ্লিকেশন কোডের পঠনযোগ্যতা উন্নতি করে এবং গণনার ত্রুটির সম্ভাবনা হ্রাস করে। নোট করুন যে এই অবজেক্টটি থ্রেড-সেফ হতে ডিজাইন করা হয়নি এবং সিঙ্ক্রোনাইজেশন ব্যবহার করে না। এই শ্রেণিটি সাধারণত উত্পাদন অ্যাপ্লিকেশনগুলির অংশ হিসাবে না হয়ে প্রুফ-অফ-ধারণাগুলির সময় এবং বিকাশে কর্মক্ষমতা যাচাই করতে ব্যবহৃত হয়।


3

সময়টি জানতে চাইলে আপনি এইভাবে চেষ্টা করতে পারেন।

long startTime = System.currentTimeMillis();
//@ Method call
System.out.println("Total time [ms]: " + (System.currentTimeMillis() - startTime));    

3

ঠিক আছে, আপনার ফাংশনগুলির সহজ সরল সময় ব্যবহারের জন্য এটি একটি সাধারণ শ্রেণি। এর নীচে একটি উদাহরণ রয়েছে।

public class Stopwatch {
    static long startTime;
    static long splitTime;
    static long endTime;

    public Stopwatch() {
        start();
    }

    public void start() {
        startTime = System.currentTimeMillis();
        splitTime = System.currentTimeMillis();
        endTime = System.currentTimeMillis();
    }

    public void split() {
        split("");
    }

    public void split(String tag) {
        endTime = System.currentTimeMillis();
        System.out.println("Split time for [" + tag + "]: " + (endTime - splitTime) + " ms");
        splitTime = endTime;
    }

    public void end() {
        end("");
    }
    public void end(String tag) {
        endTime = System.currentTimeMillis();
        System.out.println("Final time for [" + tag + "]: " + (endTime - startTime) + " ms");
    }
}

ব্যবহারের নমুনা:

public static Schedule getSchedule(Activity activity_context) {
        String scheduleJson = null;
        Schedule schedule = null;
/*->*/  Stopwatch stopwatch = new Stopwatch();

        InputStream scheduleJsonInputStream = activity_context.getResources().openRawResource(R.raw.skating_times);
/*->*/  stopwatch.split("open raw resource");

        scheduleJson = FileToString.convertStreamToString(scheduleJsonInputStream);
/*->*/  stopwatch.split("file to string");

        schedule = new Gson().fromJson(scheduleJson, Schedule.class);
/*->*/  stopwatch.split("parse Json");
/*->*/  stopwatch.end("Method getSchedule"); 
    return schedule;
}

কনসোল আউটপুট নমুনা:

Split time for [file to string]: 672 ms
Split time for [parse Json]: 893 ms
Final time for [get Schedule]: 1565 ms

3

জাভা 8 এ নতুন একটি ক্লাস Instantচালু করা হয়েছে। ডক অনুসারে:

তাত্ক্ষণিক সময় লাইনে ন্যানোসেকেন্ডের সূচনা করে। এই শ্রেণিটি মেশিনের সময় উপস্থাপনের জন্য একটি সময় স্ট্যাম্প তৈরির জন্য দরকারী। তাত্ক্ষণিক পরিসরের জন্য দীর্ঘের চেয়ে বড় সংখ্যার স্টোরেজ প্রয়োজন requires এটি অর্জনের জন্য, ক্লাসটি একটি দীর্ঘ প্রতিনিধিত্বকারী যুগ-সেকেন্ড এবং ইনট প্রতিনিধিত্ব করে ন্যানোসেকেন্ড-অফ-সেকেন্ড উপস্থাপন করে, যা সর্বদা 0 এবং 999,999,999 এর মধ্যে থাকবে। যুগের সেকেন্ডগুলি 1970-01-01T00: 00: 00Z এর স্ট্যান্ডার্ড জাভা পর্ব থেকে পরিমাপ করা হয় যেখানে যুগের পরে তাত্ক্ষণিকগুলির ইতিবাচক মান থাকে এবং পূর্ববর্তী তাত্ক্ষণিকগুলির নেতিবাচক মান থাকে। যুগের দ্বিতীয় এবং ন্যানোসেকেন্ড উভয় অংশের জন্য, বৃহত্তর মানটি সর্বদা ছোট মানের চেয়ে সময়রেখায় থাকে।

এটি হিসাবে ব্যবহার করা যেতে পারে:

Instant start = Instant.now();
try {
    Thread.sleep(7000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

এটি মুদ্রণ PT7.001S

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