যেহেতু জাভা 7, System.nanoTime()
জেডিকে স্পেসিফিকেশন দ্বারা নিরাপদ থাকার গ্যারান্টিযুক্ত। System.nanoTime()
জাভাডোক এটি পরিষ্কার করে দিয়েছে যে একটি জেভিএম-এর মধ্যে সমস্ত পর্যবেক্ষণের আহবানগুলি (এটি, সমস্ত থ্রেড জুড়ে) একঘেয়ে রয়েছে:
প্রত্যাশিত মানটি কিছু নির্দিষ্ট কিন্তু স্বেচ্ছাসেবী উত্স সময় (সম্ভবত ভবিষ্যতে, তাই মানগুলি নেতিবাচক হতে পারে) থেকে ন্যানোসেকেন্ডগুলি উপস্থাপন করে। জাভা ভার্চুয়াল মেশিনের উদাহরণে এই পদ্ধতির সমস্ত অনুরোধের মাধ্যমে একই উত্স ব্যবহৃত হয়; অন্যান্য ভার্চুয়াল মেশিন দৃষ্টান্তগুলি পৃথক উত্স ব্যবহার করবে।
জেভিএম / জেডিকে বাস্তবায়ন অন্তর্নিহিত ওএস ইউটিলিটিগুলি যখন ডাকা হয় তখন লক্ষ্য করা যায় যে অসঙ্গতিগুলি পর্যবেক্ষণের জন্য দায়ী (যেমন টম অ্যান্ডারসনের উত্তরে উল্লিখিত ) ।
এই প্রশ্নের অন্যান্য পুরানো উত্তরগুলির বেশিরভাগই (২০০৯-২০১২ সালে লিখিত) FUD প্রকাশ করে যা সম্ভবত জাভা 5 বা জাভা 6 এর জন্য প্রাসঙ্গিক ছিল তবে জাভার আধুনিক সংস্করণগুলির জন্য আর প্রাসঙ্গিক নয়।
তবে এটি উল্লেখ করার মতো বিষয় যে, জেডিকে সুরক্ষার নিশ্চয়তা সত্ত্বেও, ওপেনজেডিকে বিভিন্ন প্লাগ রয়েছেnanoTime()
যা নির্দিষ্ট প্ল্যাটফর্মে বা নির্দিষ্ট পরিস্থিতিতে এই গ্যারান্টিটি ধরে রাখতে পারে না (যেমন জেডিকে -8040140 , জেডিকে -8184271 )। ওপেনজেডিকে আর্টে কোনও খোলা (জানা) বাগ নেইnanoTime()
মুহুর্তে , তবে ওপেনজেডকে একটি নতুন রিলিজে এ জাতীয় একটি ত্রুটি বা রিগ্রেশন আবিষ্কারের ফলে কাউকে হতবাক করা উচিত নয়।
এই কথাটি মাথায় রেখে, সময়যুক্ত ব্লকিং, ব্যবধান ওয়েটিং, টাইমআউট ইত্যাদির জন্য যে কোড ব্যবহার করে সেগুলি nanoTime()
ব্যতিক্রম ছোঁড়ার পরিবর্তে negativeণাত্মক সময়ের পার্থক্য (টাইমআউটস )কে জিরো হিসাবে পছন্দ করবে। এই অনুশীলন এছাড়াও বাঞ্ছনীয়, কারণ এটি সব শ্রেণীর সব সুবিধানুযায়ী অপেক্ষার পদ্ধতির আচরণ সঙ্গে সামঞ্জস্যপূর্ণ java.util.concurrent.*
, উদাহরণস্বরূপ Semaphore.tryAcquire()
, Lock.tryLock()
, BlockingQueue.poll()
, ইত্যাদি
তবুও, nanoTime()
সময়োচিত ব্লকিং, ব্যবধান অপেক্ষার সময়সীমা ইত্যাদি বাস্তবায়নের জন্য এখনও অগ্রাধিকার দেওয়া উচিত currentTimeMillis()
কারণ পরবর্তীকালে "সময় পিছিয়ে যাওয়ার" ঘটনাটি (যেমন সার্ভারের সময় সংশোধনের কারণে) একটি বিষয়, অর্থাৎ currentTimeMillis()
সময়ের ব্যবধান পরিমাপের জন্য উপযুক্ত নয় মোটেই আরও তথ্যের জন্য এই উত্তর দেখুন ।
এর পরিবর্তে ব্যবহার করার nanoTime()
সরাসরি কোড সঞ্চালনের সময় পরিমাপ জন্য, বিশেষ মাপকাঠিতে অবকাঠামো ও profilers বাঞ্ছনীয়, উদাহরণস্বরূপ ব্যবহার করা উচিত JMH এবং ASYNC-প্রোফাইলার মধ্যে দেওয়াল-ঘড়ি প্রোফাইলিং মোড ।