Câu hỏi về thời gian thực hiện của mã (Execution time)

Mình mới biết đến 1 công cụ tính thời gian thực thi 1 đoạn code có vẻ rất thú vị nhưng lại chưa hiểu rõ lắm về nó nên mình muốn tham khảo ý kiến các bạn về topic này. Bạn nào rành về mảng này có thể giải thích cho mình hiểu hơn về nó với! Tại sao đoạn code này chạy cỡ nào time cũng ra 0s trong khi các đoạn clip của anh Đạt lại ra phần bao nhiêu đó của giây 1 cách chính xác. Mình xin cám ơn!

clock_t begin, end;
double time_spent;

begin = clock();
/* here, do your time-consuming job */
end = clock();
time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

Nếu bạn chạy đoạn này nó ra 0 là đúng rồi vì nó có tính thời gian chạy cái gì đâu bạn
Bạn thử cho 1 vòng for tính tổng từ 1 đến 10 vào giữa xem nào

À không, đoạn giữa begin = clock(); với end = clock(); mình ntn cơ:

char ky_tu = 'c';
switch (ky_tu)
{
	case 'a': printf("a\n"); break;
	case 'b': printf("b\n"); break;
	default: printf("Don't have this word!\n"); break;
}
printf("%c is number:%d\n",'a','a');
printf("%c is number:%d\n",'b','b');
printf("%c is number:%d\n", ky_tu, ky_tu);
printf("%d is character:%c\n", 100, 100);

Chưa hiểu dùng sai chỗ nào vẫn 0s thôi!

1 Like

Để mình thử xem kết quả thế nào.

1 Like

Chẳng sai gì cả @@. Mình chạy cũng bằng 0 :))). WHy???

1 Like

Đưa nguyên source bạn dò lại dùm mình thử biết đâu sai đâu đó ở trên mà mình không nhận ra wink:

void main()
{
	clock_t begin, end;
	double time_spend;
	begin = clock();

	char ky_tu = 'c';
	switch (ky_tu)
	{
		case 'a': printf("a\n"); break;
		case 'b': printf("b\n"); break;
		default: printf("Don't have this word!\n"); break;
	}
	printf("%c is number:%d\n",'a','a');
	printf("%c is number:%d\n",'b','b');
	printf("%c is number:%d\n", ky_tu, ky_tu);
	printf("%d is character:%c\n", 100, 100);

	end = clock();
	time_spend = (double)(end - begin);
	printf("execution time:%ld s", time_spend);
	getch();
}

Còn thư viện thì stdio.h conio.h và time.h nha!

Bạn dùng markdown sai rồi nhé. Xem tại đây

Không báo lỗi nhưng kq vẫn vậy :’(

Ẹc, thế chắc cú pháp câu lệnh của bạn làm sao. Xem lại lần nữa =)).

đây, chỉ sửa chỗ này thôi!

time_spend = (double)((end - begin) * 10 * 10 * 10)/(CLOCKS_PER_SEC);
printf("execution time:%ld s", time_spend);

Chỗ này là sai bạn ạ. Mình thay code C bằng code C++ khác mỗi chỗ in ra màn hình thôi. Thì nó in ra được đáp án. @@

#include <time.h>
#include <iostream>

using namespace std;

int main()
{
    clock_t begin, end;
    double time_spend;

    begin = clock();

    char ky_tu = 'c';
	switch (ky_tu)
	{
		case 'a': printf("a\n"); break;
		case 'b': printf("b\n"); break;
		default: printf("Don't have this word!\n"); break;
	}
	printf("%c is number:%d\n",'a','a');
	printf("%c is number:%d\n",'b','b');
	printf("%c is number:%d\n", ky_tu, ky_tu);
	printf("%d is character:%c\n", 100, 100);

    end = clock();


    time_spend = ((double)( end - begin )) / CLOCKS_PER_SEC;

    cout << time_spend << " seconds" << endl;

    return 0;
}

Mình mới biết sơ về C chưa rành C++ :smiley: nhưng mà chạy code của bạn mình không hiểu sao nó tắt màn hình nhanh quá, có cách nào dừng màn hình không? Mình đã thử system(“pause”); vẫn không được :frowning:

Hix. Cuối cùng cũng tìm ra vì sao.
Mình thử chạy trên C++ thay mỗi chỗ in ra màn hình và được đáp án. Như vậy bạn sai chỗ này này

   printf("execution time:%ld s", time_spend);

Bạn sửa %ld thành %lf nhé

   printf("execution time:%0.4lf s", time_spend);
1 Like

À mình thử bỏ return và thay int main = void main thì lại dừng được :smile: nhưng vẫn 0s :frowning:

1 Like

nó vẫn cứ ra 0.0000s :frowning:

Để cho nó chắc hơn bạn sửa lại hẳn thành thế này đi

#include <time.h>
#include <stdio.h>
int main()
{
	clock_t begin, end;
	double time_spend;
	begin = clock();
	
	for(int i;i<10000;i++){
		printf("%d",i);
	}
	end = clock();
	time_spend = ((double)( end - begin )) / CLOCKS_PER_SEC;
	printf("\nexecution time:%0.4lf s", time_spend);
}

Tại chương trình của bạn ngắn quá. Nó sẽ ra đáp số 0.001s. Thỉnh thoảng nó sẽ ra 0.000. ~.~. Mình cũng bị vậy.

À mình hiểu rồi! Thì ra phải cho nó vô vòng lặp thì đồng hồ mới bấm giờ được chứ để không không nó không đo đc là phải. Bạn cho vòng lặp 10000 lần nó ra time thiệt, nhưng chạy nhiều lần quá trong khi mình chỉ cần đo time 1 lần đoạn code đó. Thế là mình thay for(int i=0; i<1; i++) bỏ code vô giữa thế là ra time luôn. Cám ơn bạn rất nhiều nha! :wink:

1 Like

Không, không phải vậy đâu @@. Bạn để nguyên nó cũng ra time. bạn phải compile lại chương trình sau mỗi lần chứ k phải chạy luôn.
Bây giờ bạn bỏ vòng for đi. sửa code y như ban đầu. Nó sẽ ra. Mình tin là như thế =)))

Mình thử rồi, nó lại ra 0.0000 . Mà trong clip thấy anh Đạt ra 0.0047 lận. Nhưng mình viết bằng Visual Studio 2013 còn anh Đạt viết bằng CodeBlock. Có khi nào compile mình nhanh hơn không ta ? :blush:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?