Ben kullandım. Bir de programa komut satırından eklenen '‑‑DRT‑gcopt=profile:1' seçeneği var. Ama bunlar bellek sızıntısını göstermiyorlar; çöp toplayıcıyla ilgili istatistikler gösteriyorlar. Birisi çıktıya yazıyor; diğeri dosyaya yazıyor. (İkisini de dene; farklı bilgi veriyorlar.)
Eğer zaten öyle değilse, programını 64 bitlik derlemeyi deneyebilirsin. Öyle yapınca, tamsayıların yanlışlıkla bellek adresi gibi algılanma olasılığı çok çok azalıyor. (Tabii eğer sorun bununla ilgiliyse.)
Bir de, bellek sürekli artıyorsa evet, sızıntı var demektir. Ama arttıktan sonra bir noktada duruyorsa sorun yok demektir. :)
Senin soruna yanıt veremiyorum ama performansla ilgili olarak da bellek ayırmayı olabildiğince üst düzeylerde yapmak gerek. Örneğin, çok kullanılan bir işlevde (örneğin yukarıdaki profile çıktılarının gösterdiği bir işlevde), şunun yerine:
void foo() {
while (durum) {
int[] dizi;
while (başkaDurum) {
dizi ~= eklenen;
// ...
}
}
}
Şunu yeğlemek çok büyük yarar getirebiliyor:
void foo() {
int[] dizi; // Dizi dışarı alındı
while (durum) {
dizi.length = 0; // Her döngüde daha önce ayrılmış olan dizi alanı tekrar kullanılır
while (başkaDurum) {
dizi ~= eklenen;
// ...
}
}
}
Hatta, daha ileri gidip diziyi foo()'nun static değişkeni yapınca foo()'nun her çağrılışı daha önceki çağrılarda kullanılan aynı diziyi kullanmış olacak:
void foo() {
static int[] dizi; // Dizi static oldu
while (durum) {
dizi.length = 0; // Her döngüde daha önce ayrılmış olan dizi alanı tekrar kullanılır
while (başkaDurum) {
dizi ~= eklenen;
// ...
}
}
}
Ben bunu Appender ile kullanmıştım. O zaman .length=0 yerine .clear() kullanılıyor.
Ek olarak, static değişkenler C++ gibi dillerde multithread sorununa neden olabilirler ama D'de thread-local olduklarından sorun olmuyor: her thread'in foo() işletirken kendi 'dizi'si oluyor. (Dikkat: Yine de, static değişken işlevi non-reentrant yapar. Yani foo()'nun başka işlevi çağırması ve o işlevin dolaylı da olsa foo()'yu tekrar çağırması ilk girilmiş olan foo()'nun da kullanmakta olduğu aynı 'dizi'yi temizleyecektir.)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]