मुझे एहसास है कि यह माइक्रो-ऑप्टिमाइज़ेशन क्षेत्र में बहुत दूर है, लेकिन मुझे समझने में उत्सुकता है कि डेटटाइम पर कॉल क्यों करें.अब और डेटटाइम। यूटीसीएनओ इतनी "महंगी" । मेरे पास एक नमूना कार्यक्रम है जो कुछ "काम" करने (कुछ काउंटर में जोड़ने) करने के कुछ परिदृश्य चलाता है और इसे 1 सेकंड के लिए करने का प्रयास करता है। मैंने सीमित समय के लिए काम करने के कई दृष्टिकोण किए हैं। उदाहरणों से पता चलता है कि DateTime.Now और DateTime.UtcNow Environment.TickCount की तुलना में काफी कम होती है लेकिन यहां तक कि सिर्फ 1 सेकंड के लिए एक अलग थ्रेड नींद दे और फिर कर्मी धागा बंद करने के लिए इंगित करने के लिए एक मूल्य की स्थापना की तुलना में धीमी है।डेटटाइम क्यों हैं.अब डेटटाइम.यूटीसीएनओ इतनी धीमी/महंगी
- मुझे पता है कि UtcNow तेजी से है क्योंकि यह समय क्षेत्र जानकारी नहीं है, कारण है कि यह अभी भी बहुत बहुत धीमी है TickCount से:
तो मेरे सवालों इन कर रहे हैं?
- एक इंटीरियर से तेजी से बूलियन क्यों पढ़ रहा है?
- परिदृश्यों जहां आप समय की एक सीमित मात्रा में करने के लिए चलाने के लिए कुछ की अनुमति देनी होगी के इन प्रकार से निपटने का आदर्श तरीका क्या है, लेकिन आप और अधिक समय वास्तव में काम कर रही की तुलना में समय की जाँच बर्बाद नहीं करना चाहते हैं?
उदाहरण के शब्दाडंबर क्षमा करें:
class Program
{
private static volatile bool done = false;
private static volatile int doneInt = 0;
private static UInt64 doneLong = 0;
private static ManualResetEvent readyEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
MethodA_PrecalcEndTime();
MethodB_CalcEndTimeEachTime();
MethodC_PrecalcEndTimeUsingUtcNow();
MethodD_EnvironmentTickCount();
MethodX_SeperateThreadBool();
MethodY_SeperateThreadInt();
MethodZ_SeperateThreadLong();
Console.WriteLine("Done...");
Console.ReadLine();
}
private static void MethodA_PrecalcEndTime()
{
int cnt = 0;
var doneTime = DateTime.Now.AddSeconds(1);
var startDT = DateTime.Now;
while (DateTime.Now <= doneTime)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodB_CalcEndTimeEachTime()
{
int cnt = 0;
var startDT = DateTime.Now;
while (DateTime.Now <= startDT.AddSeconds(1))
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodC_PrecalcEndTimeUsingUtcNow()
{
int cnt = 0;
var doneTime = DateTime.UtcNow.AddSeconds(1);
var startDT = DateTime.Now;
while (DateTime.UtcNow <= doneTime)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodD_EnvironmentTickCount()
{
int cnt = 0;
int doneTick = Environment.TickCount + 1000; // <-- should be sane near where the counter clocks...
var startDT = DateTime.Now;
while (Environment.TickCount <= doneTick)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodX_SeperateThreadBool()
{
readyEvent.Reset();
Thread counter = new Thread(CountBool);
Thread waiter = new Thread(WaitBool);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountBool()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (!done)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitBool()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
done = true;
}
private static void MethodY_SeperateThreadInt()
{
readyEvent.Reset();
Thread counter = new Thread(CountInt);
Thread waiter = new Thread(WaitInt);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountInt()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (doneInt<1)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitInt()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
doneInt = 1;
}
private static void MethodZ_SeperateThreadLong()
{
readyEvent.Reset();
Thread counter = new Thread(CountLong);
Thread waiter = new Thread(WaitLong);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountLong()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (doneLong < 1)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitLong()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
doneLong = 1;
}
}
धन्यवाद जॉन नहीं देखा है। मैं टाइमर देखता हूँ। मुझे लगता है कि मेरे उदाहरण में "काम" गैर-यथार्थवादी है। हालांकि मैं उत्सुक था कि बड़ा प्रभाव कहां से आ रहा था। –
@ मेरा अन्य: मूल रूप से, काउंटर को बढ़ाने के काम की तुलना में, लगभग * किसी भी * काम को एक बड़े प्रभाव के रूप में गिनने जा रहा है :) –