The main problem is that the GTextArea control was never designed to handle large volumes of test. It is more like a textfield that can display a few lines of text than a “console type window”.
In G4P V3 I completely rewrote how the library rendered text. This enabled part or all the text (used in any G4P control) to be styled e.g. bold, italic etc. Additionally it meant that text area controls supported different text alignments e.g. left, center, right, justified.
This does mean that text rendering is more CPU intensive but this is partly mitigated because G4P uses double buffering for its controls.
So in your program you adding at least 3-5 lines of text every second. As each line of text is appended the control has to recalculates ALL the text in the control even though most of it will not be shown.
One solution is to limit the number of messages stored in the textarea by removing the oldest messages when a user defined limit is exceeded.
The sketch below shows my way of doing this, it can easily be modified to suit most purposes. It adds a message every frame and on my computer it slowed the frame rate to ~25 fps but this should be the worst case scenario unless you increase the buffer limit. Feel free to experiment.
The code should be self explanatory but if you have questions feel free to ask. 
/*
Demonstrates the use of a buffer to limit the amount of text displayed by
a GTextArea control
created by Quark 6th Aug 2025
*/
import g4p_controls.*;
GTextArea gta;
GtaBuffer gtab;
GLabel instr, bsize;
boolean add_messages = true;
int cnt = 0;
void setup() {
size(640, 480);
instr = new GLabel(this, 40, 40, 560, 20);
instr.setText("S key toggles start / stop messages.");
bsize = new GLabel(this, 40, 80, 560, 20);
gta = new GTextArea(this, 40, 120, 560, 200);
gtab = new GtaBuffer(gta, 100);
}
void keyReleased() {
if (key == 's')add_messages = !add_messages;
}
void draw() {
background(200, 255, 192);
bsize.setText("Buffer size "+ gtab.size());
if (add_messages)
gtab.append("Quark added '" + cnt++ +"' this at " + millis() + " ms");
}
// Text buffer for a specified GTextArea control
class GtaBuffer {
ArrayList<String> buffer = new ArrayList<String>();
GTextArea area;
int limit;
GtaBuffer(GTextArea area, int limit) {
this.area = area;
this.limit = limit;
}
// Append a new message to the textarea
void append(String msg) {
buffer.add(msg);
// Remove old messages if the buffer limit is exceeded
while (buffer.size() > limit) buffer.remove(0);
// get buffer as an array and use it to set the display text
area.setText(buffer.toArray(new String[buffer.size()]));
}
// number of messages stored
int size() {
return buffer.size();
}
}