Am 09.02.2012, 17:22 Uhr, schrieb dsimcha <dsim...@yahoo.com>:

I wonder how much it helps to just optimize the GC a little. How much does the performance gap close when you use DMD 2.058 beta instead of 2.057? This upcoming release has several new garbage collector optimizations. If the GC is the bottleneck, then it's not surprising that anything that relies heavily on it is slow because D's GC is still fairly naive.

I did some OProfile-ing. The full report is attached, but for simplicity it is without call graph this time. Here is an excerpt:

CPU: Core 2, speed 2001 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask of 0x00 (Unhalted core cycles) count 100000
samples  %        linenr info                 symbol name
13838 18.8416 gcx.d:426 void* gc.gcx.GC.malloc(ulong, uint, ulong*) 4465 6.0795 gcx.d:2454 ulong gc.gcx.Gcx.fullcollect(void*)
...

Compiled with: gcc-Version 4.6.2 20111026 (gdc 0.31 - r751:34491c2e7bb4, using dmd 2.057) (GCC)
CPU: Core 2, speed 2001 MHz (estimated)
Counted CPU_CLK_UNHALTED events (Clock cycles when not halted) with a unit mask 
of 0x00 (Unhalted core cycles) count 100000
samples  %        linenr info                 symbol name
13838    18.8416  gcx.d:426                   void* gc.gcx.GC.malloc(ulong, 
uint, ulong*)
4465      6.0795  gcx.d:2454                  ulong 
gc.gcx.Gcx.fullcollect(void*)
3466      4.7192  lifetime.d:829              _d_newarrayiT
3282      4.4687  concurrency.d:926           void 
std.concurrency.MessageBox.put(ref std.concurrency.Message)
3088      4.2046  concurrency.d:1419          void 
std.concurrency.List!(std.concurrency.Message).List.put(ref 
std.concurrency.List!(std.concurrency.Message).List)
3037      4.1351  concurrency.d:977           bool 
std.concurrency.MessageBox.get!(nothrow @safe void delegate(int), pure @safe 
void delegate(std.concurrency.LinkTerminated), pure @safe void 
delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).get(nothrow @safe void 
delegate(int), pure @safe void delegate(std.concurrency.LinkTerminated), pure 
@safe void delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN))
2624      3.5728  variant.d:235               long 
std.variant.VariantN!(32uL).VariantN.handler!(int).handler(std.variant.VariantN!(32uL).VariantN.OpID,
 ubyte[32]*, void*)
2544      3.4639  gcbits.d:115                void gc.gcbits.GCBits.clear(ulong)
2152      2.9301  object_.d:2417              _d_monitorenter
2011      2.7381  concurrency.d:591           int 
std.concurrency.receiveOnly!(int).receiveOnly()
1712      2.3310  gc.d:205                    gc_qalloc
1695      2.3079  variant.d:253               long 
std.variant.VariantN!(32uL).VariantN.handler!(int).handler(std.variant.VariantN!(32uL).VariantN.OpID,
 ubyte[32]*, void*).bool tryPutting(int*, TypeInfo, void*)
1659      2.2589  concurrency.d:1058          bool 
std.concurrency.MessageBox.get!(nothrow @safe void delegate(int), pure @safe 
void delegate(std.concurrency.LinkTerminated), pure @safe void 
delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).get(nothrow @safe void 
delegate(int), pure @safe void delegate(std.concurrency.LinkTerminated), pure 
@safe void delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).bool scan(ref 
std.concurrency.List!(std.concurrency.Message).List)
1658      2.2575  gcbits.d:104                void gc.gcbits.GCBits.set(ulong)
1487      2.0247  variant.d:499               
std.variant.VariantN!(32uL).VariantN 
std.variant.VariantN!(32uL).VariantN.opAssign!(int).opAssign(int)
1435      1.9539  gcbits.d:92                 ulong gc.gcbits.GCBits.test(ulong)
1405      1.9130  condition.d:230             void 
core.sync.condition.Condition.notify()
1390      1.8926  object_.d:2440              _d_monitorexit
1386      1.8872  concurrency.d:1304          ref @property 
std.concurrency.Message 
std.concurrency.List!(std.concurrency.Message).List.Range.front()
1248      1.6993  object_.d:137               bool object.opEquals(Object, 
Object)
1131      1.5399  concurrency.d:1378          void 
std.concurrency.List!(std.concurrency.Message).List.removeAt(std.concurrency.List!(std.concurrency.Message).List.Range)
998       1.3589  mutex.d:149                 void 
core.sync.mutex.Mutex.unlock()
993       1.3521  gcbits.d:141                ulong 
gc.gcbits.GCBits.testClear(ulong)
920       1.2527  concurrency.d:497           void 
std.concurrency._send!(int)._send(std.concurrency.MsgType, std.concurrency.Tid, 
int)
859       1.1696  concurrency.d:996           bool 
std.concurrency.MessageBox.get!(nothrow @safe void delegate(int), pure @safe 
void delegate(std.concurrency.LinkTerminated), pure @safe void 
delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).get(nothrow @safe void 
delegate(int), pure @safe void delegate(std.concurrency.LinkTerminated), pure 
@safe void delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).bool onStandardMsg(ref 
std.concurrency.Message)
847       1.1533  concurrency.d:146           void 
std.concurrency.Message.map!(nothrow @safe void delegate(int)).map(nothrow 
@safe void delegate(int))
768       1.0457  exception.d:355             pure @safe 
std.concurrency.List!(std.concurrency.Message).List.Node* 
std.exception.enforce!(std.concurrency.List!(std.concurrency.Message).List.Node*,
 "../../../libphobos/std/concurrency.d", 
1306).enforce(std.concurrency.List!(std.concurrency.Message).List.Node*, lazy 
const(char)[])
748       1.0185  variant.d:237               long 
std.variant.VariantN!(32uL).VariantN.handler!(int).handler(std.variant.VariantN!(32uL).VariantN.OpID,
 ubyte[32]*, void*).int* getPtr(void*)
730       0.9940  variant.d:611               @property bool 
std.variant.VariantN!(32uL).VariantN.convertsTo!(int).convertsTo()
667       0.9082  variant.d:651               @property int 
std.variant.VariantN!(32uL).VariantN.get!(int).get()
662       0.9014  concurrency.d:317           void 
std.concurrency.Tid.send!(int).send(int)
620       0.8442  concurrency.d:1102          bool 
std.concurrency.MessageBox.get!(nothrow @safe void delegate(int), pure @safe 
void delegate(std.concurrency.LinkTerminated), pure @safe void 
delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).get(nothrow @safe void 
delegate(int), pure @safe void delegate(std.concurrency.LinkTerminated), pure 
@safe void delegate(std.concurrency.OwnerTerminated), pure @safe void 
delegate(std.variant.VariantN!(32uL).VariantN)).bool pty(ref 
std.concurrency.List!(std.concurrency.Message).List)
588       0.8006  lifetime.d:243              bool 
rt.lifetime.__setArrayAllocLength(ref rt.lifetime.BlkInfo, ulong, bool, ulong)
543       0.7393  object_.d:1014              pure nothrow void[] 
object.TypeInfo_Struct.init()
529       0.7203  concurrency.d:122           @property bool 
std.concurrency.Message.convertsTo!(int).convertsTo()
511       0.6958  concurrency.d:1237          pure bool 
std.concurrency.MessageBox.isControlMsg(ref std.concurrency.Message)
504       0.6862  concurrency.d:595           int 
std.concurrency.receiveOnly!(int).receiveOnly().nothrow @safe void 
__dgliteral14(int)
492       0.6699  concurrency.d:108           std.concurrency.Message 
std.concurrency.Message.__ctor!(int).__ctor(std.concurrency.MsgType, int)
463       0.6304  object_.d:486               pure nothrow @property TypeInfo 
object.TypeInfo_Array.next()
456       0.6209  concurrency.d:1419          @property bool 
std.concurrency.List!(std.concurrency.Message).List.empty()
441       0.6005  exception.d:355             pure @safe bool 
std.exception.enforce!(bool, "../../../libphobos/std/concurrency.d", 
1382).enforce(bool, lazy const(char)[])
426       0.5800  concurrency.d:487           void 
std.concurrency._send!(int)._send(std.concurrency.Tid, int)
417       0.5678  mp.d:19                     void mp.receiver()
382       0.5201  mp.d:5                      _Dmain
319       0.4343  gc.d:200                    gc_malloc
257       0.3499  concurrency.d:1301          const(@property bool function()) 
std.concurrency.List!(std.concurrency.Message).List.Range.empty
236       0.3213  mutex.d:127                 void core.sync.mutex.Mutex.lock()
224       0.3050  object_.d:1009              pure nothrow @property ulong 
object.TypeInfo_Struct.tsize()
178       0.2424  lifetime.d:98               _d_allocmemory
174       0.2369  concurrency.d:1369          
std.concurrency.List!(std.concurrency.Message).List.Range 
std.concurrency.List!(std.concurrency.Message).List.opSlice()
165       0.2247  monitor_.d:250              _d_monitor_lock
161       0.2192  monitor_.d:258              _d_monitor_unlock
133       0.1811  object_.d:1016              pure nothrow @property uint 
object.TypeInfo_Struct.flags()
108       0.1471  mutex.d:0                   ___t.1.1960
93        0.1266  mutex.d:0                   ___t.0.1956
35        0.0477  condition.d:126             void 
core.sync.condition.Condition.wait()
34        0.0463  gcx.d:2270                  void gc.gcx.Gcx.mark(void*, void*)
21        0.0286  gcbits.d:172                ulong 
gc.gcbits.GCBits.testSet(ulong)
12        0.0163  concurrency.d:1225          void 
std.concurrency.MessageBox.updateMsgCount()
6         0.0082  thread.d:2258               thread_suspendAll
3         0.0041  thread.d:517                thread_suspendHandler
2         0.0027  thread.d:2274               extern (C) void 
core.thread.thread_suspendAll().void suspend(core.thread.Thread)
2         0.0027  thread.d:649                thread_resumeHandler
1         0.0014  condition.d:251             void 
core.sync.condition.Condition.notifyAll()
1         0.0014  thread.d:2491               extern (C) void 
core.thread.thread_resumeAll().void resume(core.thread.Thread)
1         0.0014  thread.d:2470               thread_resumeAll
1         0.0014  thread.d:2582               thread_scanAll

Reply via email to