Đo Thời Gian Thực Hiện Chương Trình C/C++/C# (Timer 4 Newbie)

Angels fall first
  • About
  • Pages

    • Home
    • About
  • Categories

    • An toàn và bảo mật thông tin
    • Các vấn đề khác
    • Cấu trúc dữ liệu và giải thuật
    • Computer Vision
    • CUDA
    • Dev tools
    • Hệ điều hành Windows
    • Hỏi đáp – thắc mắc
    • Kỹ thuật lập trình C
    • LaTeX
    • Lập trình C trên Windows
    • Lập trình Hướng đối tượng và C++
    • Music
    • Olympic Tin học ACM – Programming Contest
    • Phần mềm
    • Sách hay-Tiếng Việt
    • Simple about some things
    • Truyện cười
    • Đề cương ôn tập

Đo thời gian thực hiện chương trình C/C++/C# (Timer 4 newbie)

May 27, 2009 — 4fire

Đo thời gian thực hiện chương trình C/C++/C# (Timer 4 newbie)

Ngày 10/03/2014: Cập nhật với chuẩn C++11, xem bài viết tại đây (lưu ý phần đo thời gian với thư viện chrono ở trang 2 của bài báo). (Ngày cập nhật cuối: 30/3/2009) Chủ đề bài báo: C/C++/C# Trong các cuộc thi lập trình, các chương trình cài đặt các thuật toán cùng giải quyết một bài toán, chúng ta luôn có nhu cầu kiểm thử tốc độ thực hiện của các cài đặt bằng cách xem xét thời gian một đoạn chương trình hay một chương trình thực hiện là bao lâu. Trong bài báo nhỏ này, tôi xin cung cấp cách thức đo thời gian thực hiện của các chương trình được viết bằng các ngôn ngữ C/C++/C# trên DOS và trên Windows. 1. Đo thời gian thực hiện chương trình với ngôn ngữ C/C++ trên DOS Đối với môi trường DOS chúng ta có thể dùng hàm clock() để đo thời gian thực hiện của chương trình cho cả chương trình viết bằng C và C++. Hàm clock() có khai báo nằm trong file header time.h, giá trị trả về của hàm là thời gian bắt đầu từ lúc chương trình chạy cho tới lúc gọi hàm, tính bằng số giây nhân với hằng số CLOCKS_PER_SEC, hằng số CLOCKS_PER_SEC có giá trị như CLK_TCK. Ví dụ sau đo thời gian thực hiện của 600000000 vòng lặp rỗng: // file timer4c.c #include #include #include int main( void ) { long i = 600000000L; clock_t start, finish; double duration; // Do thoi gian cua mot su kien printf( “Thoi gian thuc hien %ld vong lap rong:”, i ); start = clock(); while( i– ) ; finish = clock(); duration = (double)(finish – start) / CLOCKS_PER_SEC; printf( “%2.1f giay\n”, duration ); system(“pause”); return 0; } 2. Đo thời gian thực hiện chương trình với ngôn ngữ C trên Windows Trên Windows chúng ta sử dụng hàm QueryPerformanceCounter(LARGE_INTEGER *) để thực hiện việc đo thời gian, hàm được khai báo trong file header windows.h. Hàm này có kiểu trả về là BOOL và trả về giá trị là thời gian tính bằng giây từ lúc chương trình bắt đầu chạy, tham số đầu vào là con trỏ tới một biến kiểu LARGE_INTEGER. Ví dụ sau là chương trình đo thời gian thực hiện 600000000 vòng lặp rỗng: // file timer4w.c #include #include // khai bao cau truc va cac ham typedef struct { LARGE_INTEGER start; LARGE_INTEGER stop; } stopWatch; void startTimer( stopWatch *timer) ; void stopTimer( stopWatch *timer) ; double LIToSecs( LARGE_INTEGER * L) ; double getElapsedTime( stopWatch *timer); void startTimer( stopWatch *timer) { QueryPerformanceCounter(&timer->start) ; } void stopTimer( stopWatch *timer) { QueryPerformanceCounter(&timer->stop) ; } double LIToSecs( LARGE_INTEGER * L) { LARGE_INTEGER frequency; QueryPerformanceFrequency( &frequency ) ; return ((double)L->QuadPart /(double)frequency.QuadPart) ; } double getElapsedTime( stopWatch *timer) { LARGE_INTEGER time; time.QuadPart = timer->stop.QuadPart – timer->start.QuadPart; return LIToSecs( &time) ; } // su dung cac ham int main() { long i = 600000000L; stopWatch timer; double duration; // Do thoi gian cua mot su kien printf( “Thoi gian thuc hien %ld vong lap rong:”, i ); startTimer(&timer); while( i– ) ; stopTimer(&timer); duration = getElapsedTime(&timer); printf( “%2.1f giay\n”, duration ); system(“pause”); return 0; } 3. Đo thời gian thực hiện của chương trình với C++ trên Windows Tương tự như đối với chương trình C trên Windows, ở đây ta cũng sử dụng hàm QueryPerformanceCounter(LARGE_INTEGER *), tuy nhiên ta xây dựng lớp CStopWatch để tiện dùng cho các chương trình khác nhau. // file timer4w.cpp #include #include using namespace std; typedef struct { LARGE_INTEGER start; LARGE_INTEGER stop; } stopWatch; // khai bao lop CStopWatch class CStopWatch { private: stopWatch timer; LARGE_INTEGER frequency; double LIToSecs( LARGE_INTEGER & L) ; public: CStopWatch() ; void startTimer( ) ; void stopTimer( ) ; double getElapsedTime() ; }; double CStopWatch::LIToSecs( LARGE_INTEGER & L) { return ((double)L.QuadPart /(double)frequency.QuadPart) ; } CStopWatch::CStopWatch() { timer.start.QuadPart=0; timer.stop.QuadPart=0; QueryPerformanceFrequency( &frequency ) ; } void CStopWatch::startTimer( ) { QueryPerformanceCounter(&timer.start) ; } void CStopWatch::stopTimer( ) { QueryPerformanceCounter(&timer.stop) ; } double CStopWatch::getElapsedTime() { LARGE_INTEGER time; time.QuadPart = timer.stop.QuadPart – timer.start.QuadPart; return LIToSecs( time) ; } // su dung lop CStopWatch int main() { long i = 600000000L; CStopWatch timer; double duration; // Do thoi gian cua mot su kien printf( “Thoi gian thuc hien %ld vong lap rong:”, i ); timer.startTimer(); while( i– ) ; timer.stopTimer(); duration = timer.getElapsedTime(); printf( “%2.1f giay\n”, duration ); system(“pause”); return 0; } 4. Đo thời gian thực hiện của chương trình với C# Bắt đầu từ .NET Framework 2.0, lớp StopWatch được cung cấp cho người dùng để tiến hành các công việc liên quan tới đo đếm thời gian thực hiện 1 tác vụ nào đó, lớp này nằm trong namespace System.Diagnostics. Ví dụ sau đây là chương trình đo thời gian thực hiện 600000000 vòng lặp rỗng: using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; namespace Timer { class Program { static void Main(string[] args) { Stopwatch st = new Stopwatch(); st.Start(); long i = 600000000L; Console.WriteLine(“Thoi gian thuc hien {0} vong lap rong:”, i); while (i > 0) –i; st.Stop(); Console.WriteLine(“{0} giay”, st.Elapsed.ToString()); if (Stopwatch.IsHighResolution) Console.WriteLine(“Timed with Hi res”); else Console.WriteLine(“Not Timed with Hi res”); Console.ReadKey(); } } } 5. Tài liệu tham khảo 1. MSDN 9.0, clock function (ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dv_vccrt/html/3e1853dd-498f-49ba-b06a-f2315f20904e.htm). 2. http://cplus.about.com/od/howtodothingsin1/a/timing.htm 3. http://cplus.about.com/od/howtodothingsi2/a/timing.htm 4. http://cplus.about.com/od/howtodothingsinc/a/timing.htm 5. Microsoft® Windows® Internals, Fourth Edition: Microsoft Windows Server™ 2003, Windows XP, and Windows 2000, Mark E. Russinovich, David A. Solomon

Mặc dù đã hết sức thận trọng và xem xét kỹ lưỡng các ví dụ đưa ra trong bài viết, tuy vậy vẫn có thể không tránh khỏi các sai sót, rất mong nhận được sự đóng góp ý kiến của các bạn độc giả. Mọi góp ý, thắc mắc xin gửi về địa chỉ email: tuannhtn@yahoo.com.

Share this:

  • Facebook
  • X
Like Loading...

Related

Posted in Kỹ thuật lập trình C, Lập trình C trên Windows, Lập trình Hướng đối tượng và C++. 1 Comment »

One Response to “Đo thời gian thực hiện chương trình C/C++/C# (Timer 4 newbie)”

    hung Says: July 4, 2012 at 2:50 pm

    thanks

    Reply

Leave a comment Cancel reply

Δ

« Office 2007 SP2 – New SP of the MS SPs Tình yêu » Proudly powered by WordPress
  • Links

    • 4zoom lớp đại học-Một thời đã rất xa
    • Barcelona FC site
    • Blackmore's Night
    • LiveTv.ru
    • Nightwish
    • Phần mềm mã nguồn mở
    • Rootkit
    • Secret Garden
    • Sopcast Links
    • Tàng thư viện
    • Tạp chí MSDN online
    • Tech Radar
    • The Codeplex site
    • The CodeProject site
    • The Verge
  • Archives

    • February 2015
    • January 2015
    • March 2014
    • January 2014
    • November 2013
    • May 2013
    • February 2013
    • January 2013
    • November 2012
    • September 2012
    • July 2012
    • May 2012
    • April 2012
    • March 2012
    • February 2012
    • October 2011
    • June 2010
    • March 2010
    • December 2009
    • November 2009
    • October 2009
    • August 2009
    • July 2009
    • June 2009
    • May 2009
    • April 2009
    • March 2009
    • August 2007
    • June 2007
  • Misc

    • Register
    • Log in
    • WordPress.org
    • Create a free website or blog at WordPress.com.
  • Comment
  • Reblog
  • Subscribe Subscribed
    • Angels fall first
    • Join 35 other subscribers Sign me up
    • Already have a WordPress.com account? Log in now.
    • Angels fall first
    • Customize
    • Subscribe Subscribed
    • Sign up
    • Log in
    • Copy shortlink
    • Report this content
    • View post in Reader
    • Manage subscriptions
    • Collapse this bar
%d Design a site like this with WordPress.comGet started

Từ khóa » Bộ đếm Thời Gian Trong C#