كيف يمكنني قياس الوقت في جافا ليس عرضة ساعة النظام التغييرات ؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

أود أن قياس الوقت المنقضي في جافا.ومع ذلك الاختلافات في System.currentTimeMillis() و (أعتقد) System.nanoTime() يمكن تغيير من التغييرات الخارجية على سبيل المثال شخص ما (أو النظام) تغيير ساعة النظام.

باستخدام شبكة المكالمات ليس خيارا كما أنه من الممكن جدا متكررة وسريعة العوائد المطلوبة.

هل هناك حل مشترك من أجل هذا ؟

تحرير

أنا آسف كان يجب أن التفصيل عن السبب.ليس لوقف المستخدمين المؤذيين إنها أشياء مثل العميل بدأت الخروج لكونه الخمول والروتين العميل الأحداث.

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

المحلول

هذا لا يجيب على سؤالك, ولكن علة #6458294 يعني أن أمكن الشمس تنفيذ nanoTime() استخدام الآليات التي هي حقا رتيب (CLOCK_MONOTONIC على لينكس ، QueryPerformanceFrequency/QueryPerformanceCounter على ويندوز).إلا إذا كانت هذه غير متوفرة وسوف تعود مرة أخرى إلى الآلية التي هي عرضة ساعة النظام التغييرات.

إذا كان لديك التحكم (أو على الأقل المعرفة) من الأجهزة كنت تعمل على ، يمكن التأكد من أن هذه الساعة آليات سوف تكون متاحة ، قد تكون في الحظ و nanoTime() سوف تفعل ما يرام.

قد ترغب أيضا في قراءة هذا بلوق وظيفة, الذي يناقش نقطة ساخنة-في Windows في حالة مزيد من التفاصيل.

نصائح أخرى

لا أعتقد أن هناك طريقة للقيام بذلك.

هناك بالتأكيد هذا لا يمكن أن يكون تخريب.أساسا أنت تحت رحمة نظام التشغيل و JVM على ما هو أبلغ جافا التطبيق كما في الوقت الحالي.أي أو كل من هذه يمكن أن تكون مصححة بحيث كود جافا ينتهي الحصول على وهمية الزمني القيمة.قد تتمكن من محاولة للدفاع ضد هذا, ولكن بعد ذلك كل القراصنة يحتاج إلى القيام به هو تصحيح التطبيق الخاص بك إلى تعطيل التحقق من الترخيص كليا.

للعلم هذا "الضعف" ينطبق على ما إذا كان أو لا كنت تستخدم جافا.

إذا كنت تحاول منع الناس من تقويض ترخيص مخطط عقارب الساعة إلى الوراء ، تحتاج إلى تخزين أعلى الوقت كنت قد رأيت حتى الآن في نوع من تشفير التخزين الآمن ثم ثم تعطيل البرنامج إذا كان أي وقت يذهب أقل من أعلى رأيت (مع بعض بدل NTP الساعة تعديلات و تغييرات التوقيت الصيفي طبعا) ، أو إذا كانت بطريقة أو بأخرى العبث أو حذف التخزين الآمن.

أنا لا أعرف إذا كان nanoTime() من المرجح أن تتغير إذا كان النظام على مدار الساعة التغييرات ، ولكن أعتقد أنه من الممكن.أيضا nanoTime() قد لا تكون دقيقة.

إذا كنت حقا في حاجة إلى حماية من التغييرات على مدار الساعة, يمكنك مراقبة على مدار الساعة في الموضوع.النوم لمدة 100ms أو 1000ms ، ثم استدعاء وإذا ما اتخذت().إذا ساعة متقدمة أكثر من 1000 + x أو قد ذهب إلى الوراء ثم عرضة على مدار الساعة تغييرها (أو الخيط علقت على شيء ، وهو أمر ممكن).

في حال حدوث انفصال ، يمكن أن تجعل في الواقع شبكة الاتصال للتحقق.بالطبع من الممكن أن الشبكة الوقت قد تغير بسبب إدراج قفزة ثانية.أنا مرة قرأت سمبي تعليق من قبل بعض العلماء الذين كان التنسيق الفلكية البيانات من العديد من المصادر المختلفة.قفزة الثاني وأضاف خلال التجربة ، وقد خربت ذلك لأن بعض المواقع إدراج ذلك والبعض الآخر لا.

هناك احتمال آخر قد يكون استخدام مستوى منخفض native API للحصول على بعض نظام توقيت.مثل نظام أو شبكة الجهوزية لمعايرة API.ويندوز لديه getTickCount() الدالة بإرجاع عدد المللي ثانية منذ التمهيد.على أنظمة unix يمكنك استخدام الجهوزية الأمر إلى الحصول على تقدير تقريبي.يمكنك فحص دوري هذه القيم لمعرفة ما إذا كانت ساعة النظام قد تغير.

إذا كنت لا تمانع في إضافة بعض التعليمات البرمجية الأصلية الخاصة بك جافا التطبيق ، استخدام:

  • QueryPerformanceCounter() و QueryPerformanceFrequency() على ويندوز ؛ أو

  • POSIX clock_gettime() وظيفة مع CLOCK_MONOTONIC الساعة الهوية.

ملاحظة أن استخدام x86 TSC التسجيل يشجع على الأنظمة ذات المعالجات المتعددة, لذا من الأفضل استخدام فوق واجهات برمجة التطبيقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top