<html><body><div style="color:#000; background-color:#fff; font-family:times new roman, new york, times, serif;font-size:12pt"><div><span>Well, I guess I don't know what I'm doing after all.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><span>I ported my benchmark to C++, and found that C++ overhead for the virtual call was 6 nanos, way slower than&nbsp; the 0.5 nanos I was getting for hotspot.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new
 york,times,serif; background-color: transparent; font-style: normal;"><span>Then I guessed, maybe Clemens is right, hotspot is seeing that Link1 and Link2 are very similar in structure, and even though the iteration thru the list of base types would seem to force a virtual call, hotspot is just turning it into an if-else, and inlining everything else, and the extra 0.5 nanos is simply due to branch mispredict.<br></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><span>So I create 10 variants of my Link class, Link1 thru Link10, and hotspot was about the same as C++, 6 nanos.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new
 roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><span>But that could mean that hotspot was now using a vtable, or it could mean hotspot was paying for 10 branch mispredictions.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><span>So I tried 20 variants of my Link class, Link1 thru Link20, and hotspot was now about 11 nanos.&nbsp; So it would seem that hotspot, for simple variants of a base class doesn't use a vtable at all, but just creates one big if-else
 inline.&nbsp; Whereas C++, even with just 2 variants of the class, always uses a vtable.</span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><br><span></span></div><div style="color: rgb(0, 0, 0); font-size: 16px; font-family: times new roman,new york,times,serif; background-color: transparent; font-style: normal;"><span>If this is true, that itself is very interesting.&nbsp; Any ideas how to write a test that really forces hotspot to use the vtable?<br></span></div><div><br></div>  <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div style="font-family: times new roman, new york, times, serif; font-size: 12pt;"> <div dir="ltr"> <hr size="1">  <font face="Arial" size="2"> <b><span style="font-weight:bold;">From:</span></b> Andy Nuss &lt;andrew_nuss@yahoo.com&gt;<br> <b><span style="font-weight:
 bold;">To:</span></b> hotspot &lt;hotspot-compiler-dev@openjdk.java.net&gt; <br> <b><span style="font-weight: bold;">Sent:</span></b> Saturday, May 18, 2013 5:18 PM<br> <b><span style="font-weight: bold;">Subject:</span></b> Re: vcall wish for hotspot<br> </font> </div> <div class="y_msg_container"><br><div id="yiv5367767623"><div><div style="color:#000;background-color:#fff;font-family:times new roman, new york, times, serif;font-size:12pt;"><div><span>Ok guys.&nbsp; I'll try to get setup with github, and provide both cases for you with latest C++ and latest jdk7, or redact my claim.</span></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;"><br><span></span></div><div style="color:rgb(0, 0, 0);font-size:16px;font-family:times new roman, new york, times, serif;background-color:transparent;font-style:normal;"><span>By the way, there are no branches, as
 you will see from my benchmark.<br></span></div><div><br></div>  <div style="font-family:times new roman, new york, times, serif;font-size:12pt;"> <div style="font-family:times new roman, new york, times, serif;font-size:12pt;"> <div dir="ltr"> <hr size="1">  <font face="Arial" size="2"> <b><span style="font-weight:bold;">From:</span></b> Clemens Eisserer &lt;linuxhippy@gmail.com&gt;<br> <b><span style="font-weight:bold;">To:</span></b> Andy Nuss &lt;andrew_nuss@yahoo.com&gt;; hotspot-dev@openjdk.java.net <br> <b><span style="font-weight:bold;">Sent:</span></b> Saturday, May 18, 2013 4:22 PM<br> <b><span style="font-weight:bold;">Subject:</span></b> Re: vcall wish for hotspot<br> </font> </div> <div class="yiv5367767623y_msg_container"><br>
Hi Andy,<br><br>&gt;&gt; I do know that C++ compilers can emit much much faster vcalls,<br>&gt;&gt; especially when the class is not involving multiple inheritance.<br>&gt; As to how much faster c++ is, I haven't coded in C++ at all in 5 years, and<br>&gt; then it was on a much slower laptop, so I'm not set up to benchmark it.<br><br>You have not benchmarked it, yet claim to "know" C++ compilers emot<br>"much much" faster code for this case?<br><br><br>&gt; Then in two identical warmed up loop functions of 10 billion iterations,<br>&gt; one the iterates and returns the sum of Link get() and one that returns the sum of Link3 get(),<br>&gt; compare the time to execute both.<br>&gt; The difference is about .5 nanos per iteration on my machine.<br><br>The difference you see with your benchmark is not only the pure<br>overhead of bimorphic call logic, but far more important, branch<br>misprediction caused by the alternating branch targets.<br><br>-
 Clemens<br><br><br></div> </div> </div>  </div></div></div><br><br></div> </div> </div>  </div></body></html>