On 7/06/2015 10:16 p.m., Oleg B wrote:
Hello. I want to try use D without GC and I'm not sure what I do all right.
import core.memory;
version( gcdis ) enum gc_disable = true;
else enum gc_disable = false;
class Foo
{
byte[][] buf;
this()
{
foreach( i; 0 .. 32 )
buf ~= new byte[]( 65536 * 16 );
}
~this()
{
static if( gc_disable )
{
// no warning about deprecated 'delete'
foreach( i; 0 .. 32 )
delete buf[i];
delete buf;
}
}
}
void main()
{
static if( gc_disable ) GC.disable();
foreach( i; 0 .. 200 )
scope foo = new Foo;
static if( gc_disable )
{
GC.enable();
GC.collect();
}
}
dmd -version=gcdis test.d && ./test "--DRT-gcopt=profile:1"
Number of collections: 2
Total GC prep time: 0 milliseconds
Total mark time: 0 milliseconds
Total sweep time: 0 milliseconds
Total page recovery time: 0 milliseconds
Max Pause Time: 0 milliseconds
Grand total GC time: 0 milliseconds
GC summary: 51 MB, 2 GC 0 ms, Pauses 0 ms < 0 ms
dmd test.d && ./test "--DRT-gcopt=profile:1"
Number of collections: 205
Total GC prep time: 1 milliseconds
Total mark time: 1 milliseconds
Total sweep time: 5 milliseconds
Total page recovery time: 0 milliseconds
Max Pause Time: 0 milliseconds
Grand total GC time: 8 milliseconds
GC summary: 69 MB, 205 GC 8 ms, Pauses 3 ms < 0 ms
I use this feature correctly?
Don't worry about collecting at the end. The OS will clean up the app no
matter what.
You shouldn't be using delete or new for that matter.
You should be using malloc + free. And emplace.
Also you don't need to enable the GC before telling it to collect.
I can't really help with emplace usage.
But for the record the GC isn't going to slow you down here.
No just reserve some memory and preallocate the buffer you want before
using it. It'll be a lot faster and cheaper.
Concatenation is your real enemy here. Aka realloc.