ffileppo wrote: >>> oprofile is your friend. If you can get oprofile working on your >>> target system, please use it and find out if it does what you need. >> I did it. The answer is appended. >> >> The problem is that the program is spending almost all of the time >> generating stack traces, millions and millions of them. >> > Hi Andrew, > thanks a lot for your help. > > Do you have any ideas to fix this problem? 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. Andrew. Index: classpath/include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h =================================================================== --- classpath/include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h (revision 141430) +++ classpath/include/gnu_java_awt_peer_gtk_FreetypeGlyphVector.h (working copy) @@ -13,7 +13,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_dispose (JNIEnv *env, jobject, jlongArray); JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getNativeFontPointer (JNIEnv *env, jobject, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getGlyphs (JNIEnv *env, jobject, jintArray, jintArray, jlongArray); -JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getKerning (JNIEnv *env, jobject, jint, jint, jlong); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getKerning (JNIEnv *env, jobject, jint, jint, jlong, jfloatArray); JNIEXPORT jdoubleArray JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getMetricsNative (JNIEnv *env, jobject, jint, jlong); JNIEXPORT jobject JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getGlyphOutlineNative (JNIEnv *env, jobject, jint, jlong); Index: classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c =================================================================== --- classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c (revision 141430) +++ classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_FreetypeGlyphVector.c (working copy) @@ -169,9 +169,10 @@ (*env)->ReleaseLongArrayElements (env, fonts, fontArray, 0); } -JNIEXPORT jobject JNICALL +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_FreetypeGlyphVector_getKerning -(JNIEnv *env, jobject obj __attribute__((unused)), jint rightGlyph, jint leftGlyph, jlong fnt) +(JNIEnv *env, jobject obj __attribute__((unused)), jint rightGlyph, jint leftGlyph, + jlong fnt, jfloatArray p) { FT_Face ft_face; FT_Vector kern; @@ -187,12 +188,10 @@ pango_fc_font_unlock_face( font ); - values[0].d = (jdouble)kern.x/64.0; - values[1].d = (jdouble)kern.y/64.0; - - cls = (*env)->FindClass (env, "java/awt/geom/Point2D$Double"); - method = (*env)->GetMethodID (env, cls, "<init>", "(DD)V"); - return (*env)->NewObjectA(env, cls, method, values); + jfloat *pelements = (*env)->GetPrimitiveArrayCritical(env, p, NULL); + pelements[0] = (jfloat)kern.x/64.0; + pelements[1] = (jfloat)kern.y/64.0; + (*env)->ReleasePrimitiveArrayCritical (env, p, pelements, 0); } JNIEXPORT jdoubleArray JNICALL Index: classpath/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java =================================================================== --- classpath/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java (revision 141430) +++ classpath/gnu/java/awt/peer/gtk/FreetypeGlyphVector.java (working copy) @@ -247,7 +247,7 @@ /** * Returns the kerning of a glyph pair */ - private native Point2D getKerning(int leftGlyph, int rightGlyph, long font); + private native void getKerning(int leftGlyph, int rightGlyph, long font, float[] p); private native double[] getMetricsNative(int glyphCode, long font); @@ -301,6 +301,7 @@ GlyphMetrics gm = null; float x = 0; float y = 0; + float[] p = {0.0f, 0.0f}; for(int i = 0; i < nGlyphs; i++) { gm = getGlyphMetrics( i ); @@ -314,9 +315,9 @@ // using the same font if (i != nGlyphs-1 && fontSet[i] == fontSet[i+1]) { - Point2D p = getKerning(glyphCodes[i], glyphCodes[i + 1], fontSet[i]); - x += p.getX(); - y += p.getY(); + getKerning(glyphCodes[i], glyphCodes[i + 1], fontSet[i], p); + x += p[0]; + y += p[1]; } } glyphPositions[nGlyphs * 2] = x;