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