性能分析
首版性能分析sudoku1.0
对首版的sudoku1.0进行性能测试:
问题
发现在生成1000000个数独的情况下,生成的时间效率不高,尤其是使用dfs填入数字的时候.在查阅相关资料,发现了重大的算法实现问题.根据原来的算法,在基础一位数组的首位数字固定的情况下.使用这种算法,只能得到8!=40320个不重复的数独终局远小于1000000个.因此对CreateSudokuN函数及其内部的dfs函数进行重写.
解决方案
修改思路:在8!个数独的基础上进行行交换,在1个数独的基础上得到另外不同72个数独.
第一次改进后性能分析
这次的代码是正确的满足1000000个不重复数独的要求,但是花费时间还是很长24.935,只减少了2+秒.
问题
他的写文件fprint函数占用了86.96%的CUP.
查看网络上其他人的优化,发现是每一创建完新的数独就往文件里写入,会浪费很长的时间.
解决方案
于是决定将100万个数独矩阵先存入一个string变量中,最后在一次性写入文件.每个数独生成一个string,不断的合并入最终的写入string.
第二次改进后性能分析
发现这种方法有明显的改善,时间减少了58%.
问题
但是查看发现在GetArrystring中字符串string合并每一个数独,浪费了72.79%的时间
解决方案
将100万个矩阵存入一个char数组中,最后将这个char数组写入文件.
第三次改进后生成sudoku1.1性能分析
时间降到了6.164秒
问题
查看发现在现在fprintf已经降到了26.38%,这是占主要CPU的是Perm函数中生成基础数独的dfs,这我暂时无法优化.