2011-10-11 16 views
9

समय की गिनती करते समय मुझे सी # के ब्लॉक को निष्पादित करने के लिए एक सरल तरीका (और यदि संभव हो तो कॉम्पैक्ट) की आवश्यकता है। इस सी ++ कोड के लिए कुछ इसी तरह:सी # कोड के ब्लॉक को आसानी से कैसे समय दें?

elapsed = time_call([&] 
    { 
     for_each (a.begin(), a.end(), [&](int n) { 
     results1.push_back(make_tuple(n, fibonacci(n))); 
     }); 
    }); 

जहां time_call है:

// Calls the provided work function and returns the number of milliseconds 
// that it takes to call that function. 
template <class Function> 
__int64 time_call(Function&& f) 
{ 
    __int64 begin = GetTickCount(); 
    f(); 
    return GetTickCount() - begin; 
} 

मैं स्टॉपवॉच रास्ता ... अधिक कॉम्पैक्ट कुछ भी पता है?

+3

क्या 'Stopwatch' साथ गलत क्या है? – SLaks

+1

स्टॉपवॉच तरीका कोड की लगभग 3 पंक्तियां लेता है, आप इसे कैसे कॉम्पैक्ट करना चाहते हैं? – harold

उत्तर

13
TimeSpan TimeAction(Action blockingAction) 
{ 
    Stopwatch stopWatch = System.Diagnostics.Stopwatch.StartNew(); 
    blockingAction(); 
    stopWatch.Stop(); 
    return stopWatch.Elapsed; 
} 

उपयोग:

var elapsed = TimeAction(() => 
    { 
     //Code to time 
    }); 

अपने नमूना कोड (और GetTickCount के उपयोग) के आधार पर आप ElapsedTicks बजाय Elapsed वापस जाने के लिए चाहते हो सकता है।

+1

स्पष्ट रूप से प्रदान किया गया कि 'क्रिया' अवरुद्ध है (यानी async नहीं)। – Joey

+0

सिस्टम। डायग्नोस्टिक्स डिफ़ॉल्ट रूप से "उपयोग" नहीं है। और यह 'System.Diagnostics.Stopwatch.StartNew()', 'नया StopWatch.StartNew()' नहीं होगा। – Philip

+0

@ जॉय: सही, स्पष्ट पैरामीटर नाम स्पष्ट करने के लिए। –

0

मुझे स्टॉपवॉच रास्ता नहीं पता है, लेकिन सी # में लैम्बडा भी है, इसलिए यह time_call() के समान कुछ लागू करने के लिए पर्याप्त आसान होना चाहिए।

6
public double TimeCall(Action actionToExecute) 
{ 
    double elapsed = 0; 

    if (actionToExecute != null) 
    { 
     var stopwatch = Stopwatch.StartNew(); 
     actionToExecute.Invoke(); 
     elapsed = stopwatch.ElapsedMilliseconds; 
    } 

    return elapsed; 
} 

कैसे-करें का उपयोग करें:

var elapsed = TimeCall(() => { foreach(...) }); 
संबंधित मुद्दे