如果文本中有阿拉伯语或波斯语字母,则通过字体测量计算的字符串宽度非常慢
我有一个问题。如果我在那里使用东方语言,我的应用程序界面工作得要慢得多。特别是我在JList,JCombobox,JTable等组件中感受到了它。
我如何发现FontMetrics.stringWidth方法的性能非常慢(500 +次),如果在文本中至少有一个字母是阿拉伯语或波斯语。我怎么知道它是各种摆动组件中常用的方法。
有没有办法提高这种方法的性能?
下面是演示该问题的示例类:
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;
}
}
对我来说,它给出了下一个输出:
波斯语的计算时间: 5482 ms
英语的计算时间: 11 ms