Open calcitem opened 1 year ago
除了#22之外,還有一個,把board_map的uint64_t換成vector指針(注釋的那個,第72行)。
現在這個children.clear,把它注釋掉,看看是否結果仍相同?
因為每一個進到roll的都應該children是空的。
VS 性能分析器可能出问题了,发现注释后,就跑到下一句
max_depth = max(depth, (int8_t)max_depth);
占用 100% 了。太奇怪了。
我将改换 gprof 跑一下看看。
初步看来应该是和 VC 的 Debug 模式下卡在 getBoardMap 死循环有关。Release 模式正常。但是性能分析需要在 Debug 下运行。因此,我将再 Debug 看看是跑到哪里存在差异。一般 Debug 在申请内存后,不会清零,而是设置 0xbebebebebe 之类的固定魔数进去,可能会影响运行结果。
初步看来应该是和 VC 的 Debug 模式下卡在 getBoardMap 死循环有关。Release 模式正常。但是性能分析需要在 Debug 下运行。因此,我将再 Debug 看看是跑到哪里存在差异。一般 Debug 在申请内存后,不会清零,而是设置 0xbebebebebe 之类的固定魔数进去,可能会影响运行结果。
隨機數寫死後,現在還有死循環嗎?
是的,原来是用 VC Release 模式,随机数写死就不死循环了,以为都 OK 了,不过现在切换到 Debug 模式就又死循环了,正在打印一些数据进行对比。
已解决,原因和内存未初始化有关。https://github.com/calcitem/chaosclock/commit/ac8c9f604346b2f23d2af792a649afdff4ec94dc
稍后继续进行性能测试。
如下为性能分析结果,百分比越高的,占用时间越多,就越是优化的大头。
(为基于 https://github.com/calcitem/chaosclock/commit/ac8c9f604346b2f23d2af792a649afdff4ec94dc 这版代码分析。)
那三個隨機數應該加const…
将 STL 的 vector 去除后缩短了 1/3 耗时。(Debug 模式下有缩短, Release 不明显,因为 Debug 有更多的安全检查)
https://github.com/calcitem/chaosclock/blob/master/chaosclock3.cpp
将循环变量由 uint8_t 类型改为 int 类型提升性能 14%。iob 函数占 CPU 的总时间比例由 31% 下降到 24%。
https://github.com/calcitem/chaosclock/commit/30a2c93ed15b32a28f13e42d7d24a83c97152b3f
基于 8b72077b5e52090adbe1c100504eabe3ec1dcfda 进行性能分析,结果如下图:
V3 版本已经实现哈希表,解决了性能的大头,那么接下来优化什么呢?
基于 8a00c04481e2a983d7cd09691778c58a81999949 进行 VS 性能分析,发现几乎 100% 的耗时都在
pos->children.clear();
这个函数上。因此,如果将内存的分配和释放进一步减少,那么效率预计将还会大幅提升。