【发布时间】:2018-12-23 08:31:21
【问题描述】:
我正在尝试学习如何优化我的 c 代码,所以我在互联网上找到了一些文章并重新制作了我的函数,以便它可以更快地执行。当我在没有优化标志的情况下编译它时它可以工作(第二个函数比第一个函数快大约 12%),但是当我将它与 gcc -O3 一起使用时,第二个函数要慢得多(大约 50%)。你知道这是为什么吗? 感谢您的帮助。
第一个函数:
typedef struct {
double *data;
int rows;
int columns;
} Matrix;
Matrix *matrixMultiplication(Matrix *a, Matrix *b) {
if(a->columns != b->rows)
return NULL;
Matrix *matrix = createMatrix(a->rows, b->columns);
set(0, matrix);
for(int i = 0; i < matrix->rows; i++) {
for(int j = 0; j < a->columns; j++) {
for(int k = 0; k < b->columns; k++) {
matrix->data[i * matrix->columns + k] += a->data[i * a->columns + j] * b->data[j * b->columns + k];
}
}
}
return matrix;
}
第二个功能:
typedef struct {
float *data;
unsigned int rows;
unsigned int columns;
} Matrix_2;
unsigned int matrixMultiplication_2(Matrix_2 *a, Matrix_2 *b, Matrix_2 **c) {
Matrix_2 *matrix;
if(a->columns != b->rows)
return 0;
createMatrix_2(a->rows, b->columns, &matrix);
set_2(0, matrix);
for(unsigned int i = matrix->rows; i--;) {
for(unsigned int j = a->columns; j--;) {
for(unsigned int k = b->columns; k--;) {
matrix->data[i * matrix->columns + k] += a->data[i * a->columns + j] * b->data[j * b->columns + k];
}
}
}
*c = matrix;
return 1;
}
【问题讨论】:
-
如果您想比较两种不同算法的相同功能,请确保使用相同的数据和数据结构。否则比较是没有意义的。
-
我将它用于相同的数据,但我更改了数据结构,因为我读过我应该尽可能使用浮点数和无符号整数
-
@PatrikDobiáš 由于您使用浮点数作为一个,双数作为另一个,因此您没有使用相同的数据。
-
@你应该使用正确的类型。例如,对于索引和大小,您有
size_t。在现代系统上,使用浮点数可能会受到惩罚,因为它们可能必须转换为双精度甚至更宽的类型。 -
尺寸有多大?
标签: c for-loop optimization