Graphics Drivers
The problem is with the tool he's using. It doesn't seem to show the "idle" time when calling the OpenGL method. He's very likely hitting a CPU/GPU stall while the data is uploaded to VRAM.<p>As mentioned by Scott in the comments section of the article, the solution is usually like this (D3D12 has removed dynamic resources for example [0]) :<p><pre><code>  So this means if you glBufferSubData into the same
  address between every drawcall, the opengl driver is
  forced to execute the command then sync before copying
  the new data over the old data, which is really slow.

  What you are meant to do instead is create a buffer
  with glBufferData that is large enough to hold at least
  one frame worth of uniforms. Then use glBufferSubData
  with a **different offset** for each drawcall’s uniforms,
  so they end up next to each other in GPU memory. Treat
  it as a circular buffer.
</code></pre>
[0] <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/dn899125%28v=vs.85%29.aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/windows/desktop/dn8...</a>