v16R6:collectionの検索を試してみました

オブジェクト配列とcollectionで検索する速度を比較してみました。

■オブジェクト配列のバージョン
_Find_in_ARRYA OBJECTメソッドは、配列をforループで回して探している処理です。
<code 4D>
ARRAY OBJECT($test_ao;0)
For ($loop_l;1;2000000)
APPEND TO ARRAY($test_ao;New object(“name”;“osaka”;“id”;Generate UUID;“timestamp”;Timestamp))
End for
OB SET($test_ao{1901000};“name”;“tokyo”)

$st_l:=Tickcount
$pos_l:=_Find_in_ARRYA OBJECT (->$test_ao;"name";"tokyo")
$ed_l:=Tickcount
$exec_time_l:=$ed_l-$st_l
ALERT("work time : "+String($exec_time_l)+" Tick pos : "+String($pos_l))

</code 4D>

■コレクションのバージョン
<code 4D>
C_COLLECTION($test_c)
$test_c:=New collection
For ($loop_l;1;2000000)
$test_c[$loop_l-1]:=New object(“name”;“osaka”;“id”;Generate UUID;“timestamp”;Timestamp))
End for
$test_c[1901000].name:=“tokyo”

$st_l:=Tickcount
$pos_c:=$test_c.indices("name = :1";"tokyo")
$ed_l:=Tickcount
$exec_time_l:=$ed_l-$st_l
ALERT(New collection("work time : ";$exec_time_l;" Tick pos : ";$pos_c).join(""))

</code 4D>

コレクションの検索関数を使う方が圧倒的に早かったです。
これは使うしかないですね。 :razz:

ただ、アクティビティモニタでメモリサイズを確認しばがら数回試行したのですが、
一応実行プロセス終了後、数秒たってからこの大きなcollectionを解放している様なのですが、
解放後のサイズが2〜3Mづつ大きくなっていました。メモリリークでしょうか?

情報ありがとうございます。

プロセスやウィンドウのメモリもありますし,ガーベージコレクションは10分毎なので,
アクティビティモニターやランタイムエクスプローラー等に表示されるメモリだけでは,
リークと断定できないかもしれません。

http://doc.4d.com/4Dv16R4/4D/16-R4/FLUSH-CACHE.301-3318257.ja.htmlFLUSH CACHE(*)>後のhttp://doc.4d.com/4Dv16R4/4D/16-R4/GET-MEMORY-STATISTICS.301-3318258.ja.html残量>が増えていれば別ですが・・・

: Keisuke MIYAKO

情報ありがとうございます。

プロセスやウィンドウのメモリもありますし,ガーベージコレクションは10分毎なので,
アクティビティモニターやランタイムエクスプローラー等に表示されるメモリだけでは,
リークと断定できないかもしれません。

http://doc.4d.com/4Dv16R4/4D/16-R4/FLUSH-CACHE.301-3318257.ja.htmlFL
SH
CACHE()>後の<http://doc.4d.com/4Dv16R4/4D/16-R4/GET-MEMORY-STATISTICS.3
1-3318258.ja.html>残量>が増えていれば別ですが・・・
ALERTの下にFLUSH CACHE(
)とGET MEMORY STATISTICSを1のパラメータでつけて確認してみました。

1回目
[]22930962;“1回目”[/]
2回目
[]22930963;“2回目”[/]

どこを確認すればよいでしょうか?

usedCacheSize(Cache info.usedMemとおなじ)
FreeMemory
あたりがポイントになるかと思います。

前者はプロセスでindices()を初めて実行したときに増えますが,
その後は安定しているはずです。
また,FLUSH CACHE(*)で元に戻ります。

後者はindices()を実行する事に減ることもありますが,
増えることもあるので,リークではなく,
通常のメモリ管理で起こり得る揺らぎの範囲だと思われます。

サンプル:

[]22931489;“Your comment here…”[/]

http://forums.4d.com/4DBB_Main/x_User/298210/files/22931491.zip

: Keisuke MIYAKO

usedCacheSize(Cache info.usedMemとおなじ)
FreeMemory
あたりがポイントになるかと思います。

前者はプロセスでindices()を初めて実行したときに増えますが,
その後は安定しているはずです。
また,FLUSH CACHE(*)で元に戻ります。

後者はindices()を実行する事に減ることもありますが,
増えることもあるので,リークではなく,
通常のメモリ管理で起こり得る揺らぎの範囲だと思われます。

ご回答ありがとうございます。
そすると今回はメモリリークしていなということですね。

他の場合でもメモリリークが疑わしい場合にはここをみればいいわけですね。参考になります。
ありがとうございます。:pray: