systemc: avoid dynamic_cast in the critical path
authorEarl Ou <shunhsingou@google.com>
Fri, 11 Sep 2020 01:03:04 +0000 (09:03 +0800)
committerEarl Ou <shunhsingou@google.com>
Tue, 15 Sep 2020 08:22:25 +0000 (08:22 +0000)
NodeList is in the critical path of the systemc scheduler in gem5. A
unnecessary dynamic_cast in the NodeList slow down the event process by
about 15%. Fix the issue by avoiding dynamic_cast.

We see about 15% speed improvement on the example provided by Matthias Jung:
https://gist.github.com/myzinsky/557200aa04556de44a317e0a10f51840

Compare with Accellera implementation, gem5 version is originally 10x
slower and now it's about 8.5x slower.

Change-Id: I3b4ddca31e58e1d4e96144a4021b0a5bb956fda4
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/34355
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/systemc/core/list.hh

index b1c5f5521159ac6831461d073e576e12c8a6d39a..6ba28259cd2d388b9c395100a09dacec31b822c1 100644 (file)
@@ -102,8 +102,13 @@ struct NodeList : public ListNode
         prevListNode = t;
     }
 
-    T *getNext() { return dynamic_cast<T *>(nextListNode); }
-    bool empty() { return getNext() == nullptr; }
+    T *
+    getNext()
+    {
+        return empty() ? nullptr : static_cast<T *>(nextListNode);
+    }
+
+    bool empty() { return nextListNode == this; }
 };
 
 } // namespace sc_gem5