সি # ডেটটাইম.এখন নির্ভুলতা


97

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

আমি জানি একটি স্টপওয়াচ ক্লাস রয়েছে যা সঠিক সময় পরিমাপ করার জন্য আরও উপযুক্ত হবে তবে আমি আগ্রহী ছিলাম যদি কেউ ডেটটাইমে এই আচরণটি ব্যাখ্যা করতে পারে? ডেটটাইম.এখন (উদাহরণস্বরূপ, 50 এমএসের মধ্যে নির্ভুল?) এর জন্য কোনও সরকারী নির্ভুলতা নথিভুক্ত আছে? কেন ডেটটাইম.না এখন বেশিরভাগ সিপিইউ ঘড়ি যা পরিচালনা করতে পারে তার চেয়ে কম সুনির্দিষ্ট করা হবে? সম্ভবত এটি কেবল সর্বনিম্ন সাধারণ ডিনোমিনেটর সিপিইউ জন্য ডিজাইন করা হয়েছে?

public static void Main(string[] args)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();
    for (int i=0; i<1000; i++)
    {
        var now = DateTime.Now;
        Console.WriteLine(string.Format(
            "Ticks: {0}\tMilliseconds: {1}", now.Ticks, now.Millisecond));
    }

    stopwatch.Stop();
    Console.WriteLine("Stopwatch.ElapsedMilliseconds: {0}",
        stopwatch.ElapsedMilliseconds);

    Console.ReadLine();
}

বিরতি কীসের সময় আপনি একই মান ফিরে পাবেন?
ক্রিসএফ


যখন আমি উপরের কোডটি চালিয়েছি তখন টিক্স এবং মিলিসেকেন্ডগুলির জন্য আমি কেবল 3 টি অনন্য মান পেয়েছি এবং চূড়ান্ত স্টপ ঘড়ির সময়টি 147 এমএস ছিল, সুতরাং দেখা যাচ্ছে যে আমার মেশিনে এটি কেবল প্রায়
অ্যান্ডি হোয়াইট

আমার বলা উচিত, লুপটি অনেক সময় চালিয়েছিল, তবে আমি কেবল তিনটি পৃথক মান দেখেছি ...
অ্যান্ডি হোয়াইট

এখানে যে কারও কাছে আসার জন্য এখানে টিএল; ডিআর // কোয়েরি পারফরম্যান্স কাউন্টার ফাংশনটি ব্যবহার করুন "পারফরম্যান্স কাউন্টারটির বর্তমান মানটি পুনরুদ্ধার করে, যা একটি উচ্চ রেজোলিউশন (<1us) টাইম স্ট্যাম্প যা সময়-বিরতি পরিমাপের জন্য ব্যবহার করা যেতে পারে" " (পরিচালিত কোডের জন্য,
সিস্টেম

উত্তর:


184

কেন ডেটটাইম.না এখন বেশিরভাগ সিপিইউ ঘড়ি যা পরিচালনা করতে পারে তার চেয়ে কম সুনির্দিষ্ট করা হবে?

একটি ভাল ঘড়ি যথাযথ এবং সঠিক উভয় হতে হবে ; এগুলি আলাদা। পুরানো রসিকতা হিসাবে, একটি থামানো ঘড়ি দিনে দু'বার যথাযথ হয়, এক মিনিট ধীর ঘড়ি কোনও সময় কখনই নির্ভুল হয় না। তবে এক মিনিট ধীর ঘড়িটি সর্বদা নিকটতম মিনিটে নির্ভুল হয়, যেখানে থামানো ঘড়ির কোনও কার্যকারিতা যথাযথ থাকে না।

মাইক্রোসেকেন্ডটি যখন মাইক্রোসেকেন্ডের সাথে সম্ভবত সঠিক হতে পারে না তখন কেন ডেটটাইমটি যথাযথ হওয়া উচিত ? বেশিরভাগ মানুষের কাছে সরকারী সময় সংকেতের কোনও উত্স নেই যা মাইক্রোসেকেন্ডের সাথে সঠিক accurate অতএব এর দশমিক স্থান ছয় সংখ্যার দান স্পষ্টতা , গত পাঁচটি হয় আবর্জনা হবে মিথ্যা

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

সংক্ষেপে, "এটা কি সময়?" এবং "এটি কতদিন নিয়েছে?" সম্পূর্ণ ভিন্ন প্রশ্ন; অন্য প্রশ্নের উত্তর দেওয়ার জন্য একটি প্রশ্নের উত্তর দেওয়ার জন্য ডিজাইন করা কোনও সরঞ্জাম ব্যবহার করবেন না।

প্রশ্নের জন্য ধন্যবাদ; এটি একটি ভাল ব্লগ নিবন্ধ তৈরি করবে! :-)


4
@ এরিক লিপার্ট: "যথার্থতা" এবং "নির্ভুলতার" মধ্যে পার্থক্যের মূল বিষয়টিতে রাইমন্ড চেনের বয়স্ক কিন্তু গুডি রয়েছে: ব্লগস.এমএসডন.ল্ডনেউথিং
জেসন

4
ঠিক আছে, নির্ভুলতা বনাম নির্ভুলতা সম্পর্কে ভাল পয়েন্ট। আমি অনুমান করি যে আমি এখনও ডেটটাইম সঠিক নয় এমন বিবৃতিটি সত্যই কিনতে পারি না কারণ "এটি হওয়ার দরকার নেই।" আমার যদি একটি লেনদেনের ব্যবস্থা থাকে এবং আমি প্রতিটি রেকর্ডের জন্য একটি ডেটটাইম চিহ্নিত করতে চাই, আমার কাছে ডেটটাইম ক্লাসটি ব্যবহার করা স্বজ্ঞাত মনে হয়, তবে মনে হয়। নেট এ আরও সঠিক / সুনির্দিষ্ট সময় উপাদান রয়েছে, সুতরাং কেন ডেটটাইম হবে কম সক্ষম করা। আমার ধারণা আমি আরও কিছু পড়তে হবে ...
অ্যান্ডি হোয়াইট

11
ঠিক আছে অ্যান্ডি, ধরুন আপনার কাছে এমন ব্যবস্থা আছে। একটি মেশিনে আপনি লেনদেনটিকে 1 লা জানুয়ারী, 12: 34: 30.23498273 হিসাবে চিহ্নিত হিসাবে চিহ্নিত করেন। আপনার ক্লাস্টারের অন্য একটি মেশিনে আপনি লেনদেনটিকে 1 লা জানুয়ারী, 12: 34: 30.23498456 হিসাবে চিহ্নিত হিসাবে চিহ্নিত করেছেন। প্রথম কোন লেনদেন ঘটেছিল? আপনি যদি না জানেন যে দুটি মেশিনের ঘড়ি একে অপরের মাইক্রোসেকেন্ডের মধ্যে সিঙ্ক্রোনাইজ হয়েছে, আপনার কোন ধারণা নেই যে কোনটি প্রথমে ঘটেছে। অতিরিক্ত নির্ভুলতা আবর্জনা বিভ্রান্ত করছে । আমার যদি উপায় থাকে তবে সমস্ত ডেটটাইমগুলি ভিবিএস স্ক্রিপ্টের মতো, নিকটতম দ্বিতীয়টিতে গোল করা হবে।
এরিক লিপার্ট

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

4
আসুন আমি বলি যে আমি একটি ক্রিয়াকলাপ লগ তৈরি করছি যা প্রয়োজন (1) ক্যালেন্ডারের জায়গার ক্ষেত্রে কিছু ঘটেছে তা জেনে (কয়েক সেকেন্ডের মধ্যে) (২) ইভেন্টের মধ্যে ঠিক ঠিক দূরত্ব (50 বা তাই মিলি সেকেন্ডের মধ্যে) জেনে। মনে হচ্ছে এটির জন্য সবচেয়ে নিরাপদ বাজিটি হ'ল প্রথম কর্মের টাইমস্ট্যাম্পের জন্য ডেটটাইম.এখন ব্যবহার করা হবে, তারপরে প্রাথমিক ডেটটাইম থেকে অফসেট নির্ধারণের জন্য পরবর্তী ক্রিয়াগুলির জন্য স্টপওয়াচ ব্যবহার করুন। এরিক, আপনি কি পরামর্শ দেওয়ার পরামর্শ দিচ্ছেন?
ডেভুসার

18

ডেটটাইমের যথার্থতা যে সিস্টেমটি চলছে তার সাথে কিছুটা সুনির্দিষ্ট। যথার্থতা প্রসঙ্গের সুইচের গতির সাথে সম্পর্কিত, যা প্রায় 15 বা 16 এমএস হতে থাকে। (আমার সিস্টেমে এটি আমার পরীক্ষার থেকে প্রায় 14 এমএস দূরে, তবে আমি এমন কয়েকটি ল্যাপটপ দেখেছি যেখানে এটি 35-40 এমএস নির্ভুলতার কাছাকাছি রয়েছে।)

পিটার ব্রমবার্গ সি # তে উচ্চ নির্ভুলতার কোড টাইমিংয়ের উপর একটি নিবন্ধ লিখেছিলেন , যা এটি নিয়ে আলোচনা করে।


4
আমি 4 টি উইন 7 মেশিনগুলিকে কয়েক বছর ধরে ধরে ফেলেছিলাম যা প্রায় 1 মিমি নির্ভুলতা ছিল। এখন () নিদ্রা (1) এখন () সর্বদা ডেটটাইমটিতে যখন আমি পরীক্ষা করছিলাম তখন 1 মিলিয়ন ডলার পরিবর্তনের ফলস্বরূপ।
বেনজি 14'15

আমি পাশাপাশি 1 মিলিয়ন ডলারের নির্ভুলতাও দেখছি।
টিমো

12

আমি একটি সুনির্দিষ্ট ডেটটাইম চাই N এখন :), তাই আমি এটি রান্না করেছি:

public class PreciseDatetime
{
    // using DateTime.Now resulted in many many log events with the same timestamp.
    // use static variables in case there are many instances of this class in use in the same program
    // (that way they will all be in sync)
    private static readonly Stopwatch myStopwatch = new Stopwatch();
    private static System.DateTime myStopwatchStartTime;

    static PreciseDatetime()
    {
        Reset();

        try
        {
            // In case the system clock gets updated
            SystemEvents.TimeChanged += SystemEvents_TimeChanged;
        }
        catch (Exception)
        {                
        }
    }

    static void SystemEvents_TimeChanged(object sender, EventArgs e)
    {
        Reset();
    }

    // SystemEvents.TimeChanged can be slow to fire (3 secs), so allow forcing of reset
    static public void Reset()
    {
        myStopwatchStartTime = System.DateTime.Now;
        myStopwatch.Restart();
    }

    public System.DateTime Now { get { return myStopwatchStartTime.Add(myStopwatch.Elapsed); } }
}

4
আমি এই সমাধানটি পছন্দ করি, তবে আমি নিশ্চিত ছিলাম না, তাই আমি আমার নিজের প্রশ্নটি ( স্ট্যাকওভারফ্লো . com / q / 18257987 / 270348 ) জিজ্ঞাসা করেছি । সার্ভির মন্তব্য / উত্তর অনুসারে, আপনার কখনও স্টপওয়াচটি পুনরায় সেট করা উচিত নয়।
রবসিক্লোস

4
হতে পারে আপনার প্রসঙ্গে নয়, তবে পুনরায় সেট করা আমার প্রসঙ্গে অর্থবোধ করে - আমি ঠিক নিশ্চিত করি সময়টি আসলে শুরু হওয়ার আগেই এটি হয়ে গেছে।
জিমি

আপনার সাবস্ক্রিপশন দরকার নেই এবং আপনার স্টপওয়াচটি পুনরায় সেট করার দরকার নেই। প্রতি 10 মিমি প্রতি এই কোডটি চালানো প্রয়োজনীয় নয় এবং সিপিইউ গ্রহণ করে। এবং এই কোডটি মোটেই থ্রেড-নিরাপদ নয়। স্রেফ myShopwatchStartTime = তারিখটাইম.আটসিএনও আরম্ভ করুন; স্থির কন্সট্রাক্টর একবার।
VeganHunter

4
@ ওয়েগানহান্টার আমি আপনার মন্তব্যটি সঠিকভাবে বুঝতে পারছি কিনা তা নিশ্চিত নই, তবে আপনি কি মনে করেন যে টাইমচ্যাঞ্জড প্রতি 10 মিনিটে ডাকা হবে? এটা হয় না।
জিমি

@ জিমি, আপনি ঠিক বলেছেন। আমার খারাপ, আমি কোডটি ভুল বুঝেছি। SystemEvents.TimeChanged ইভেন্টটি কেবল তখনই বলা হয় যদি ব্যবহারকারী সিস্টেমের সময় পরিবর্তন করে। এটি একটি বিরল ঘটনা।
VeganHunter

6

থেকে দুটিই MSDN আপনি যে পাবেন DateTime.Nowএকটি হয়েছে আনুমানিক সব NT তে অপারেটিং সিস্টেম 10 মিলিসেকেন্ড রেজল্যুশন।

আসল যথার্থতা হার্ডওয়্যার নির্ভর। ব্যবহার করে আরও ভাল নির্ভুলতা পাওয়া যায় QueryPerformanceCounter


5

এটির মূল্য কী, এর জন্য প্রকৃতপক্ষে। নেট উত্স যাচাই করা খুব কম, এরিক লিপার্ট এই এসও প্রশ্নে একটি মন্তব্য প্রদান করে বলেছেন যে ডেটটাইম প্রায় 30 এমএসের সঠিক accurate তাঁর কথায় ন্যানোসেকেন্ড সঠিক না হওয়ার যুক্তিটি হ'ল এটি হওয়ার দরকার নেই।


4
এবং এটি আরও খারাপ হতে পারে। ভিবিএস স্ক্রিপ্টে এখন () ফাংশনটি প্রত্যাবর্তিত ফলাফলটিকে নিকটতম দ্বিতীয়টিতে ঘিরে রেখেছে, প্রত্যাশিত মানটি যে মাইক্রোসেকেন্ডে যথাযথভাবে উপলব্ধ করার জন্য পর্যাপ্ত পরিমাণে নির্ভুলতা পেয়েছে তা প্রত্যাখ্যান করুন। সি # তে কাঠামোটিকে ডেটটাইম বলা হয়; এটি নির্দিষ্ট জীবন-বীমা অ-বৈজ্ঞানিক ডোমেনগুলির জন্য একটি তারিখ এবং একটি সময় উপস্থাপনের উদ্দেশ্যে করা হয়েছে যেমন আপনার জীবন বীমা শেষ হয়ে যায় বা আপনার শেষ পুনরায় বুট হওয়ার পরে কত দিন হয়ে যায়। এটি উচ্চ-নির্ভুলতা সাব-সেকেন্ড সময় নির্ধারণের উদ্দেশ্যে নয়।
এরিক লিপার্ট


1

এই সম্পত্তিটির রেজোলিউশন সিস্টেম টাইমারের উপর নির্ভর করে যা অন্তর্নিহিত অপারেটিং সিস্টেমের উপর নির্ভর করে। এটি 0.5 থেকে 15 মিলিসেকেন্ডের মধ্যে থাকে

ফলস্বরূপ, অল্প সময়ের ব্যবধানে, যেমন একটি লুপের মধ্যে এখন পুনরায় সংখ্যায় পুনরায় কলগুলি একই মানটি ফিরিয়ে দিতে পারে।

এমএসডিএন লিংক

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