我有一个用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
是部分递归的,因此在执行期间会进行大量调用。结果对所有病例都是准确的。
有人可以解释为什么使用动态数组比传递固定大小的数组需要更长的时间吗?
答案 0 :(得分:7)
这很可能是问题所在:
memcpy(board2, board, 256);
将256个字节,而不是 ints 从一个阵列复制到另一个阵列。你可能意味着:
memcpy(board2, board, 256 * sizeof(int));
所以你的两个测试用例没有在相同的数据上运行。 board2
的剩余(256 *(sizeof(int) - 1))字节未初始化且具有垃圾(=未定义)值。