How fast is mbed Digital Out
SIDE QUESTION: I'll be using the output with a DAC to produce an analog signal. Will I need to use a buffer in between, or are the pins guaranteed to output simultaneously?  


You don't need a buffer in between, if you update all bits with just a single write to the special memory location (also known as register) controlling that I/O port.  

The code in your question would not write all bits at the same time, but this will:  

void sendByte(char value)
{ 
    uint32_t temp = DataPort;
    //clear the pins connected to D0..D7
    temp &amp;= ~((1 &lt;&lt; LCD_D0)
            | (1 &lt;&lt; LCD_D1)
            | (1 &lt;&lt; LCD_D2)
            | (1 &lt;&lt; LCD_D3)
            | (1 &lt;&lt; LCD_D4)
            | (1 &lt;&lt; LCD_D5)
            | (1 &lt;&lt; LCD_D6)
            | (1 &lt;&lt; LCD_D7));
    //Write the value to the pins
    temp |= (((value &gt;&gt; 0) &amp; 1) &lt;&lt; LCD_D0)
          | (((value &gt;&gt; 1) &amp; 1) &lt;&lt; LCD_D1)
          | (((value &gt;&gt; 2) &amp; 1) &lt;&lt; LCD_D2)
          | (((value &gt;&gt; 3) &amp; 1) &lt;&lt; LCD_D3)
          | (((value &gt;&gt; 4) &amp; 1) &lt;&lt; LCD_D4)
          | (((value &gt;&gt; 5) &amp; 1) &lt;&lt; LCD_D5)
          | (((value &gt;&gt; 6) &amp; 1) &lt;&lt; LCD_D6)
          | (((value &gt;&gt; 7) &amp; 1) &lt;&lt; LCD_D7);
    //apply the new value to the I/O register. All pins are updated at once.
    DataPort = temp;
}  


You could also make the code more efficient by connecting the data lines to I/O pins that are mapped to sequential bits in the I/O port registers (e.g. D0 to PORT_A_3, D1 to PORT_A_4 ... D7 to PORT_A_10)  

Then you could simplify that function to just

#define LCD_D0 3
void sendByte(char value)
{ 
    DataPort = (DataPort &amp; ~(0xFF &lt;&lt; LCD_D0)) | (value &amp; 0xFF) &lt;&lt; LCD_D0);
}  




When it comes to the overhead MBED, I have no idea.