我有一个用 C 语言编写的通用问题求解器,它采用一组值并就地求解。该问题作为固定大小的数组接收,然后传递给求解函数。当切换到使用指针而不是固定大小的数组时,我遇到了一个奇怪的性能问题。
设置代码如下:
int main() {
int board[256];
...
int *board2 = malloc(sizeof(int) * 256);
memcpy(board2, board, 256);
int result = solve_board(___);
}
我已经测试了以下声明和调用(没有关于程序更改的其他内容):
// type 1 - fixed-size array
int solve_board(int board[256]);
solve_board(board); // 1.167 seconds
solve_board(board2); // 3.760 seconds
// type 2 - pointer
int solve_board(int *board);
solve_board(board); // 1.173 seconds
solve_board(board2); // 3.529 seconds
solve_board
是部分递归的,因此在执行期间会进行大量调用。所有情况下的结果都是准确的。
谁能解释为什么使用动态数组比传递固定大小的数组花费的时间长得多?
最佳答案
很有可能是这个问题:
memcpy(board2, board, 256);
这会将 256 个字节,而不是整数,从一个数组复制到另一个数组。你可能是说:
memcpy(board2, board, 256 * sizeof(int));
所以您的两个测试用例没有在相同的数据上运行。 board2
的剩余 (256 * (sizeof(int) - 1)) 个字节未初始化并且具有垃圾(= 未定义)值。
关于C 数组/指针参数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21993932/