30/09/2018, 16:02

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;
Đỗ Trung Quân viết 18:09 ngày 30/09/2018

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

Light Way viết 18:13 ngày 30/09/2018

À 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!

Đỗ Trung Quân viết 18:11 ngày 30/09/2018

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

Đỗ Trung Quân viết 18:15 ngày 30/09/2018

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

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

Light Way viết 18:10 ngày 30/09/2018

Đư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!

Đỗ Trung Quân viết 18:15 ngày 30/09/2018

Đư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:

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

Làm sao để có thể hiển thị syntax highlighting bằng markdown? Các bạn phải đánh dấu ``` như ví dụ dưới đây Chú ý, dấu ``` được tạo ra bởi nút nằm bên trái số 1 trên bàn phím, nút này sẽ là ~ khi bấm giữ Shift Ví dụ cho C Nội dung: ``` void main() { } ``` Và đừng quên ``` ở cuối Kết quả void main() { } Ví dụ cho Pascal Nội dung: ``` Program HelloWorld; Begin WriteLn('Hello world!') {no ";" is required after the last statement of a block - adding one adds a "null stateme…

Light Way viết 18:13 ngày 30/09/2018

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

Đỗ Trung Quân viết 18:11 ngày 30/09/2018

Ẹ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 =)).

Light Way viết 18:08 ngày 30/09/2018

đâ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);
Đỗ Trung Quân viết 18:17 ngày 30/09/2018

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;
}
Light Way viết 18:18 ngày 30/09/2018

Mình mới biết sơ về C chưa rành C++ 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

Đỗ Trung Quân viết 18:16 ngày 30/09/2018

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

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);
Light Way viết 18:07 ngày 30/09/2018

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

Light Way viết 18:13 ngày 30/09/2018

nó vẫn cứ ra 0.0000s

Đỗ Trung Quân viết 18:04 ngày 30/09/2018

Để 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);
}
Đỗ Trung Quân viết 18:03 ngày 30/09/2018

nó vẫn cứ ra 0.0000s

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.

Light Way viết 18:08 ngày 30/09/2018

À 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!

Đỗ Trung Quân viết 18:15 ngày 30/09/2018

Thế là mình thay for(int i=0; i<1; i++) bỏ code vô giữa thế là ra time luôn

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ế =)))

Light Way viết 18:15 ngày 30/09/2018

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 ?

Đỗ Trung Quân viết 18:09 ngày 30/09/2018

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 ?

Mình nghĩ cũng có thể do bạn chạy chương trình đã đc compile rồi nên nó vẫn ra là 0.000. Ca này khó ghê =))). MÌnh dùng devC. Compile lần đầu tiên ra 0.001s. Nhấn tiếp 3 phá nữa mới lại ra 0.001 =)). Thử 10 lần thấy Trung bình 3 lần ra 1 lần :))))))))))

Bài liên quan
0