Tối ưu hóa code (optimize code)

Chào các bạn

Mình đang tìm hiểu cách để tối ưu hóa code và có 2 đoạn như sau

Cách 1:

int check_left()
{
	int y = column_input;

	if(table[row_input][column_input-1] == turn || table[row_input][column_input-1] == 0)
		return 0;

	for(int i = column_input - 2; i >= 0; --i){
		if(table[row_input][i] == 0)
			return 0;

		if(table[row_input][i] == turn){
			y = i;
			check = 1;
			break;
		}
	}

	for(int j = y+1; j <= column_input; ++j)
		table[row_input][j] = turn;

	return 0;
}	

Cách 2:

int check_left(int *row_input, int *column_input)
{
	int y = (*column_input);

	if(table[(*row_input)][(*column_input)-1] == turn || table[(*row_input)][(*column_input)-1] == 0)
		return 0;

	for(int i = (*column_input) - 2; i >= 0; --i){
		if(table[(*row_input)][i] == 0)
			return 0;

		if(table[(*row_input)][i] == turn){
			y = i;
			check = 1;
			break;
		}
	}

	for(int j = y+1; j <= (*column_input); ++j)
		table[(*row_input)][j] = turn;

	return 0;
}	

Cho mình hỏi 2 cách trên có khác nhau gì về hiệu xuất, bộ nhớ, tốc độ không ạ. Mình nghĩ sử dụng pointer sẽ nhanh hơn, nhưng chính xác như thế nào thì mình không rõ.

Mong được chỉ giáo ạ, mình xin cảm ơn

Dùng con trỏ sẽ phù hợp nếu bạn truyền struct, vì ko phải copy struct.

6 Likes

ở ví dụ này thì mình nghĩ thay một biến int thành một con trỏ int thì hiệu suất không thay đổi.
Lấy một ví dụ mà mình nghĩ sử dụng con trỏ sẽ tốt hơn sử dụng biến:

// used variable
int arr[1000]
...
void main()
{
    for(int i = 0; i< sizeof(arr); i++){
        if(arr[i] > XXX){
            arr[i] = XXX;
        }
    }
}

// used pointer
int arr[1000]
...
void main()
{
    int *ptr;
    ptr = &arr[0];
    for(; ptr < &arr[1000];){
        if( *ptr > XXX){
            *ptr = XXX;
        }
        ptr++;
    }
}

Lý do:
VD1: mỗi lần thực hiện vòng for để access vào một biến của mảng thì CPU sẽ load địa chỉ của mảng (&arr[0] ) rồi cộng thêm index của biến mới ra được địa chỉ của biến cần access.
VD2: địa chỉ của con trỏ chính là địa chỉ của biến. Không cần thực hiện thao tác như VD1

1 Like

Thật ra thì compiler thông mình lắm, nên code này nó sẽ biên dịch ra mã y chang nhau nha bạn (Sau khi đã fix bug trong VD1 :stuck_out_tongue: )

Link tham khảo: https://gcc.godbolt.org/z/vxrMTe

PS: Khi bàn về tối ưu, đừng nghĩ mà hãy benchmark.

8 Likes

2 ví dụ của mình cũng chả khác nhau tẹo nào phải không ạ

Nếu bạn thay int bằng struct T thì khác đó.
VD: game_state -> turn

Còn tham số vẫn là int thì tùy mức -O2 hay -O3 (mạnh tay hơn).

6 Likes

Ví dụ của bạn thì lại là 1 kiểu khác hẳn nha:

  • Của người ta là truy xuất thông qua index hoặc là truy xuất thông qua con trỏ tới mảng.
  • Còn của bạn là truy xuất thông qua index hoặc là truy xuất thông qua con trỏ tới index.

Và nói thật là cách sau chỉ có tác dụng làm rối người đọc và cả compiler chứ chẳng có tác dụng gì optimize cả :stuck_out_tongue:
Thậm chí có khi còn làm chậm chương trình đi cơ.

8 Likes

Cảm ơn bạn, mình sẽ tìm hiểu thêm :cry:

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