Кроме того, в нашем случае больше всего времени уходило на пробежки по массивам.
Представьте себе — ~ 100000 раз пройтись раза три: сначала получить данные, потом подгововить конкретно для текущего модуля (100 000 тут становится меньшим числом, но тем не менее),
потом еще раз бегать и рисовать.
В c++ бехавиоре я сократил эту пробежку до 2-х. Т.е. подготавливаю в цикле участок и сразу внутри этого цикла вызываю отрисовку линии.
Какие-то случаи можно сокращать и до 1-го цикла.