Trong đó có 1 điểm đáng chú ý là việc for từ max-1-->0 nhanh hơn từ 0-->max-1 do chi phí để so sánh i!=0 sẽ ít tốn hơn là so i
#include <conio.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
void main()
{
unsigned long i = 0;
unsigned long maxi = 10000000;
printf("\tIs for(i=maxi-i;i--;) is faster than for(i=0;i<maxi;i++)?\n\n");
//test 1: run from 0 to maxi-1
printf("Test 1: run from 0 to maxi-1\n");
clock_t t1 = clock();
for(i = 0;i<maxi;i++)
{
double s1 = sin(double(i));
double s2 = cos(double(i));
double s3 = sin(double(-i));
double s4 = cos(double(-i));
}
clock_t t2 = clock();
printf("Time: %f\n\n", double(t2-t1)/CLOCKS_PER_SEC);
//test 3: run from maxi-1 down to 0
printf("Test 2: run from maxi-1 down to 0\n");
clock_t t3 = clock();
for(i = maxi-1;i--;)
{
double s1 = sin(double(i));
double s2 = cos(double(i));
double s3 = sin(double(-i));
double s4 = cos(double(-i));
}
clock_t t4 = clock();
printf("Time: %f\n\n", double(t4-t3)/CLOCKS_PER_SEC);
//test 3: run from 0 to maxi-1 again
printf("Test 3: run from 0 to maxi-1 again\n");
clock_t t5 = clock();
for(i = 0;i<maxi;i++)
{
double s1 = sin(double(i));
double s2 = cos(double(i));
double s3 = sin(double(-i));
double s4 = cos(double(-i));
}
clock_t t6 = clock();
printf("Time: %f\n", double(t6-t5)/CLOCKS_PER_SEC);
getch();
}
Chương trình sẽ thực hiện 3 test, mỗi test đều tính sin, cos cho biến lặp i và -i. Test 1 & 3 sẽ đo thời gian khi for từ 0 đến maxi-1 và test 2 sẽ đo thời gian khi for từ maxi-1 về 0.
Kết quả cho ở hình dưới đây cho thấy thời gian 3 test là như nhau.
Như vậy for từ 0 đến maxi-1 hay ngược lại đều nhanh như nhau đối với CPU. Nguyên nhân là do tốc độ CPU hiện tại đã rất nhanh rồi nên những tối ưu như thế này không có ý nghĩa nhiều. Tuy nhiên điều này sẽ khác nếu chạy trên những thiết bị với bộ xử lý yếu hơn như trên mobile, thiết bị khác.
Không có nhận xét nào:
Đăng nhận xét