[已解决]数组 基础观念与想法与内存占用量的问题....
本帖最后由 kk_lee69 于 2013-6-24 22:58 编辑請教一下 各位高手......
假設已經有一個資料來源放入 數組叫做 $A 占用記憶體 大約 10K 好了
這時候 下一個 語法
$B=$A
這時候 會變成 兩個完全獨立的 數組嗎??還是 這兩個數組會有相關???
而此時的記憶體是會變成$A 10K 跟$B10K還是$A+$B< 20K
$B=$A這樣子的語法是不是 等同我的 $B 直接 從資料來源重新取得 是一樣的意思呢??
有差異性嗎??
補充一下:
剛剛測試 6萬筆的 2D 數組
原本程式 運行 佔用記憶體 23328
$A 加上 6萬筆資料後佔用記憶體 64772
把 $B=$A 之後 佔用記憶體 64780
設定 $A=0之後記憶體一樣佔用 64780
在設定 $B=0 之後 記憶體佔用 25450 我的感觉是,$A和$B没有关系,可以相互独立,可以把一个数组$A赋到另一个数组$B,然后把原来的$A清空,然后再显示一下$B看看是不是正常。
内存占用就不得而知了。 回复 2# haijie1223
有實驗過清空$A 之後 $B 依舊運作正常......
但是內存的占用 看起來是 $A+$B< 20K但是想不通的是
如果一個 數組 $A要占用10K 這時候放另外一個一樣的數組 理論上也要占用10K 為何 會變少.....???
因為變少 讓我懷疑 這兩個是不是獨立的....... 内存占用,你是如何测试的? 查查基址看看 貌似Au本身有内存优化机制?
; 基础占用
Local $MEM = ProcessGetStats()
MsgBox(0, 0, $MEM)
Local $a = FileRead('c:\windows\explorer.exe')
MsgBox(0, 1, ProcessGetStats() - $MEM)
Local $b = $a
MsgBox(0, 2, ProcessGetStats() - $MEM)
Local $b = FileRead('c:\windows\explorer.exe')
MsgBox(0, 3, ProcessGetStats() - $MEM)
Exit
2 和 3 明显相差很多而1和2相差很少 回复 6# Qokelate
ProcessGetStats 是获取该进程的内存占用状态,你这里的三个不同的值只能说明是该进程运行到当前的内存占用状态,和程序内的数组没有什么太大关系。 回复 7# haijie1223
不好意思 我的測試法 的確是 目前內存占用量.....
先測 未載入 數組 時的 內存占用在測試載入 $A 的內存占用 看看增加多少 在測試 $B=$A 之後的內存占用量
不是實際 測試 光$A 占用的內存 C++有直接获取地址的操作符&,还有sizeof判断大小。au3就不知道如何操作,不过我觉得ProcessGetStats是获取进程的瞬时占用,不是程序里面某个数组的,我个人认为,有待验证。 回复 9# haijie1223
当代码足够稳定的时候,EXE本身占用的内存就是一个相对定值,两者之差即可理解为变量本身占用的内存 又或者理解为
不赋值任何变量,取得自身内存占用A(即A那一瞬间的快照)
赋值变量后取得内存占用B, (B即为那一瞬间的快照)
两者快照之差即为变量占用的内存(变量占用的空间越大越明显) 本帖最后由 kk_lee69 于 2013-5-13 22:47 编辑
回复 11# Qokelate
補充一下:
剛剛測試 6萬筆的 2D 數組
原本程式 運行 佔用記憶體 23328
$A 加上 6萬筆資料後佔用記憶體 64772
把 $B=$A 之後 佔用記憶體 64780
設定 $A=0之後記憶體一樣佔用 64780
在設定 $B=0 之後 記憶體佔用 25450
看來似乎 $A 與 $B 會共用一個 位置的資料 而當 $A 或者 $B 其中一個消失的時候並不會影響 這個記憶體的佔用
必須要兩個同時消失才會被釋放出來..... auto好像自身没有释放内存的机制 回复 12# kk_lee69
这正是我所说的内存优化机制,目前得到的结论是这样
若赋值语句 $A=$B 则$A与$B共用一块内存但若其中任何一个变化,后来改变的会重新申请内存
Local $a=123 ; $a 申请了一块内存
Local $b=$a ; 因为$a和$b完全一样,所以共同一块内存
Local $a=123 ; $a被重新赋值,而且值是一个实体(非变量),所以$a会重新申请一块内存,而原来的内存继续提供给$b
Local $c=$b ; 同理,$c和$b共同一块内存
回复 13# netegg
释放机制和优化机制是两码事
Local $a=123; 申请一块内存,假设是3个字节
$a=0 ; $a重新申请一块内存,可能是一个字节,同时由于原来的3个字节的内存占用无人认领,默认会被系统回收处理
准确来说,Au3的内存释放机制应该是依赖于系统的回收机制
页:
[1]