Нет возможности сделать быстрее - значит ее нет.
Железо довольно приличное: 520МГц arm. А написанный код практически всегда можно оптимизировать
Проблема скорее всего в том, как вы все рисуете.
Но самая закавыка в том, что возможно у вас громоздкое рисование, или плохо оптимизированное.
Отрисовка действительно громоздкая, но только в части расчета осей (которая вызывается редко). Реализовано там все на 2 функциях: drawLine и drawText. Плюс определенное количество алгебраических вычислений, чтобы циферки на осях были круглые и текст стоял рядом. В отрисовке самого графика setClipRect для установки границы линий графика, евклидово преобразование точек из физической величины в пиксели на экране и drawLine в цикле. Простейший минимум, без которого не обойтись.
А в чём проблема то? вызывайте update с нужными вам координатами и отрисовывайте только обновившуюся область, там все данные для этого есть, в paintEvent.
Проблема была в непонимании, что именно запихнуть в paintEvent для того, чтобы потом вызывать update или repaint не для всего виджита, а для его части. Ну не совать же туда все расчеты и выводы drawLine+drawText. Ответом оказалось, что туда надо поместить вывод на экран буфера на базе QPixmap, и вызов update/repaint с параметрами зоны перерисовки прекрасно понимает, что не надо рисовать весь виджит заново.
В итоге описанный вызов перерисовки изменил ситуацию полностью - среднее время отрисовки стало меньше в 10 раз. И потратить на расчет+вывод новых значений 5ms как-то совсем не жалко. Резюмируя, вся загвоздка была не в рисовании в буфер - там все оказалось неплохо, а непосредственно в выводе этого буфера на экран.
Благодарю всех отписавшихся.