A largura da string via cálculo de fontmetrics é muito lenta se houver letras em árabe ou persa no texto

Eu tenho um problema. Minha interface de aplicativo funciona muito mais lentamente se eu usar idiomas orientais lá. Especialmente eu senti isso em componentes como JList, JCombobox, JTable.

Como eu encontrei o desempenho do método FontMetrics.stringWidth é muito lento (mais de 500 vezes) se no texto pelo menos uma letra é árabe ou persa. Como eu sei que é um método comumente usado em vários componentes de giro.

Existe uma maneira de aumentar o desempenho desse método?

Aqui está o exemplo de classe que demonstra o problema:

import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

public class FontMetricsSpeedTest
{

 public static void main( String args[] ) {
  String persian="صصصصصصصصصصصصصصصصصصصصص";
  String english="abcde()agjklj;lkjelwk";
  FontMetrics fm=createFontMetrics(new Font("dialog",Font.PLAIN,12));
  int size=50000;
  long start=System.currentTimeMillis();
  for(int i=0;i<size;i++)
  {
   fm.stringWidth(persian);
  }
  System.out.println("Calculation time for persian: "+(System.currentTimeMillis()-start)+" ms");
  start=System.currentTimeMillis();
  for(int i=0;i<size;i++)
  {
   fm.stringWidth(english);
  }
  System.out.println("Calculation time for english: "+(System.currentTimeMillis()-start)+" ms");
 }
 private static FontMetrics createFontMetrics(Font font)
 {
  BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
  Graphics g = bi.getGraphics();
  FontMetrics fm = g.getFontMetrics(font);
  g.dispose();
  bi = null;
  return fm;
 }
}

Para mim, dá a próxima saída:

Tempo de cálculo para persa: 5482 ms

Tempo de cálculo para o inglês: 11 ms

questionAnswers(4)

yourAnswerToTheQuestion