> >> Here's one improvement. If you can get rid of the places in the GTK peers > >> where class and method lookups are performed at runtime you'll probably > >> have a fix. This shouldn't be a massive amount of work, just rather > >> boring. > >> > >> In gcj, > >> > >> * Compiled java code is quite fast. > >> * Class lookup by name is slow. > >> * Calling JNI code from compiled java code is quite fast. > >> * Calling compiled java code from JNI code is slow. > >> * Exceptions are slow. > > > I'm testing your patch on my embedded system and now I can see that GUI performance are very much better (particularly during application startup). > > > > Thank you so much! > > > > However running my test case (please see my first post) I see that CPU usage is always at 100% (after the application is running), > > so the responsiveness is still not very good. > > What do you expect? You're setting up a Timer with a delay of > 0 milliseconds between events, and it's running continuously. > > Andrew. > You're right. However I'm experiencing slowness when testing some other GUI sample application (e.g. the test case attached at the end). In this particular test case, the application takes a lot of time to startup (compared to the same device, running WinCE and CrEme JVM) and during start up the CPU usage is always at 100%. After startup, I'v also noticed that highlighting and/or clicking a certain number of times on buttons cause the application to hang and after that the CPU usage is always 100%. I'm still trying to get oprofile working on my target device to see what's going wrong. Thank you, Francesco Test case: import javax.swing.JComponent; import javax.swing.JFrame; import java.awt.BorderLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JTabbedPane; public class GUITest { public static void main(String[] args) { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JComponent newContentPane = new TestUI(); frame.setTitle("TestUI"); newContentPane.setOpaque(true); frame.setContentPane(newContentPane); frame.setBounds(10, 10, 500, 400); frame.setVisible(true); } static class TestUI extends JPanel { long startTime; JPanel createPanel(int start) { JPanel p = new JPanel(); p.setLayout(null); for (int i=0; i<100; i++) { JButton ltit = new JButton("Variable "+(i+start)+": "); long val = System.currentTimeMillis() - startTime; JButton lval = new JButton(""+val); ltit.setBounds(5, 10+20*i, 150, 15); lval.setBounds(200, 10+20*i, 150, 15); p.add(ltit); p.add(lval); } return p; } TestUI() { super(new BorderLayout()); startTime = System.currentTimeMillis(); JTabbedPane p = new JTabbedPane(); for (int i=0; i<10; i++) { JPanel page1 = createPanel(i*100+1); p.add("P"+i, page1); } add(p, BorderLayout.CENTER); } } }