Open ejmoog opened 1 year ago
不错。可以再继续改改其他的,我估计23点左右再开始对比合并代码。
今天发的新版本都还没开始处理。
今天发的新版本都还没开始处理。
都整在這個裏面了。
master的那個,我改了池的大小是100000,然後電腦就卡住了,一動不動。
最後返回時用了140540 ms, 警告超出池大小,考慮增加到27908770 bytes!
應該不用這麼多的,我寫的那個只用到「1<<24」個指針地址。
所以我現在不敢跑master那個了,可能要總結一下你的優化點,然後逐個裝上去。
現在記得的優化點是:
後面我將打算不用bcpos.txt,而是手動輸入起始局面,你覺的如何?
文件读入最好也支持,方便自动化测试。
检查到没有文件,就手动录入,如果有,就读文件中的局面。
不知道给position申请内存和哈希表有啥关系。哈希表是用来存储评估值的,一次性分配出来,而没有加入对象池之前,巨量的position是从堆中一个一个零碎地申请的。所以两者用的是不同的内存区域吧。现在是每调用一次new就累加一次count来统计对象池所需大小。所以实际上代码就是需要申请那么多次的。对象池的作用就是一次性分配一大块内存,以后new position的时候都只能从池中分配,而不是临时再向操作系统申请内存。之前提到过c从操作系统每次申请内存的开销是很大的。
优化点不止你提到的2个。可以 git log 一个个看。每个提交我尽量做到了原子化,且提交中记录了优化效果,即尽量是一个提交只做一个优化点,只解决一个问题。我一般不会把几个优化点合并在一起提交,因为合并一起提交这样就不方便 Debug 判断是什么优化引入的问题,也不方便了解单个优化涉及哪些修改。
不知道给position申请内存和哈希表有啥关系。哈希表是用来存储评估值的,一次性分配出来,而没有加入对象池之前,巨量的position是从堆中一个一个零碎地申请的。所以两者用的是不同的内存区域吧。
據我對c++的了解,在函數內的new Position(),當到達return時,即便沒有delete,也會自動清理?
roll_sum應該等於整個最後留存的Positon數量,因為相同的話,就不滾入roll,而是直接從map中取一個。而每一個新的position都會在進入roll時置入map中。
所以map大小要稍大於最後需要 的Position對象數量,roll_sum應該精準的等同於最終需要的數量。
以上是我的理解。
並且,如果真有這麼多,我的電腦早就同樣的卡在那裏了。
优化点不止你提到的2个。可以 git log 一个个看。每个提交我尽量做到了原子化,且提交中记录了优化效果,即尽量是一个提交只做一个优化点,只解决一个问题。我一般不会把几个优化点合并在一起提交,因为合并一起提交这样就不方便 Debug 判断是什么优化引入的问题,也不方便了解单个优化涉及哪些修改。
我對git log等操作還不熟,目前只能在網頁上看。
因為記得有過一次是對像池的vector換成stack,所以不知道「原子化」是否包括那次的更新?
在網頁上是否有個地址能清晰的按1.2.3.列表展示你的優化點?
是的,在 C++ 中,如果您在函数内使用 new 分配了动态内存,即使您在函数的最后没有显式调用 delete 来释放该内存,编译器也会在函数结束时自动释放它。
这是因为在函数内部使用 new 进行内存分配时,该内存被视为自动存储类别(automatic storage class),也称为栈上内存。当函数返回时,该内存会自动被销毁并释放。
然而,如果您在函数内使用 new 分配了动态内存,并将指针传递到其他函数或存储在全局变量中,您需要手动调用 delete 来释放该内存,否则将会导致内存泄漏。
https://ejsoon.win/wp-content/uploads/2023/03/chaosclock3_point.cpp 是基于 https://github.com/calcitem/chaosclock/commits/master 历史上的的哪个版本基础上修改的呢?还是说我之后的修改是也取了部分合进去了?如果是部分合,选取了那几个提交合入的?
https://ejsoon.win/wp-content/uploads/2023/03/chaosclock3_point.cpp 是基于 https://github.com/calcitem/chaosclock/commits/master 历史上的的哪个版本基础上修改的呢?还是说我之后的修改是也取了部分合进去了?如果是部分合,选取了那几个提交合入的?
並沒有合並,我還是在我原來代碼的基礎上寫,少部份吸收了你的優化。
我目前是想分成兩個文件,一個是chaosclock3.cpp,一個是point.cpp。
等我總結了你的優化點後,就吸收進point.cpp。算法部份更新之後,也寫進3.cpp。
但是這次因為我跑不了3.cpp,所以我只能先提供point.cpp以及改進的部份。
之前的哈希查詢和賦值,都是對一個uint64賦值。其缺點是,棋走不下去。
例如第五頁的局面「9,10,8,1,4,7,11,6,5,3,12,2」,movelist 1 7 5 3之後就沒有選項了,只給一個評分。
現改為vector指針,即
Position getBoardMap(Position pos) void setBoardMap(Position *pos) 也作相應改動。之後再走「1 7 5 3 」,就可以接著走下去,而不是只給個評分。
代碼上傳地址。