Thời gian thực hiện chương trình C


208

Tôi có một chương trình C nhằm mục đích chạy song song trên một số bộ xử lý. Tôi cần có khả năng ghi lại thời gian thực hiện (có thể là từ 1 giây đến vài phút). Tôi đã tìm kiếm câu trả lời, nhưng tất cả chúng dường như đề nghị sử dụng clock()hàm, sau đó liên quan đến việc tính toán số lượng đồng hồ mà chương trình đã chia cho Clocks_per_secondgiá trị.

Tôi không chắc cách tính Clocks_per_secondgiá trị?

Trong Java, tôi chỉ mất thời gian hiện tại tính bằng mili giây trước và sau khi thực hiện.

Có một điều tương tự trong C? Tôi đã có một cái nhìn, nhưng dường như tôi không thể tìm ra cách nào để có được bất cứ điều gì tốt hơn một độ phân giải thứ hai.

Tôi cũng biết rằng một hồ sơ sẽ là một lựa chọn, nhưng tôi đang tìm cách tự thực hiện một bộ đếm thời gian.

Cảm ơn


3
những khung OS / API nào bạn đang sử dụng / có sẵn? Chỉ đơn giản là C?
typo.pl

4
Đây là một chương trình khá nhỏ, chỉ đơn giản là C
Roger

Tôi đã viết chi tiết về việc triển khai một giải pháp di động trong câu trả lời này: stackoverflow.com/questions/361363/iêu
Alexander Saprykin

thời gian thực hiện để hoàn thành một chức năng stackoverflow.com/a/40380118/6180077
Abdullah Farweez

Câu trả lời:


344

CLOCKS_PER_SEClà một hằng số được khai báo trong <time.h>. Để lấy thời gian CPU được sử dụng bởi một tác vụ trong ứng dụng C, hãy sử dụng:

clock_t begin = clock();

/* here, do your time-consuming job */

clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

Lưu ý rằng điều này trả về thời gian dưới dạng loại dấu phẩy động. Điều này có thể chính xác hơn một giây (ví dụ: bạn đo 4,52 giây). Độ chính xác phụ thuộc vào kiến ​​trúc; trên các hệ thống hiện đại, bạn dễ dàng nhận được 10ms hoặc thấp hơn, nhưng trên các máy Windows cũ hơn (từ thời Win98), nó đã đạt gần 60ms.

clock()là tiêu chuẩn C; nó hoạt động "ở mọi nơi". Có các chức năng dành riêng cho hệ thống, chẳng hạn như getrusage()trên các hệ thống giống Unix.

Java System.currentTimeMillis()không đo lường điều tương tự. Đây là một "đồng hồ treo tường": nó có thể giúp bạn đo thời gian để chương trình thực hiện, nhưng nó không cho bạn biết thời gian sử dụng CPU là bao nhiêu. Trên một hệ thống đa nhiệm (tức là tất cả chúng), chúng có thể khác nhau rất nhiều.


1
Nó mang lại cho tôi kết quả rất ngẫu nhiên - tôi nhận được hỗn hợp số lớn / nhỏ / số âm trên cùng một đoạn mã. GCC 4.7 Linux 3.2 AMD64

3
Có: clock()trả về thời gian trong một số thang đo nội bộ được gọi là "đồng hồ" và CLOCKS_PER_SEClà số lượng đồng hồ mỗi giây, do đó chia CLOCKS_PER_SECcho sản lượng thời gian tính bằng giây. Trong mã ở trên, giá trị là một doubleđể bạn có thể mở rộng nó theo ý muốn.
Thomas Pornin

18
Cảnh báo lớn: clock () trả về lượng thời gian mà HĐH đã sử dụng để chạy quy trình của bạn và không phải là thời gian thực tế đã trôi qua. Tuy nhiên, điều này tốt cho việc định thời gian cho một khối mã, nhưng không đo thời gian trôi qua trong thế giới thực.

2
Ông nói rằng ông muốn đo lường một chương trình đa luồng. Tôi không chắc đồng hồ () phù hợp với điều này, vì nó tổng hợp thời gian chạy của tất cả các luồng, vì vậy kết quả sẽ như thế nào nếu mã được chạy tuần tự. Đối với những thứ như vậy tôi sử dụng omp_get_wtime (), nhưng tất nhiên tôi cần đảm bảo, hệ thống không bận rộn với các quy trình khác.
Youda008

1
Tôi nên đề cập đến một số điều mặc dù chủ đề này có liên quan hơn một năm trước: CLOCKS_PER_SEClà một long intgiá trị 1000000, cho thời gian tính bằng micrô giây khi không chia; không phải chu kỳ xung nhịp CPU. Do đó, không cần tính đến tần số động vì đồng hồ ở đây tính bằng micro giây (có thể là chu kỳ xung nhịp cho CPU 1 MHz?) Tôi đã thực hiện một chương trình C ngắn in giá trị đó và nó là 1000000 trên máy tính xách tay i7-2640M của tôi, với tần số động cho phép 800 MHz đến 2,8 GHz, thậm chí sử dụng Turbo Boost để tăng lên tới 3,5 GHz.
DDPWNAGE

111

Nếu bạn đang sử dụng shell Unix để chạy, bạn có thể sử dụng lệnh time.

đang làm

$ time ./a.out

giả sử a.out là tệp thực thi sẽ cho bạn thời gian để chạy cái này


3
@acgtyrant nhưng chỉ dành cho các chương trình đơn giản, vì sẽ mất toàn bộ thời gian của chương trình, bao gồm đầu vào, đầu ra, v.v.
phuclv

1
Nếu bạn đang sử dụng Linux và bạn đã giảm điểm chuẩn (vi mô) của mình xuống một chương trình có chi phí khởi động không đáng kể, ví dụ: chương trình thực thi tĩnh chạy vòng lặp nóng của bạn trong vài giây, bạn có thể sử dụng perf stat ./a.outđể nhận bộ đếm hiệu suất CTNH cho lỗi bộ nhớ cache và các chi nhánh sai, và IPC.
Peter Cordes

61

Ở đồng bằng vani C:

#include <time.h>
#include <stdio.h>

int main()
{
    clock_t tic = clock();

    my_expensive_function_which_can_spawn_threads();

    clock_t toc = clock();

    printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

    return 0;
}

6
Tên biến tốt nhất tôi đã thấy trong một thời gian. tic = "thời gian trong đồng hồ", toc = "hết giờ". Nhưng cũng tic-toc = "tick-tock". Đây là cách tôi dán nhãn thời gian lấy từ đây ra.
Logan Schelly

60

Bạn có chức năng muốn điều này:

#include <sys/time.h>

struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);
/* stuff to do! */
gettimeofday(&tv2, NULL);

printf ("Total time = %f seconds\n",
         (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
         (double) (tv2.tv_sec - tv1.tv_sec));

Lưu ý rằng biện pháp này tính bằng micrô giây, không chỉ giây.


2
Trình biên dịch MinGW dựa trên GCC. Vì vậy, nó sẽ làm việc trên nó. Nhưng nếu bạn sử dụng trình biên dịch C trực quan, thì bạn sẽ gặp lỗi.
dùng2550754

11
Có, nó sẽ hoạt động trên các cửa sổ với thư viện ac hỗ trợ cuộc gọi gettimeofday. Nó thực sự không quan trọng trình biên dịch là gì, bạn chỉ cần liên kết nó với một thư viện libc phong nha. Mà, trong trường hợp của mingw, không phải là cửa sổ mặc định.
Wes Hardaker

1
Điều này hoạt động với tôi trên Windows XP với cygwin gcc & Linux Ubuntu. Đây chỉ là những gì tôi muốn.
Tình yêu và hòa bình - Joe Codwell

gettimeofdayđã lỗi thời và không được khuyến nghị cho mã mới. Trang người dùng POSIX của nó khuyến nghị clock_gettime thay vào đó, cho phép bạn yêu cầu CLOCK_MONOTONICđiều đó không bị ảnh hưởng bởi các thay đổi đối với đồng hồ hệ thống, và do đó tốt hơn là một khoảng thời gian. (Xem câu trả lời của JohnSll ). Ví dụ, trên các hệ thống Linux hiện đại, gettimeofday về cơ bản là một trình bao bọc cho clock_gettime chuyển đổi nano giây thành micro giây.
Peter Cordes

12

Hầu hết các chương trình đơn giản có thời gian tính toán tính bằng mili giây. Vì vậy, tôi cho rằng, bạn sẽ tìm thấy điều này hữu ích.

#include <time.h>
#include <stdio.h>

int main(){
    clock_t start = clock();
    // Execuatable code
    clock_t stop = clock();
    double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
    printf("Time elapsed in ms: %f", elapsed);
}

Nếu bạn muốn tính thời gian chạy của toàn bộ chương trình và bạn đang sử dụng hệ thống Unix, hãy chạy chương trình của bạn bằng lệnh thời gian như thế nàytime ./a.out


Trong Windows ít nhất là hệ số ít nhất là 100 nhưng không phải 1000 và không chính xác
boctulus

6
Câu trả lời này không thêm bất cứ điều gì không có trong câu trả lời của Alexandre C từ hai năm trước.
Jonathan Leffler

3
@boctulus: 1s luôn là 1000ms, cũng trên windows.
kiềm

9

Rất nhiều câu trả lời đã được gợi ý clock()và sau đó CLOCKS_PER_SECtừ time.h. Đây có lẽ là một ý tưởng tồi, bởi vì đây là những gì /bits/time.htập tin của tôi nói:

/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
#  define CLOCKS_PER_SEC  1000000l

#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system.  */
#   include <bits/types.h>
extern long int __sysconf (int);
#   define CLK_TCK ((__clock_t) __sysconf (2))  /* 2 is _SC_CLK_TCK */
#  endif

Vì vậy, CLOCKS_PER_SECcó thể được định nghĩa là 1000000, tùy thuộc vào những tùy chọn bạn sử dụng để biên dịch, và do đó nó có vẻ không phải là một giải pháp tốt.


1
Cảm ơn thông tin nhưng có cách nào tốt hơn chưa?
ozanmuyes

4
Đây không phải là một vấn đề cơ bản: có, các hệ thống Posix luôn có CLOCK_PER_SEC==1000000, nhưng đồng thời, tất cả chúng đều sử dụng độ chính xác 1 -bạn để thực hiện đồng hồ (); Nhân tiện, nó có tài sản tốt để giảm các vấn đề chia sẻ. Nếu bạn muốn đo các sự kiện có khả năng rất nhanh, giả sử dưới 1 ms, thì trước tiên bạn nên lo lắng về độ chính xác (hoặc độ phân giải) của hàm clock (), nhất thiết phải thô hơn 1 1s trong Posix, nhưng cũng thường thô hơn nhiều ; giải pháp thông thường là chạy thử nghiệm nhiều lần; câu hỏi như được hỏi dường như không yêu cầu nó, mặc dù.
AntoineL

Tại sao nó không phải là một giải pháp tốt? Bạn nhận được một số giá trị từ clock(), nếu bạn chia giá trị đó với CLOCK_PER_SECbạn được đảm bảo để có thời gian tính bằng giây cpu đã lấy. Trách nhiệm đo tốc độ đồng hồ thực tế là trách nhiệm của clock()chức năng, không phải của bạn.
Zaffy

9

Câu trả lời của Thomas Pornin là macro:

#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)

Sử dụng nó như thế này:

TICK(TIME_A);
functionA();
TOCK(TIME_A);

TICK(TIME_B);
functionB();
TOCK(TIME_B);

Đầu ra:

time TIME_A: 0.001652 sec.
time TIME_B: 0.004028 sec.

4

Bạn phải tính đến việc đo thời gian thực hiện một chương trình để thực hiện phụ thuộc rất nhiều vào tải mà máy có trong thời điểm cụ thể đó.

Biết rằng, cách lấy được thời gian hiện tại trong C có thể đạt được theo những cách khác nhau, một cách dễ dàng hơn là:

#include <time.h>

#define CPU_TIME (getrusage(RUSAGE_SELF,&ruse), ruse.ru_utime.tv_sec + \
  ruse.ru_stime.tv_sec + 1e-6 * \
  (ruse.ru_utime.tv_usec + ruse.ru_stime.tv_usec))

int main(void) {
    time_t start, end;
    double first, second;

    // Save user and CPU start time
    time(&start);
    first = CPU_TIME;

    // Perform operations
    ...

    // Save end time
    time(&end);
    second = CPU_TIME;

    printf("cpu  : %.2f secs\n", second - first); 
    printf("user : %d secs\n", (int)(end - start));
}

Hy vọng nó giúp.

Trân trọng!


4

(Tất cả các câu trả lời ở đây đều thiếu, nếu sysadmin của bạn thay đổi thời gian hệ thống hoặc múi giờ của bạn có thời gian mùa đông và thời gian khác nhau. Do đó ...)

Khi sử dụng linux: clock_gettime(CLOCK_MONOTONIC_RAW, &time_variable); Sẽ không bị ảnh hưởng nếu quản trị viên hệ thống thay đổi thời gian hoặc bạn sống ở một quốc gia có thời gian mùa đông khác với thời gian mùa hè, v.v.

#include <stdio.h>
#include <time.h>

#include <unistd.h> /* for sleep() */

int main() {
    struct timespec begin, end;
    clock_gettime(CLOCK_MONOTONIC_RAW, &begin);

    sleep(1);      // waste some time

    clock_gettime(CLOCK_MONOTONIC_RAW, &end);

    printf ("Total time = %f seconds\n",
            (end.tv_nsec - begin.tv_nsec) / 1000000000.0 +
            (end.tv_sec  - begin.tv_sec));

}

man clock_gettime Những trạng thái:

CLOCK_MONOTONIC
              Clock  that  cannot  be set and represents monotonic time since some unspecified starting point.  This clock is not affected by discontinuous jumps in the system time
              (e.g., if the system administrator manually changes the clock), but is affected by the incremental adjustments performed by adjtime(3) and NTP.

Bạn có thể giải thích phép tính mà bạn đã sử dụng để có được số giây không? Không rõ ràng những gì đang xảy ra.
Colin Keenan

1
Sẽ không có (end.tv_nsec - begin.tv_nsec) / 1000000000.0kết quả này 0luôn luôn?
kiềm

@alk: không, chia cho một doublekích hoạt nghĩa đen int hoặc longđể doublechuyển đổi trước khi chia. Tất nhiên bạn chỉ có thể dính vào số nguyên và in tv_secphần đó và sau đó là phần phân số có số 0 như thế %ld.%09ld, nhưng chuyển đổi thành gấp đôi rất dễ dàng và độ chính xác 53 bit thường rất nhiều cho thời gian chuẩn.
Peter Cordes

1
(Rất tiếc, trừ các phần nano giây có thể cần phải mang theo vào phần giây, vì vậy sử dụng đôi và để cho nó được tránh tiêu cực rằng vấn đề. Để sử dụng một chuỗi định dạng số nguyên tinh khiết, bạn sẽ cần một timespec_subtractnhư timeval_subtractgợi ý trong cuốn hướng dẫn glibc : gnu.org/software/libc/manual/html_node/Elapsed-Time.html )
Peter Cordes

3

ANSI C chỉ xác định các hàm thời gian chính xác thứ hai. Tuy nhiên, nếu bạn đang chạy trong môi trường POSIX, bạn có thể sử dụng gettimeofday () cung cấp độ phân giải thời gian micro giây trong thời gian kể từ UNIX Epoch.

Một lưu ý phụ, tôi không khuyên bạn nên sử dụng clock () vì nó được triển khai kém trên nhiều hệ thống (nếu không phải tất cả?) Và không chính xác, bên cạnh thực tế là nó chỉ đề cập đến thời gian chương trình của bạn dành cho CPU và không phải là toàn bộ thời gian của chương trình, mà theo câu hỏi của bạn là những gì tôi cho rằng bạn muốn đo lường.


Tiêu chuẩn ISO C (giả sử đây là ý nghĩa của ANSI C ) không chỉ định độ chính xác của các hàm thời gian . Sau đó, cụ thể về triển khai POSIX hoặc trên Windows, độ chính xác của các chức năng của đồng hồ treo tường (xem câu trả lời của Thomas) chỉ trong vài giây. Nhưng độ chính xác của đồng hồ () thường lớn hơn và luôn luôn là 1 chuông trong Posix (không phụ thuộc vào độ chính xác.)
AntoineL

2

Mọi giải pháp đều không hoạt động trong hệ thống của tôi.

Tôi có thể sử dụng

#include <time.h>

double difftime(time_t time1, time_t time0);

2
Điều này mang lại sự khác biệt giữa hai time_tgiá trị là gấp đôi. Vì time_tcác giá trị chỉ chính xác đến một giây, nên nó có giá trị hạn chế trong việc in ra thời gian của các chương trình chạy ngắn, mặc dù nó có thể hữu ích cho các chương trình chạy trong thời gian dài.
Jonathan Leffler

Vì bất cứ lý do gì, việc chuyển qua một cặp clock_ts difftimedường như có tác dụng với tôi với độ chính xác của một phần trăm giây. Đây là trên linux x86. Tôi cũng không thể có được phép trừ stopstartđể làm việc.
ragerdl

@ragerdl: Bạn cần phải vượt qua difftime() clock() / CLOCKS_PER_SEC, vì nó mong đợi vài giây.
kiềm

2
    #include<time.h>
    #include<stdio.h>
    int main(){
clock_t begin=clock();

    int i;
for(i=0;i<100000;i++){
printf("%d",i);

}
clock_t end=clock();
printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

Chương trình này sẽ hoạt động như quyến rũ.


2

Tôi đã thấy rằng đồng hồ thông thường (), mọi người đều khuyên dùng ở đây, vì một số lý do khiến chúng ta chạy lệch khỏi chạy để chạy, ngay cả đối với mã tĩnh mà không có bất kỳ tác dụng phụ nào, như vẽ lên màn hình hoặc đọc tệp. Có thể là do CPU thay đổi chế độ tiêu thụ năng lượng, HĐH đưa ra các ưu tiên khác nhau, v.v ...

Vì vậy, cách duy nhất để có được kết quả tương tự mỗi lần với clock () là chạy mã được đo trong một vòng lặp nhiều lần (trong vài phút), thực hiện các biện pháp phòng ngừa để ngăn chặn trình biên dịch tối ưu hóa: trình biên dịch hiện đại có thể tính toán trước mã không có tác dụng phụ chạy trong một vòng lặp và di chuyển nó ra khỏi vòng lặp., giống như sử dụng đầu vào ngẫu nhiên cho mỗi lần lặp.

Sau khi đủ các mẫu được thu thập vào một mảng, người ta sắp xếp mảng đó và lấy phần tử ở giữa, được gọi là trung vị. Median tốt hơn mức trung bình, bởi vì nó loại bỏ các độ lệch cực lớn, như nói rằng chương trình chống vi-rút chiếm hết CPU hoặc HĐH thực hiện một số cập nhật.

Đây là một tiện ích đơn giản để đo hiệu suất thực thi của mã C / C ++, tính trung bình các giá trị gần trung vị: https://github.com/saniv/gauge

Bản thân tôi vẫn đang tìm kiếm một cách mạnh mẽ hơn và nhanh hơn để đo lường mã. Người ta có thể thử chạy mã trong các điều kiện được kiểm soát trên kim loại trần mà không cần bất kỳ HĐH nào, nhưng điều đó sẽ cho kết quả không thực tế, bởi vì trong thực tế, HĐH có liên quan.

x86 có các bộ đếm hiệu suất phần cứng này, bao gồm số lượng lệnh thực tế được thực thi, nhưng chúng rất khó truy cập mà không có sự trợ giúp của hệ điều hành, khó diễn giải và có vấn đề riêng ( http://archive.gamedev.net/archive/reference/articles /article213.html ). Tuy nhiên, chúng có thể hữu ích trong việc điều tra bản chất của cổ chai (truy cập dữ liệu hoặc tính toán thực tế trên dữ liệu đó).


Có, CPU x86 hiện đại nhàn rỗi chậm hơn nhiều so với max turbo. Tùy thuộc vào cài đặt "thống đốc", việc tăng tốc độ xung nhịp tối đa có thể mất một phần nghìn giây (Skylake với quản lý trạng thái P phần cứng, đặc biệt là với mức năng lượng_performance_preference được đặt thành performance) hoặc nhiều chục mili giây. vi.wikipedia.org/wiki/Docate_frequency_scaling . Và vâng, hiệu suất trung bình thường là một lựa chọn tốt; cao cấp thường có một số gai từ sự can thiệp.
Peter Cordes

Thường thì đặt cược tốt nhất của bạn để tránh việc tối ưu hóa công việc là đầu vào dòng lệnh và trả về kết quả. Hoặc viết một hàm trong một tệp riêng biệt từ mainđó lấy một đối số và trả về kết quả và không sử dụng tối ưu hóa thời gian liên kết. Sau đó, trình biên dịch không thể nội tuyến nó vào người gọi. Chỉ hoạt động nếu chức năng đã bao gồm một số loại vòng lặp, nếu không thì phí gọi / ret quá cao.
Peter Cordes

Trình biên dịch vẫn có thể tối ưu hóa đầu vào dòng lệnh đơn ra khỏi vòng lặp, nếu bạn xử lý nó bằng mã tĩnh mà không có bất kỳ tác dụng phụ nào. Vì vậy, tốt nhất là tạo một đầu vào ngẫu nhiên cho mỗi lần lặp. Rõ ràng rand () nên được gọi bên ngoài mã được đo, trước đồng hồ đầu tiên (), vì rand () cũng có thể dẫn đến một cuộc gọi hệ thống, lấy mẫu một số trình tạo entropy phần cứng (mà trên các hệ thống cũ là chuyển động của chuột). Chỉ cần đừng quên in từng bit của đầu ra, nếu không trình biên dịch có thể quyết định bạn không cần tất cả đầu ra như toàn bộ hoặc một phần của nó. Điều đó có thể được thực hiện với CRC32.
SmugLispWeenie

Nếu kiểm tra mã của bạn trong một tệp riêng biệt và bạn không sử dụng tối ưu hóa thời gian liên kết, thì không có cách nào trình biên dịch có thể thực hiện CSE để tối ưu hóa giữa các cuộc gọi. Người gọi không thể cho rằng bất cứ điều gì về callee không có bất kỳ tác dụng phụ có thể nhìn thấy. Điều này cho phép bạn đặt một cái gì đó tương đối ngắn bên trong một vòng lặp lặp lại để làm cho nó đủ dài theo thời gian, chỉ với chi phí cuộc gọi / ret. Nếu bạn để nó nội tuyến, thì bạn phải kiểm tra mã asm được tạo để đảm bảo nó không đưa ra một tính toán ra khỏi vòng lặp như bạn nói.
Peter Cordes

Cách dành riêng cho trình biên dịch là sử dụng (ví dụ) GNU C inline asm để buộc trình biên dịch cụ thể hóa kết quả trong một thanh ghi và / hoặc quên những gì nó biết về giá trị của biến, mà không thực sự đưa ra các hướng dẫn bổ sung. Tương đương "Thoát" và "Clobber" trong MSVC liên kết đến một video về cấu hình và vi điểm (nhà phát triển clang Chandler Carruth CppCon 2015) Không có MSVC tương đương, nhưng bản thân câu hỏi cho thấy các chức năng GNU C và cách sử dụng chúng.
Peter Cordes

0

Một số có thể thấy một loại đầu vào khác hữu ích: Tôi đã được cung cấp phương pháp đo thời gian này như một phần của khóa học đại học về lập trình GPGPU với NVidia CUDA ( mô tả khóa học ). Nó kết hợp các phương thức được thấy trong các bài viết trước đó và tôi chỉ đơn giản đăng nó vì các yêu cầu mang lại cho nó sự tin cậy:

unsigned long int elapsed;
struct timeval t_start, t_end, t_diff;
gettimeofday(&t_start, NULL);

// perform computations ...

gettimeofday(&t_end, NULL);
timeval_subtract(&t_diff, &t_end, &t_start);
elapsed = (t_diff.tv_sec*1e6 + t_diff.tv_usec);
printf("GPU version runs in: %lu microsecs\n", elapsed);

Tôi cho rằng bạn có thể nhân với ví dụ 1.0 / 1000.0để có được đơn vị đo phù hợp với nhu cầu của bạn.


1
gettimeofday đã lỗi thời và không được khuyến khích. clock_gettimeThay vào đó, trang man POSIX của nó khuyến nghị , cho phép bạn yêu cầu CLOCK_MONOTONICđiều đó không bị ảnh hưởng bởi các thay đổi đối với đồng hồ hệ thống, và do đó tốt hơn là một bộ đếm thời gian. Ví dụ, trên các hệ thống Linux hiện đại, gettimeofdayvề cơ bản , là một trình bao bọc để clock_gettimechuyển đổi nano giây thành micro giây. (Xem câu trả lời của JohnSll).
Peter Cordes

Phương pháp này được thêm vào bởi @Wes Hardaker, sự khác biệt chính là sử dụng timeval_subtract.
イ き

Ok, vì vậy phần hữu ích duy nhất trong câu trả lời của bạn là tên của hàm mà bạn không xác định và đó không phải là trong thư viện chuẩn. (Chỉ trong hướng dẫn sử dụng glibc: gnu.org/software/libc/manual/html_node/Elapsed-Time.html ).
Peter Cordes

-2

So sánh thời gian thực hiện sắp xếp bong bóng và sắp xếp lựa chọn Tôi có một chương trình so sánh thời gian thực hiện sắp xếp bong bóng và sắp xếp lựa chọn. Để tìm ra thời gian thực hiện một khối mã tính thời gian trước và sau khối bằng

 clock_t start=clock();
 
 clock_t end=clock();
 CLOCKS_PER_SEC is constant in time.h library

Mã ví dụ:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
   int a[10000],i,j,min,temp;
   for(i=0;i<10000;i++)
   {
      a[i]=rand()%10000;
   }
   //The bubble Sort
   clock_t start,end;
   start=clock();
   for(i=0;i<10000;i++)
   {
     for(j=i+1;j<10000;j++)
     {
       if(a[i]>a[j])
       {
         int temp=a[i];
         a[i]=a[j];
         a[j]=temp;
       }
     }
   }
   end=clock();
   double extime=(double) (end-start)/CLOCKS_PER_SEC;
   printf("\n\tExecution time for the bubble sort is %f seconds\n ",extime);

   for(i=0;i<10000;i++)
   {
     a[i]=rand()%10000;
   }
   clock_t start1,end1;
   start1=clock();
   // The Selection Sort
   for(i=0;i<10000;i++)
   {
     min=i;
     for(j=i+1;j<10000;j++)
     {
       if(a[min]>a[j])
       {
         min=j;
       }
     }
     temp=a[min];
     a[min]=a[i];
     a[i]=temp;
   }
   end1=clock();
   double extime1=(double) (end1-start1)/CLOCKS_PER_SEC;
   printf("\n");
   printf("\tExecution time for the selection sort is %f seconds\n\n", extime1);
   if(extime1<extime)
     printf("\tSelection sort is faster than Bubble sort by %f seconds\n\n", extime - extime1);
   else if(extime1>extime)
     printf("\tBubble sort is faster than Selection sort by %f seconds\n\n", extime1 - extime);
   else
     printf("\tBoth algorithms have the same execution time\n\n");
}

4
Điều này thực sự không thêm bất cứ điều gì mới so với câu trả lời của adimoh , ngoại trừ việc nó điền vào 'khối mã thực thi' (hoặc hai trong số chúng) với một số mã thực tế. Và câu trả lời đó không thêm bất cứ điều gì không có trong câu trả lời của Alexandre C từ hai năm trước.
Jonathan Leffler
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.