كيف يمكنني حساب الوقت المنقضي لحدث ما في جافا؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/238920

  •  04-07-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

ما هي الطريقة البسيطة/السهلة للوصول إلى ساعة النظام باستخدام Java، حتى أتمكن من حساب الوقت المنقضي لحدث ما؟

هل كانت مفيدة؟

المحلول

وأود أن تجنب استخدام System.currentTimeMillis() لقياس الوقت المنقضي. currentTimeMillis() إرجاع وقت "ساعة الحائط"، والذي قد يتغير (على سبيل المثال:التوقيت الصيفي، قيام المستخدم الإداري بتغيير الساعة) وتحريف قياسات الفاصل الزمني.

System.nanoTime(), من ناحية أخرى، تقوم بإرجاع عدد النانو ثانية منذ "نقطة مرجعية معينة" (على سبيل المثال، بدء تشغيل JVM)، وبالتالي لن تكون عرضة لتغييرات ساعة النظام.

نصائح أخرى

هذه بعض نماذج التعليمات البرمجية.

long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();

System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");

لدى Apache Commons-Lang أيضًا فئة StopWatch المناسبة لغرضك فقط.فهو يستخدم System.currentTimeMillis()، لذلك ستظل تواجه مشكلات في الدقة، ولكن يمكنك التوقف مؤقتًا والقيام بأوقات الدورة وما إلى ذلك.أستخدمه كمعيار الآن لإحصائيات الأحداث.

http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html

ال الإجابة بواسطة لي صحيح.

java.time

يحتوي Java 8 والإصدارات الأحدث على إطار عمل Java.time مدمج.

ان Instant هي لحظة على الخط الزمني بالتوقيت العالمي المنسق (UTC) بدقة نانو ثانية (ما يصل إلى 9 أرقام من جزء عشري من الثانية).ال now تستحوذ الطريقة على لحظة التاريخ والوقت الحالية.

Instant now = Instant.now();

03/12/2016 04:29:39

يمكنك حساب الوقت المنقضي بين زوج من Instant كائنات مثل أ Duration.تستخدم المدة دقة النانو ثانية مع الحد الأقصى لقيمة الثواني التي يمكن الاحتفاظ بها لفترة طويلة.وهذا أكبر من العمر المقدر الحالي للكون.

Duration duration = Duration.between( startInstant , stopInstant );

الإخراج الافتراضي ل Duration::toString هو في المعيار ايزو 8601 شكل.يمكنك أيضًا طلب العدد الإجمالي للنانو ثانية (toNanos) أو ميلي ثانية (toMillis)، بالإضافة إلى مبالغ أخرى.

جافا 8

في Java 8، يؤدي جلب اللحظة الحالية إلى دقة ميلي ثانية فقط (ما يصل إلى 3 أرقام من جزء عشري من الثانية).لذلك بينما تستطيع فئات Java.time ذلك محل النانو ثانية يمكنهم فقط تحديد اللحظة الحالية بالمللي ثانية.يرجع هذا القيد إلى مشكلة قديمة (الملف الافتراضي Clock استخدامات التنفيذ System.currentTimeMillis()).

جافا 9

في Java 9 والإصدارات الأحدث، يكون الإعداد الافتراضي Clock يمكن للتنفيذ تحديد اللحظة الحالية بدقة تصل إلى النانو ثانية.يعتمد القيام بذلك فعليًا على دقة أجهزة الساعة بجهاز الكمبيوتر الخاص بك.

راجع صفحة إصدار OpenJDK لمزيد من المعلومات: زيادة دقة تنفيذ java.time.Clock.systemUTC()

المعيار الصغير

إذا كان هدفك هو قياس الأداء، فتأكد من إلقاء نظرة على أسئلة أخرى مثل:

تتوفر الأطر للمساعدة في قياس الأداء على المدى القصير.

java.lang.System.currentTimeMillis() أو java.lang.System.nanoTime() يجب أن تعمل على قياس الوقت المنقضي.

إليك فئة StopWatch صغيرة كتبتها باستخدام System.nanoTime() كما هو مقترح في إجابة Leigh:

public class StopWatch {
    // Constructor
    public StopWatch() {
    }

    // Public API
    public void start() {
        if (!_isRunning) {
            _startTime = System.nanoTime();
            _isRunning = true;
        }
    }

    public void stop() {
        if (_isRunning) {
            _elapsedTime += System.nanoTime() - _startTime;
            _isRunning = false;
        }
    }

    public void reset() {
        _elapsedTime = 0;
        if (_isRunning) {
            _startTime = System.nanoTime();
        }
    }

    public boolean isRunning() {
        return _isRunning;
    }

    public long getElapsedTimeNanos() {
        if (_isRunning) {
            return System.nanoTime() - _startTime;
        }
        return _elapsedTime;
    }

    public long getElapsedTimeMillis() {
        return getElapsedTimeNanos() / 1000000L;
    }

    // Private Members
    private boolean _isRunning = false;
    private long _startTime = 0;
    private long _elapsedTime = 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top